OpenTTCN/Developer corner/Implementing external functions/Modified/Java/PA impl.java
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
PA_impl.java
package extFuncAdapter;
import org.etsi.ttcn.tci.*;
import org.etsi.ttcn.tri.*;
import com.openttcn.sdk.StartHere;
import com.openttcn.sdk.StartHereCD;
import com.openttcn.sdk.TriFactory;
import java.util.Map;
import java.util.HashMap;
public class PA_impl implements org.etsi.ttcn.tri.TriPlatformPA {
/***************************************************************************
* Initialization of TRI interface (PA, user-provided part).
*/
private interface ExtFuncPtr {
public TriStatus refer(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue);
}
// Contains mappings of available external function implementations.
// Key is function name, value is function "pointer" implementing the
// external function with the specified name.
private static Map<String, ExtFuncPtr> _extFuncMap;
static {
_extFuncMap = new HashMap<String, ExtFuncPtr>();
_extFuncMap.put("ef_calc_sum", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_sum(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_sub", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_sub(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_mul", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_mul(functionId, parameterList, returnValue);
}
});
_extFuncMap.put("ef_calc_div", new ExtFuncPtr() {
public TriStatus refer(TriFunctionId functionId,
TriParameterList parameterList, TriParameter returnValue) {
return PA_impl.ef_calc_div(functionId, parameterList, returnValue);
}
});
}
/***************************************************************************
* Implementation of TRI interface (PA, user-provided part).
*/
public TriStatus triExternalFunction(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
String funcId = functionId.getFunctionName();
System.out.println("**************************************************************************");
System.out.println("*** DEBUG: triExternalFunction() callback called. Function: " + funcId);
if (_extFuncMap.containsKey(funcId))
{
return _extFuncMap.get(funcId).refer(functionId, parameterList, returnValue);
}
String errMsg = "Unrecognized external function " + funcId + " called.";
StartHere.reportError(errMsg);
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triPAReset() {
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public TriStatus triReadTimer(TriTimerId timerId, TriTimerDuration elapsedTime) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triStartTimer(TriTimerId timerId, TriTimerDuration duration) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triStopTimer(TriTimerId timerId) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
public TriStatus triTimerRunning(TriTimerId timerId, TriBoolean running) {
return TriFactory.createTriStatus(TriStatus.TRI_ERROR);
}
/***************************************************************************
* External function implementation helpers.
*/
public static long triParameterToLong(TriParameter src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
IntegerValue v = (IntegerValue)
cd.decode(TriFactory.createTriMessage(src.getEncodedParameter()), req.getInteger());
return ((com.openttcn.sdk.IntegerValue) v).getValue();
}
public static void assignLongToTriParameter(TriParameter dst, long src) {
CD_impl cd = new CD_impl();
TciCDRequired req = StartHereCD.getTciCDRequired();
IntegerValue v = (IntegerValue) req.getInteger().newInstance();
((com.openttcn.sdk.IntegerValue) v).setValue(src);
TriMessage msg = cd.encode(v);
dst.setEncodedParameter(msg.getEncodedMessage());
dst.setNumberOfBits(msg.getNumberOfBits());
}
/***************************************************************************
* External function implementations.
*/
public static TriStatus ef_calc_sum(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) + triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_sub(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) - triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_mul(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) * triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
public static TriStatus ef_calc_div(
TriFunctionId functionId,
TriParameterList parameterList,
TriParameter returnValue) {
assignLongToTriParameter(returnValue,
triParameterToLong(parameterList.get(0)) / triParameterToLong(parameterList.get(1)));
return TriFactory.createTriStatus(TriStatus.TRI_OK);
}
}
