LibItsGeoNetworking_Functions.ttcn 54.8 KB
Newer Older
berge's avatar
berge committed
/**
berge's avatar
berge committed
 *  @author     ETSI / STF405
 *  @version    $URL$
 *              $Id$
 *  @desc       Module containing functions for GeoNetworking
berge's avatar
berge committed
 *
 */
module LibItsGeoNetworking_Functions {
    
berge's avatar
berge committed
    // Libcommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_VerdictControl {type FncRetCode;}
    import from LibCommon_Sync all;
berge's avatar
berge committed
    // LibIts
    import from LibIts_TestSystem all;
    import from LibIts_Interface all; 
fischer's avatar
fischer committed
    import from LibItsCommon_Functions all;
berge's avatar
berge committed
    import from LibItsGeoNetworking_TypesAndValues all;
berge's avatar
berge committed
    import from LibItsGeoNetworking_Templates all;
fischer's avatar
fischer committed
    import from LibItsGeoNetworking_Pixits all;
    import from LibItsGeoNetworking_Pics all;
    group geoConfigurationFunctions {
        
        /**
         * @desc This configuration features:
         *       - one ITS node (IUT)
         *       - two ITS nodes (nodeA, nodeB)
         *       - Area1 which only includes NodeB and IUT
         *       - Area2 which only includes NodeB 
         *         NodeB being close to the area center    
         */
        function f_cf01Up() runs on ItsNt {

            // Variables
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeDLongPosVector;
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            map(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            f_connect4SelfOrClientSync();
            
            //Initialze the IUT
            f_initialState();
            
            //Get positions
            v_iutLongPosVector := f_getIutLongPosVector();
            v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            // Propagate GN addresses
            v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
            v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
            
            // Position table            
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            // Area table
            f_addArea(v_areaTable, c_area1, 
                f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            f_addArea(v_areaTable, c_area2, 
                f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
        
            f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
            
        } // end f_cf01Up

berge's avatar
berge committed
        /**
         * @desc Deletes configuration cf01
         */
        function f_cf01Down() runs on ItsNt {

            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            unmap(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Disconnect
            f_disconnect4SelfOrClientSync();
            
        } // end f_cf01Down
        
        /**
         * @desc This configuration features:
         *       - one ITS node (IUT)
         *       - one ITS node (NodeB)
berge's avatar
berge committed
         *       - one ITS node (NodeD)
         *       - Area1 which only includes NodeB, NodeD and IUT
         *       - Area2 which only includes NodeB and NodeD 
         *         NodeB being close to the area center          
berge's avatar
berge committed
         * @param p_nodeB
berge's avatar
berge committed
         * @param p_nodeD
berge's avatar
berge committed
        function f_cf02Up(out ItsNt p_nodeB, out ItsNt p_nodeD) runs on ItsMtc {
            
            // Variables
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
            
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
berge's avatar
berge committed
            p_nodeD := ItsNt.create(c_compNodeD) alive;
            map(p_nodeB:acPort, system:acPort);
            map(p_nodeD:acPort, system:acPort);
            map(p_nodeB:utPort, system:utPort);
            map(p_nodeD:utPort, system:utPort);
            map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
berge's avatar
berge committed
            map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect            
            connect(p_nodeB:syncPort, self:syncPort);
berge's avatar
berge committed
            connect(p_nodeD:syncPort, self:syncPort);
            //Initialze the IUT
            f_initialState();
            
            //Get positions
            v_iutLongPosVector := f_getIutLongPosVector();
            v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            // Propagate GN addresses
            v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
            v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
            v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
            
            // Position table
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);

            // Area table
            f_addArea(v_areaTable, c_area1, 
                f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            f_addArea(v_areaTable, c_area2, 
                f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            
            p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
            p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD));
berge's avatar
berge committed
            p_nodeD.done;
            p_nodeD.done;
        
        } // end f_cf02Up

berge's avatar
berge committed
        /**
         * @desc Deletes configuration cf02
         * @param p_nodeB
berge's avatar
berge committed
         * @param p_nodeD
berge's avatar
berge committed
        function f_cf02Down(in ItsNt p_nodeB, in ItsNt p_nodeD) runs on ItsMtc {
            unmap(p_nodeB:acPort, system:acPort);
            unmap(p_nodeD:acPort, system:acPort);
            unmap(p_nodeB:utPort, system:utPort);
            unmap(p_nodeD:utPort, system:utPort);
            unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
berge's avatar
berge committed
            unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            disconnect(p_nodeB:syncPort, self:syncPort);
berge's avatar
berge committed
            disconnect(p_nodeD:syncPort, self:syncPort);
        
        } // end f_cf02Down
        
        /**
         * @desc This configuration features:
         *       - one ITS node (IUT)
         *       - one ITS node (NodeA)
         *       - one ITS node in direction of NodeA (NodeB)
         *       - one ITS node not in direction of NodeA (NodeC)       
         *       - Area1 which only includes NodeB and IUT
         *       - Area2 which only includes NodeB 
         *         NodeB being close to the area center   
berge's avatar
berge committed
        function f_cf03Up(out ItsNt p_nodeB, out ItsNt p_nodeC) runs on ItsMtc {

            // Variables
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
            p_nodeC := ItsNt.create(c_compNodeC) alive;

            // Map
            map(p_nodeB:acPort, system:acPort);
            map(p_nodeC:acPort, system:acPort);
            map(p_nodeB:utPort, system:utPort);
            map(p_nodeC:utPort, system:utPort);
            map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
            map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            connect(p_nodeB:syncPort, self:syncPort);
            connect(p_nodeC:syncPort, self:syncPort);

            //Initialze the IUT
            f_initialState();
            
            //Get positions
            v_iutLongPosVector := f_getIutLongPosVector();
            v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            // Propagate GN addresses
            v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
            v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
            v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
            
            // Position table
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
            
            // Area table
            f_addArea(v_areaTable, c_area1, 
                f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            f_addArea(v_areaTable, c_area2, 
                f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            
            p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
            p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC));
            p_nodeB.done;
            p_nodeC.done;
                    
        } // end f_cf03Up

        /**
         * @desc Deletes configuration cf03
         * @param p_nodeA
         * @param p_nodeB
         * @param p_nodeC
         */
berge's avatar
berge committed
        function f_cf03Down(in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc {
            unmap(p_nodeB:acPort, system:acPort);
            unmap(p_nodeC:acPort, system:acPort);
            unmap(p_nodeB:utPort, system:utPort);
            unmap(p_nodeC:utPort, system:utPort);
            unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
            unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            disconnect(p_nodeB:syncPort, self:syncPort);
            disconnect(p_nodeC:syncPort, self:syncPort);
        
        } // end f_cf03Down

        /**
         * @desc This configuration features:
         *       - one ITS node (IUT)
         *       - one ITS node (NodeA)
         *       - one ITS node in direction of NodeA and having 
         *         shortest distance to NodeA (NodeB)
         *       - one ITS node in direction of NodeA (NodeD)
         *       - one ITS node not in direction of NodeA (NodeC)
         *       - Area1 which only includes NodeB, NodeD and IUT
         *       - Area2 which only includes NodeA, NodeB and NodeD 
         *         NodeB being close to the area center             
        function f_cf04Up(out ItsNt p_nodeB, out ItsNt p_nodeC, out ItsNt p_nodeD) runs on ItsMtc {

            // Variables
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector;
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
            p_nodeC := ItsNt.create(c_compNodeC) alive;
            p_nodeD := ItsNt.create(c_compNodeD) alive;

            // Map
            map(p_nodeB:acPort, system:acPort);
            map(p_nodeC:acPort, system:acPort);
            map(p_nodeD:acPort, system:acPort);
            map(p_nodeB:utPort, system:utPort);
            map(p_nodeC:utPort, system:utPort);
            map(p_nodeD:utPort, system:utPort);
            map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
            map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
            map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            connect(p_nodeB:syncPort, self:syncPort);
            connect(p_nodeC:syncPort, self:syncPort);
            connect(p_nodeD:syncPort, self:syncPort);
            
            //Initialze the IUT
            f_initialState();
            
            //Get positions
            v_iutLongPosVector := f_getIutLongPosVector();
            v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            // Propagate GN addresses
            v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
            v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
            v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
            v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
            
            // Position table
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
            f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);

            // Area table
            f_addArea(v_areaTable, c_area1, 
                f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
            f_addArea(v_areaTable, c_area2, 
                f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector))));
                            
            p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
            p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC));
            p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD));
            p_nodeB.done;
            p_nodeC.done;
            p_nodeD.done;
                    
        } // end f_cf04Up

        /**
         * @desc Deletes configuration cf04
         * @param p_nodeB
         * @param p_nodeC
         * @param p_nodeD
         */
tepelmann's avatar
tepelmann committed
        function f_cf04Down(in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc {
            unmap(p_nodeB:acPort, system:acPort);
            unmap(p_nodeC:acPort, system:acPort);
            unmap(p_nodeD:acPort, system:acPort);
            unmap(p_nodeB:utPort, system:utPort);
            unmap(p_nodeC:utPort, system:utPort);
            unmap(p_nodeD:utPort, system:utPort);
            unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort);
            unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort);
            unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            disconnect(p_nodeB:syncPort, self:syncPort);
            disconnect(p_nodeC:syncPort, self:syncPort);
            disconnect(p_nodeD:syncPort, self:syncPort);
        
        } // end f_cf04Down
        
        function f_initialiseComponent(
            in PositionTable p_positionTable,
            in GeoAreaTable p_areaTable,
            in charstring p_componentName) 
        runs on ItsNt {
            
            vc_positionTable := p_positionTable;
            vc_areaTable := p_areaTable;
            vc_componentName := p_componentName; 
            
        } // end f_initialiseComponent
        
berge's avatar
berge committed
        function f_startBeingNeighbour() runs on ItsNt {
            
            vc_neighbourDefault := activate(a_neighbourDefault());
            f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader));
berge's avatar
berge committed
            
        } // end f_startBeingNeighbour
        
        function f_stopBeingNeighbour() runs on ItsNt  {
            
            f_acTriggerEvent(m_stopBeaconing);
            deactivate(vc_neighbourDefault); 
berge's avatar
berge committed
            
        } // end f_stopBeingNeighbour
        
    } // end geoConfigurationFunctions
    
    group geoPositionFunctions {
        
        function f_addPosition(
berge's avatar
berge committed
            inout PositionTable p_positionTable,
            in charstring p_positionKey,
            in LongPosVector p_positionValue
        ) {
berge's avatar
berge committed
            p_positionTable[lengthof(p_positionTable)] := {
                key := p_positionKey,
                position := p_positionValue
            };
        }
        
        function f_getPosition(
            in charstring p_positionKey
        ) runs on ItsNt 
        return LongPosVector {
            
            var LongPosVector v_return;
            var integer i := 0;
            
            for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
                if (vc_positionTable[i].key == p_positionKey) {
                    v_return := vc_positionTable[i].position;
                }
            }
        function f_computePosition(
            in LongPosVector p_refPosition, 
            in integer p_longitudeFactor, 
            in integer p_latitudeFactor
        ) return LongPosVector {
        
            var LongPosVector v_return := p_refPosition;
berge's avatar
berge committed
            v_return.latitude := v_return.latitude + p_latitudeFactor * PX_DISTANCE_UNIT;
            v_return.longitude := v_return.longitude + p_longitudeFactor * PX_DISTANCE_UNIT;
            return v_return;
        }
        
        function f_addArea(
            inout GeoAreaTable p_geoAreaTable,
            in charstring p_areaKey,
            in GeoArea p_geoArea
        ) {
            p_geoAreaTable[lengthof(p_geoAreaTable)] := {
                key := p_areaKey,
                geoArea := p_geoArea
            };
        }
        
berge's avatar
berge committed
        function f_getArea(
            in charstring p_areaName
        ) runs on ItsNt 
        return GeoArea {
            var GeoArea v_return;
            var integer i := 0;
            
berge's avatar
berge committed
            for (i:=0; i<lengthof(vc_areaTable); i:=i+1) {
                if (vc_areaTable[i].key == p_areaName) {
                    v_return := vc_areaTable[i].geoArea;
berge's avatar
berge committed
            
            return v_return;
        }
        
        function f_getGeoBroadcastArea(in charstring p_areaName) runs on ItsNt 
        return GeoBroadcastArea {         
berge's avatar
berge committed
            return f_geoArea2geoBroadcastArea(f_getArea(p_areaName));
berge's avatar
berge committed
        function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsNt 
berge's avatar
berge committed
            return f_geoArea2geoAnycastArea(f_getArea(p_areaName));
        }
        
        function f_geoArea2geoBroadcastArea(GeoArea p_area) 
        return GeoBroadcastArea {
            var GeoBroadcastArea v_broadcastArea;
            if (p_area.shape == e_geoCircle) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
            }
            else if (p_area.shape == e_geoRect) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
            }
            else if (p_area.shape == e_geoElip) {
                v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
            }
            else {
                v_broadcastArea.geoBroadcastSubType := e_reserved;
            }
            
            v_broadcastArea.geoBroadcastArea := p_area.area;
            
            return v_broadcastArea;
        function f_geoArea2geoAnycastArea(GeoArea p_area) 
        return GeoAnycastArea {
            var GeoAnycastArea v_anycastArea;
            
            if (p_area.shape == e_geoCircle) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastCircle;
            }
            else if (p_area.shape == e_geoRect) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastRect;
            }
            else if (p_area.shape == e_geoElip) {
                v_anycastArea.geoAnycastSubType := e_geoAnycastElip;
            }
            else {
                v_anycastArea.geoAnycastSubType := e_reserved;
            }
            
            v_anycastArea.geoAnycastArea := p_area.area;
            
            return v_anycastArea;
        }
        
        function f_computeSquareArea(
            in LongPosVector p_centerLongPosVector, 
            in UInt16 p_distanceA
        ) return GeoArea {
                
            var GeoArea v_geoArea;
            
            v_geoArea := {
                shape := e_geoRect,
                area := {
                    geoAreaPosLatitude := p_centerLongPosVector.latitude,
                    geoAreaPosLongitude := p_centerLongPosVector.longitude,
                    distanceA := p_distanceA,
                    distanceB := p_distanceA,
                    angle := 0 
                }
            }
            
            return v_geoArea;   
        }
        
        function f_distance(
            in LongPosVector p_pointA,
            in LongPosVector p_pointB
        ) return float {
         
            return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);   
        }
        
    } // end geoPositionFunctions    
    
berge's avatar
berge committed
    group geoAltsteps {
berge's avatar
berge committed
        /**
         * @desc The base default.
         */
        altstep a_default() runs on ItsNt {
            
            var LongPosVector v_iutLongPosVector;
            
            [] a_receiveLsRequest(
                ?, ?, v_iutLongPosVector
            [] geoNetworkingPort.receive {
                f_selfOrClientSyncAndVerdict("error", e_error, "*** a_default: Received an unexpected message ***");
            }
            [] tc_wait.timeout {
                f_selfOrClientSyncAndVerdict("error", e_timeout, "*** a_default: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
            }
            [] tc_ac.timeout {
                f_selfOrClientSyncAndVerdict("error", e_timeout, "*** a_default: Timeout while awaiting the reception of a message ***");
tepelmann's avatar
tepelmann committed
            [] a_shutdown() {
                f_poDefault();
                log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;   
            }

        altstep a_neighbourDefault() runs on ItsNt {
      
            [] a_receiveLsRequestAndReply(
                ?, f_getPosition(vc_componentName).gnAddr, 
                f_getPosition(vc_componentName), 
                f_getPosition(vc_componentName)
tepelmann's avatar
tepelmann committed
            [] a_shutdown() {
                f_poNeighbour();
                log("*** a_neighbourDefault: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;   
            }            
            [] a_default() {                
            }
        }
berge's avatar
berge committed
        
        group geoGeoUnicastAltsteps {
            
            /**
             * @desc Receive GeoUnicast packet
             */
berge's avatar
berge committed
            altstep a_receiveGeoUnicast(
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) ShortPosVector p_destinationShortPosVec,
                in template (present) UInt16 p_seqNumber
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoUnicastHeader(
                    p_senderLongPosVec,
                    p_destinationShortPosVec,
                    p_seqNumber)))) {
                    }
            }     
            
            /**
berge's avatar
berge committed
             * @desc Receive GeoUnicast packet for specific destination
             */
berge's avatar
berge committed
            altstep a_receiveGeoUnicastWithDestination(in template (present) ShortPosVector p_destinationShortPosVec) runs on ItsNt {
                
                [] a_receiveGeoUnicast(?, p_destinationShortPosVec, ?) {}
berge's avatar
berge committed
            }     
berge's avatar
berge committed
            
            /**
             * @desc Receive any GeoUnicast packet
             */
berge's avatar
berge committed
            altstep a_receiveAnyGeoUnicast() runs on ItsNt {
                
                [] a_receiveGeoUnicast(?, ?, ?) {}
berge's avatar
berge committed
            }  
berge's avatar
berge committed
            
        } // end geoGeoUnicastAltsteps
        
berge's avatar
berge committed
        group geoGeoBroadcastAltsteps {
            
            /**
             * @desc Receive GeoBroadcast packet
             */
            altstep a_receiveGeoBroadcast(
berge's avatar
berge committed
                in template (present) LongPosVector p_srcLongPosVec,                
                in template (present) LongPosVector p_senderLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeader(
                        p_srcLongPosVec,
berge's avatar
berge committed
                        p_senderLongPosVec,
berge's avatar
berge committed
                        p_seqNumber
                    )))) {
                }
            }
berge's avatar
berge committed
            
            /**
             * @desc Receive GeoBroadcast packet with specific Area and HopLimit
             */
            altstep a_receiveGeoBroadcastWithAreaWithHopLimit(
                in template (present) LongPosVector p_srcLongPosVec,                
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea,
berge's avatar
berge committed
                in template (present) UInt8 p_hopLimit
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithAreaWithHopLimit(
                        p_srcLongPosVec,
                        p_senderLongPosVec,
                        p_seqNumber,
                        p_broadcastArea,
                        p_hopLimit
                    )))) {
                }
            }            
berge's avatar
berge committed

            /**
             * @desc Receive GeoBroadcast packet for specific Geobroadcast Area
             */
            altstep a_receiveGeoBroadcastWithArea(                
                in template (present) LongPosVector p_srcLongPosVec,
berge's avatar
berge committed
                in template (present) LongPosVector p_senderLongPosVec,
berge's avatar
berge committed
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoBroadcastArea p_broadcastArea
berge's avatar
berge committed
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithArea(
                        p_srcLongPosVec,
berge's avatar
berge committed
                        p_senderLongPosVec,
berge's avatar
berge committed
                        p_seqNumber,
                        p_broadcastArea
                    )))) {
                }
            }               
                        
        } // end geoGeoBroadcastAltsteps
berge's avatar
berge committed

        group geoGeoAnycastAltsteps {
            
            /**
             * @desc Receive GeoAnycast packet
             */
            altstep a_receiveGeoAnycast(
                in template (present) LongPosVector p_srcLongPosVec,                
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) UInt16 p_seqNumber
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeader(
                        p_srcLongPosVec,
                        p_senderLongPosVec,
                        p_seqNumber
                    )))) {
                }
            }
            
            /**
             * @desc Receive GeoAnycast packet with specific Area and HopLimit
             */
            altstep a_receiveGeoAnycastWithAreaWithHopLimit(
                in template (present) LongPosVector p_srcLongPosVec,                
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoAnycastArea p_anycastArea,
berge's avatar
berge committed
                in template (present) UInt8 p_hopLimit
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithAreaWithHopLimit(
                        p_srcLongPosVec,
                        p_senderLongPosVec,
                        p_seqNumber,
                        p_anycastArea,
                        p_hopLimit
                    )))) {
                }
            }            

            /**
             * @desc Receive GeoAnycast packet for specific GeoAnycast Area
             */
            altstep a_receiveGeoAnycastWithArea(                
                in template (present) LongPosVector p_srcLongPosVec,
                in template (present) LongPosVector p_senderLongPosVec,
                in template (present) UInt16 p_seqNumber,
                in template (present) GeoAnycastArea p_anycastArea
berge's avatar
berge committed
            ) runs on ItsNt {
                
                [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithArea(
                        p_srcLongPosVec,
                        p_senderLongPosVec,
                        p_seqNumber,
                        p_anycastArea
                    )))) {
                }
            }               
                        
        } // end geoGeoAnycastAltsteps
berge's avatar
berge committed
        group geoLocationServiceAltsteps {

            /**
             * @desc Receive Location Service Request
             */
            altstep a_receiveLsRequest(
                in template (present) UInt16 p_seqNumber,
                in template (present) GN_Address p_gnAddress,
berge's avatar
berge committed
                out LongPosVector p_reqSrcPosVector
berge's avatar
berge committed
            ) runs on ItsNt {
                var GeoNetworkingInd v_msg;
                
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwPdu(
                            mw_lsRequestHeader(
                                p_seqNumber,
                                p_gnAddress
                            )
                        )
                    )
                ) -> value v_msg {
berge's avatar
berge committed
                    p_reqSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector);
berge's avatar
berge committed
            }
            
            /**
             * @desc Receive any Location Service Request
             */
            altstep a_receiveAnyLsRequest() runs on ItsNt {
                var LongPosVector v_reqSrcPosVector;
                
                [] a_receiveLsRequest(?, ?, v_reqSrcPosVector) {}
berge's avatar
berge committed
            }
            
            /**
             * @desc Receive Location Service Request and send Location Service Reply  
             */
            altstep a_receiveLsRequestAndReply(
berge's avatar
berge committed
                in template (present) UInt16 p_reqSeqNumber,
                in template (value) GN_Address p_gnAddress,
                in template (value) LongPosVector p_repSrcPosVector,
                in template (value) LongPosVector p_repSenderPosVector
berge's avatar
berge committed
            ) runs on ItsNt {
                var LongPosVector v_repDstPosVector;
                [] a_receiveLsRequest(p_reqSeqNumber, p_gnAddress, v_repDstPosVector) {
                    f_sendGeoNetMessage(m_geoNwReq(m_geoNwPdu(
berge's avatar
berge committed
                        m_lsReplyHeader(
tepelmann's avatar
tepelmann committed
                        p_repSrcPosVector,
                        f_longPosVector2ShortPosVector(v_repDstPosVector),
berge's avatar
berge committed
                        p_repSenderPosVector,
                        vc_localSeqNumber   
berge's avatar
berge committed
                }
            }
          
        } // end geoLocationServiceAltsteps
        
        
    } // end geoAltsteps
    
    group preambles {
        
        /**
         * @desc The default preamble.
         */
        function f_prDefault() runs on ItsNt {
            activate(a_default());
        }
        
        function f_prNonNeighbour() runs on ItsNt {
            f_prDefault();
        }
        
        function f_prNeighbour() runs on ItsNt {
            f_prDefault();
berge's avatar
berge committed
            f_startBeingNeighbour();        
        /**
         * @desc Brings the IUT into an initial state.
         * @return 
         */
        function f_initialState() {
berge's avatar
berge committed
            var ItsNt initComponent := ItsNt.create;
berge's avatar
berge committed
            
            initComponent.start(f_utInitializeIut(m_gnInitialize));
berge's avatar
berge committed
            initComponent.done;
        function f_handleLocationService(
          in template (present) UInt16 p_reqSeqNumber,
          in template (value) GN_Address p_gnAddress,
          in template (value) LongPosVector p_repSrcPosVector,
          in template (value) LongPosVector p_repSenderPosVector
                [] a_receiveLsRequestAndReply(p_reqSeqNumber, p_gnAddress, p_repSrcPosVector, p_repSenderPosVector) {
                    tc_ac.stop;
                }
            }
            
        }
        
        function f_processLocationService(
          in template (value) LongPosVector p_reqSrcPosVector,
          in template (value) UInt16 p_reqSeqNumber,
          in template (value) GN_Address p_gnAddress,
berge's avatar
berge committed
          out LongPosVector p_repSrcPosVector
        ) runs on ItsNt return FncRetCode {
            var FncRetCode v_ret := e_error;
            var GeoNetworkingInd v_msg;
            
            f_sendGeoNetMessage(
                m_geoNwReq(
                    m_geoNwPdu(
                        m_lsRequestHeader(
                            p_reqSrcPosVector,
                            p_reqSrcPosVector,
                            p_reqSeqNumber,
                            p_gnAddress
                        )
                    )
                )
            );
            
            tc_ac.start;
            alt {
                [] geoNetworkingPort.receive(
                        mw_geoNwInd(
                            mw_geoNwPdu(
                                mw_lsReplyHeader(
                                    p_reqSeqNumber,
                                    ?,
                                    f_longPosVector2ShortPosVector(valueof(p_reqSrcPosVector))
berge's avatar
berge committed
                    p_repSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector);
    } // end preambles
    
    group postambles {
        
        /**
         * @desc The default postamble.
         */
        function f_poDefault() runs on ItsNt {
        
        function f_poNeighbour() runs on ItsNt {
berge's avatar
berge committed
            f_stopBeingNeighbour();
            f_poDefault();           
        }
        
    group adapterControl {
berge's avatar
berge committed
        /**
         * @desc Triggers event in the test system adaptation.
         * @param p_event The event to trigger
         * @return
        function f_acTriggerEvent(template (value) AcGNEvent p_event) runs on ItsNt return FncRetCode {
            var FncRetCode v_ret := e_success;
            acPort.send(p_event);
            return v_ret;
        /**
         * @desc Triggers event in the test system adaptation.
         * @param p_event The event to trigger
         * @return
         */
        function f_acGetLongPosVector(template (value) GN_Address p_gnAddress) runs on ItsNt return LongPosVector {
            var AcGNResult v_result;
            
            f_acTriggerEvent(m_getLongPosVector(p_gnAddress));
            tc_ac.start;
            alt {
                [] acPort.receive(mw_getLongPosVectorAny(p_gnAddress)) -> value v_result {
                    tc_ac.stop;
                }
                [] acPort.receive {
                    tc_ac.stop;
                    f_selfOrClientSyncAndVerdict("error", e_error, "*** f_acGetLongPosVector: Received unexpected message ***");
                }
                [] tc_ac.timeout {
                    f_selfOrClientSyncAndVerdict("error", e_timeout, "*** f_acGetLongPosVector: Timeout while waiting for adapter control event result ***");
                }
            }
            
            return v_result.getLongPosVector;
        }
        
    } // end adapterControl
    group commonFunctions {
        
        /**
         * @desc Gets the value of the lifetime in seconds.
         * @return 
         */
        function f_getLifetimeValue(in Lifetime p_lifetime) runs on ItsNt return float {
            var float v_lifetime := 0.0;
          
            select (p_lifetime.ltBase) {
                case (e_50ms) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 0.5;
                }
                case (e_1s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 1.0;
                }
                case (e_10s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 10.0;
                }
                case (e_100s) {
                    v_lifetime := int2float(p_lifetime.multiplier) * 100.0;
                }
            }
          
            return v_lifetime;
        }
      
    } // end commonFunctions
    
berge's avatar
berge committed
    group testerFunctions {
berge's avatar
berge committed
        
        /**
         * @desc Gets the tester GN local address for a specific node
         */
        function f_getTsGnLocalAddress(in charstring p_node) return GN_Address {
            var GN_Address v_gnAddr;
            
            select (p_node) {
                case (c_compNodeA) {
                    v_gnAddr := PX_TS_NODE_A_LOCAL_GN_ADDR;
                }
                case (c_compNodeB) {
                    v_gnAddr := PX_TS_NODE_B_LOCAL_GN_ADDR;
                }
                case (c_compNodeC) {
                    v_gnAddr := PX_TS_NODE_C_LOCAL_GN_ADDR;
                }
                case (c_compNodeD) {
                    v_gnAddr := PX_TS_NODE_D_LOCAL_GN_ADDR;
                }
                case else {
                    f_selfOrClientSyncAndVerdict("error", e_timeout, "*** f_getTsGnLocalAddress: Unknown node given ***");
                }
            }
            
            return v_gnAddr;
        }
        
berge's avatar
berge committed
        /**
tepelmann's avatar
tepelmann committed
         * @desc Sends a GeoNetworking message and in case of an included sequence number in the message the 
berge's avatar
berge committed
         *       local sequence number will be increased by one.
         * @param p_geoNetReq The message to sent.
tepelmann's avatar
tepelmann committed
         */
        function f_sendGeoNetMessage(in template (value) GeoNetworkingReq p_geoNetReq) runs on ItsNt {
            geoNetworkingPort.send(p_geoNetReq);
            if (not (ischosen(p_geoNetReq.msgOut.header.shbHeader) or ischosen(p_geoNetReq.msgOut.header.beaconHeader))) {
                f_setLocalSequenceNumber();
            }
berge's avatar
berge committed
        }
      
        /**
         * @desc Sets the value of the sequence number for the next event.
         * @return 
         */
        function f_setLocalSequenceNumber() runs on ItsNt {
tepelmann's avatar
tepelmann committed
            vc_localSeqNumber := (vc_localSeqNumber + 1) mod c_uInt16Max;
        /**
         * @desc Gets the IUT GN local address
         */
berge's avatar
berge committed
        function f_getIutGnLocalAddress() return GN_Address {
            
            return PICS_GN_LOCAL_GN_ADDR;
        /**
         * @desc Gets the IUT GN local address configuration method
         */
        function f_getIutGnLocalAddressConfigurationMethod() return TypeOfAddress {
            return PICS_GN_LOCAL_ADDR_CONF_METHOD;
        }
        
        /**
         * @desc Gets the GeoUnicast forwarding algorithm
         */
        function f_getGeoUnicastForwardingAlgorithm() return GeoUnicastForwardingAlgorithm {
            return PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM;
        }
        
        /**
         * @desc Gets the IUT default hop limit
         */
        function f_getDefaultHopLimit() return UInt8 {
            return PICS_GN_DEFAULT_HOP_LIMIT;
        }
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer.. Valid for NetRepInterval = default (cong. ctrl).
         * @return 
         */
        function f_getLSRetransmitTimer() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnLocationServiceRetransmitTimer := int2float(PICS_GN_LOCATION_SERVICE_RETRANSMIT_TIMER/1000);
            
            return v_itsGnLocationServiceRetransmitTimer;
        }
        
fischer's avatar
fischer committed
        /**
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer for NetRepInterval = medium (cong. ctrl).
fischer's avatar
fischer committed
         * @return 
         */
        function f_getLSRetransmitTimerMedium() return float {
berge's avatar
berge committed
            var float v_itsGnLocationServiceRetransmitTimerMedium := int2float(PX_GN_LOCATION_SERVICE_TIMER_MEDIUM/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationServiceRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer for NetRepInterval = maximum (cong. ctrl).
fischer's avatar
fischer committed
         * @return 
         */
        function f_getLSRetransmitTimerMaximum() return float {
berge's avatar
berge committed
            var float v_itsGnLocationServiceRetransmitTimerMaximum := int2float(PX_GN_LOCATION_SERVICE_TIMER_MAXIMUM/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationServiceRetransmitTimerMaximum;
fischer's avatar
fischer committed
        }
fischer's avatar
fischer committed

        /**
         * @desc Gets the App retransmission timer. Valid for AppRepInterval = default (cong. ctrl).
         * @return 
         */
        function f_getAppRetransmitTimer() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnLocationApplicationRetransmitTimer := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationApplicationRetransmitTimer;
fischer's avatar
fischer committed
        }
        
        /**
         * @desc Gets the App retransmission timer for AppRepInterval = medium (cong. ctrl).
         * @return 
         */
        function f_getAppRetransmitTimerMedium() return float {
            var float v_itsGnLocationApplicationRetransmitTimerMedium := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MEDIUM/1000);
fischer's avatar
fischer committed
            
            return v_itsGnLocationApplicationRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
         * @desc Gets the App retransmission timer for AppRepInterval = maximum (cong. ctrl).
         * @return 
         */
        function f_getAppRetransmitTimerMaximum() return float {
            var float v_itsGnLocationApplicationRetransmitTimerMaximum := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MAXIMUM/1000);
fischer's avatar
fischer committed
            
            return v_itsGnLocationApplicationRetransmitTimerMaximum;
fischer's avatar
fischer committed
        }
fischer's avatar
fischer committed
        
        /**
         * @desc Gets the LS maximum retransmission number.
         * @return 
         */
        function f_getLSMaxRetrans() return integer {
            var integer v_itsGnLocationServiceMaxRetrans := PICS_GN_LOCATION_SERVICE_MAX_RETRANS;
            
            return v_itsGnLocationServiceMaxRetrans;
        }
fischer's avatar
fischer committed

        /**
         * @desc Gets the Application maximum retransmission number.
         * @return 
         */
        function f_getAppMaxRetrans() return integer {
            var integer v_itsGnApplicationMaxRetrans := PICS_GN_APPLICATION_MAX_RETRANS;
fischer's avatar
fischer committed
            
            return v_itsGnApplicationMaxRetrans;
fischer's avatar
fischer committed
        }
tepelmann's avatar
tepelmann committed
        /**
         * @desc Gets the Location Service packet buffer size.
         * @return 
         */        
        function f_getLSPacketBufferSize() return integer {
            var integer v_itsGnLocationServicePacketBufferSize := PICS_GN_LOCATION_SERVICE_PACKET_BUFFER_SIZE;
tepelmann's avatar
tepelmann committed
            
            return v_itsGnLocationServicePacketBufferSize;
        } // end f_getLSPacketBufferSize
        
berge's avatar
berge committed
        /**
         * @desc Gets the UC forwarding packet buffer size.
         * @return 
         */        
        function f_getUcForwardingPacketBufferSize() return integer {
            var integer v_itsGnUcForwardingPacketBufferSize := PICS_GN_UC_FORWARDING_PACKET_BUFFER_SIZE;
berge's avatar
berge committed
            
            return v_itsGnUcForwardingPacketBufferSize;
        } // end f_getUcForwardingPacketBufferSize
        
berge's avatar
berge committed
        /**
         * @desc Gets the BC forwarding packet buffer size.
         * @return 
         */        
        function f_getBcForwardingPacketBufferSize() return integer {
            var integer v_itsGnBcForwardingPacketBufferSize := PICS_GN_BC_FORWARDING_PACKET_BUFFER_SIZE;
berge's avatar
berge committed
            
            return v_itsGnBcForwardingPacketBufferSize;
        } // end f_getBcForwardingPacketBufferSize        
        
        /**
         * @desc Gets the upper limit of the maximum lifetime.
         * @return 
         */
        function f_getMaxPacketLifeTime() return float {
            var float v_itsGnMaxPacketLifetime := int2float(PICS_GN_MAX_PACKET_LIFETIME);
            
            return v_itsGnMaxPacketLifetime;
        }
        
        /**
         * @desc Gets delta for timers.
         * @return 
         */
        function f_getDeltaTimer() return float {
tepelmann's avatar
tepelmann committed
            var float v_deltaTimer := PX_T_DELTA;
        /**
         * @desc Gets the beacon service retransmit timer.
         * @return 
         */
        function f_getBSRetransmitTimer() return float {
            var float v_itsGnBeaconServiceRetransmitTimer;
            v_itsGnBeaconServiceRetransmitTimer := int2float(
                (PICS_GN_BEACON_SERVICE_TIMER+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
fischer's avatar
fischer committed
        /**
         * @desc Gets the beacon service retransmit timer for NetBeaconInterval = medium (cong. ctrl).
         * @return 
         */
        function f_getBSRetransmitTimerMedium() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnBeaconServiceRetransmitTimerMedium; // timer value increased (medium)
tepelmann's avatar
tepelmann committed
            v_itsGnBeaconServiceRetransmitTimerMedium := int2float(
                (PX_GN_BEACON_SERVICE_TIMER_MEDIUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
tepelmann's avatar
tepelmann committed
            return v_itsGnBeaconServiceRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
         * @desc Gets the beacon service retransmit timer for NetBeaconInterval = maximum (cong. ctrl).
         * @return 
         */
        function f_getBSRetransmitTimerMaximum() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnBeaconServiceRetransmitTimerMaximum; // timer value increased (maximum)
tepelmann's avatar
tepelmann committed
            v_itsGnBeaconServiceRetransmitTimerMaximum := int2float(
                (PX_GN_BEACON_SERVICE_TIMER_MAXIMUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
tepelmann's avatar
tepelmann committed
            return v_itsGnBeaconServiceRetransmitTimerMaximum;
        /**
         * @desc Gets the maximum beacon service jitter.
         * @return 
         */
        function f_getBSMaxJitter() return float {
            var float v_itsGnBeaconServiceMaxJitter := (f_getMaxPacketLifeTime()*1000.0)/4.0;

        /**
         * @desc Gets the Lifetime of a Location Table Entry.
         * @return 
         */        
        function f_getLifetimeLocTE() return float {
            var float v_itsGnLifetimeLocTE := int2float(PICS_GN_LIFETIME_LOC_TE);
            
            return v_itsGnLifetimeLocTE;
        } // end f_getLifetimeLocTE
berge's avatar
berge committed
        /**
         * @desc Gets the maximum communication range for CBF algorithm
         */
        function f_getCbfMaxCommunicationRange() return integer {
            var integer v_maxCommunicationRange := PICS_GN_DEFAULT_MAX_COMMUNICATION_RANGE;
            
            return v_maxCommunicationRange;
        } // end f_getCbfMaxCommunicationRange
        
        function f_getGeoUnicastCbfMaxTime() return integer {
            var integer v_cbfMaxTime := PICS_GN_GEOUNICAST_CBF_MAX_TIME;
            
            return v_cbfMaxTime;            
        } // end f_getGeoUnicastCbfMaxTime

        function f_getGeoUnicastCbfMinTime() return integer {
            var integer v_cbfMinTime := PICS_GN_GEOUNICAST_CBF_MIN_TIME;
            
            return v_cbfMinTime;
        } // end f_getGeoUnicastCbfMinTime
        
        /**
         * @desc Set the number of neighbour in the Location Table.
         * @return 
         */        
fischer's avatar
fischer committed
        function f_setNrNeighbourLocTableDefault() {
            var integer v_nrNeighbour := f_random (0, PX_MIN_NR_NEIGHBOUR);
            //TODO set the number of Neighbour in the IUT Location Table to v_nrNeighbour
            
        } // end f_setNrNeighbourLT
        
        /**
         * @desc Set the number of neighbour in the Location Table.
         * @return 
         */        
        function f_setNrNeighbourLocTableMedium() {
            var integer v_nrNeighbour := f_random (PX_MIN_NR_NEIGHBOUR, PX_MAX_NR_NEIGHBOUR);
            //TODO set the number of Neighbour in the IUT Location Table to v_nrNeighbour
            
        } // end f_setNrNeighbourLT
        
        /**
         * @desc Set the number of neighbour in the Location Table.
         * @return 
         */        
        function f_setNrNeighbourLocTableMaximum() {
            var integer v_nrNeighbour := f_random (PX_MAX_NR_NEIGHBOUR, (2*PX_MIN_NR_NEIGHBOUR));
            //TODO set the number of Neighbour in the IUT Location Table to v_nrNeighbour
            
        } // end f_setNrNeighbourLT
        
berge's avatar
berge committed
    group posVectorFunctions {
        
berge's avatar
berge committed
        function f_longPosVector2ShortPosVector(in LongPosVector p_longPosVector) return ShortPosVector {
            var ShortPosVector v_shortPosVector;
            
            v_shortPosVector := {
                gnAddr := p_longPosVector.gnAddr, 
                timestamp := p_longPosVector.timestamp, 
                latitude := p_longPosVector.latitude, 
                longitude := p_longPosVector.longitude
            };
            
berge's avatar
berge committed
            return v_shortPosVector; 
        }
        
        function f_getIutLongPosVector() return LongPosVector {
            return f_acGetLongPosVector(f_getIutGnLocalAddress()); 
        }
        
        function f_getIutShortPosVector() return ShortPosVector {
            return f_longPosVector2ShortPosVector(f_getIutLongPosVector()); 
berge's avatar
berge committed
        /**
         * @desc    Compute a position using a reference position, a distance and an orientation 
         * @param   p_iutLongPosVector Reference position
         * @param   p_distance Distance to the reference position (in meter)
         * @param   p_orientation direction of the computed position (0 to 359; 0 means North)
         * @return  LongPosVector
         */        
        function f_computePositionUsingDistance(in LongPosVector p_iutLongPosVector, in integer p_distance, in integer p_orientation) 
        return LongPosVector {
            var LongPosVector v_result := p_iutLongPosVector;
            fx_computePositionUsingDistance(p_iutLongPosVector, p_distance, p_orientation, v_result.latitude, v_result.longitude);
            return v_result;
        }
        
berge's avatar
berge committed
    } // end posVectorFunctions