OpenTTCN/Developer corner/Implementing external functions/Modified/C sharp/PA impl.cs

From OpenTTCN

Jump to: navigation, search

  OpenTTCN DocZone

  Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support


PA_impl.cs


Back to main article >>

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;
        }
    }
}
Views
Personal tools