OpenTTCN/Developer corner/Implementing external functions/Modified/Java/PA impl.java

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.java


Back to main article >>

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