OpenTTCN/Developer corner/Implementing external functions/Modified/C sharp/PA impl.cs
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.cs
using System;
using System.Collections.Generic;
using OpenTTCN.Sdk;
using Etsi.Ttcn3.Tri;
using Etsi.Ttcn3.Tci;
namespace ExtFuncAdapter
{
public class PA_impl : ITriPlatformPA
{
/***************************************************************************
* Initialization of TRI interface (PA, user-provided part).
*/
private delegate TriStatus ExtFuncPtr(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue);
// Contains mappings of available external function implementations.
// Key is function name, value is function pointer implementing the
// external function with the specified name.
static Dictionary<string, ExtFuncPtr> _extFuncMap;
static PA_impl()
{
_extFuncMap = new Dictionary<string, ExtFuncPtr>();
_extFuncMap.Add("ef_calc_sum", ef_calc_sum);
_extFuncMap.Add("ef_calc_sub", ef_calc_sub);
_extFuncMap.Add("ef_calc_mul", ef_calc_mul);
_extFuncMap.Add("ef_calc_div", ef_calc_div);
}
/***************************************************************************
* Implementation of TRI interface (PA, user-provided part).
*/
public TriStatus TriExternalFunction(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue)
{
string funcId = functionId.BaseName;
Console.WriteLine("**************************************************************************");
Console.WriteLine("*** DEBUG: TriExternalFunction() callback called. Function: " + funcId);
if (_extFuncMap.ContainsKey(funcId))
{
return _extFuncMap[funcId](functionId, parameterList, returnValue);
}
string errMsg = "Unrecognized external function " + funcId + " called.";
StartHere.ReportError(errMsg);
return TriStatus.TriError;
}
public TriStatus TriPAReset()
{
return TriStatus.TriOk;
}
public TriStatus TriReadTimer(ITriTimerId timerId, ITriTimerDuration elapsedTime)
{
return TriStatus.TriError;
}
public TriStatus TriStartTimer(ITriTimerId timerId, ITriTimerDuration duration)
{
return TriStatus.TriError;
}
public TriStatus TriStopTimer(ITriTimerId timerId)
{
return TriStatus.TriError;
}
public TriStatus TriTimerRunning(ITriTimerId timerId, ITriBoolean running)
{
return TriStatus.TriError;
}
/***************************************************************************
* External function implementation helpers.
*/
public static long TriParameterToLong(ITriParameter src)
{
CD_impl cd = new CD_impl();
ITciCDRequired req = StartHereCD.TciCDRequired;
ITciIntegerValue v = (ITciIntegerValue)
cd.Decode(new TriMessage(src.EncodedParameter), req.GetInteger());
return v.IntegerValue;
}
public static void AssignLongToTriParameter(ITriParameter dst, long src)
{
CD_impl cd = new CD_impl();
ITciCDRequired req = StartHereCD.TciCDRequired;
ITciIntegerValue v = (ITciIntegerValue) req.GetInteger().NewInstance();
v.IntegerValue = src;
ITriMessage msg = cd.Encode(v);
dst.EncodedParameter = msg.EncodedMessage;
}
/***************************************************************************
* External function implementations.
*/
public static TriStatus ef_calc_sum(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue)
{
AssignLongToTriParameter(returnValue,
TriParameterToLong(parameterList[0]) + TriParameterToLong(parameterList[1]));
return TriStatus.TriOk;
}
public static TriStatus ef_calc_sub(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue)
{
AssignLongToTriParameter(returnValue,
TriParameterToLong(parameterList[0]) - TriParameterToLong(parameterList[1]));
return TriStatus.TriOk;
}
public static TriStatus ef_calc_mul(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue)
{
AssignLongToTriParameter(returnValue,
TriParameterToLong(parameterList[0]) * TriParameterToLong(parameterList[1]));
return TriStatus.TriOk;
}
public static TriStatus ef_calc_div(
ITriFunctionId functionId,
ITriParameterList parameterList,
ITriParameter returnValue)
{
AssignLongToTriParameter(returnValue,
TriParameterToLong(parameterList[0]) / TriParameterToLong(parameterList[1]));
return TriStatus.TriOk;
}
}
}
