LibItsGeoNetworking_Functions.ttcn 115 KB
Newer Older
berge's avatar
berge committed
/**
filatov's avatar
filatov committed
 *  @author     ETSI / STF405 / STF449 / STF484 / STF517 / STF525
berge's avatar
berge committed
 *  @version    $URL$
*              $Id$
berge's avatar
berge committed
 *  @desc       Module containing functions for GeoNetworking
garciay's avatar
garciay committed
 *  @copyright   ETSI Copyright Notification
 *               No part may be reproduced except as authorized by written permission.
 *               The copyright and the foregoing restriction extend to reproduction in all media.
 *               All rights reserved.
berge's avatar
berge committed
 *
 */
module LibItsGeoNetworking_Functions {
    
garciay's avatar
garciay committed
  // Libcommon
  import from LibCommon_BasicTypesAndValues all;
  import from LibCommon_DataStrings all;
  import from LibCommon_VerdictControl {type FncRetCode;}
  import from LibCommon_Sync all;
  import from LibCommon_Time all;
garciay's avatar
garciay committed
  // LibItsCommon
  import from LibItsCommon_TypesAndValues all;
  import from LibItsExternal_TypesAndValues all;
  import from LibItsCommon_Templates all;
  import from LibItsCommon_Functions all;
  import from LibItsCommon_Pixits all;
  //    import from LibItsCommon_TestSystem all;
garciay's avatar
garciay committed
    
garciay's avatar
garciay committed
  // LibItsSecurity
  import from LibItsSecurity_TypesAndValues all;
  import from LibItsSecurity_Templates all;
  import from LibItsSecurity_Functions all;
  import from LibItsSecurity_Pixits all;
garciay's avatar
garciay committed
    
garciay's avatar
garciay committed
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_TestSystem all;
  import from LibItsGeoNetworking_TypesAndValues all;
  import from LibItsGeoNetworking_Templates all;
  import from LibItsGeoNetworking_Pixits all;
  import from LibItsGeoNetworking_Pics all;
  //    import from LibItsGeoNetworking_EncdecDeclarations all;
tepelmann's avatar
tepelmann committed
    
garciay's avatar
garciay committed
  group utFuntions {
tepelmann's avatar
tepelmann committed
        
garciay's avatar
garciay committed
    /**
     * @desc    Requests to bring the IUT in an initial state
     * @param   p_init The initialisation to trigger.
     */
    function f_utInitializeIut(template (value) UtGnInitialize p_init) runs on ItsBaseGeoNetworking {
tepelmann's avatar
tepelmann committed
            
garciay's avatar
garciay committed
      //deactivate gnPort default alts
    vc_gnDefaultActive := false;
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
      utPort.send(p_init);
      tc_wait.start;
      alt {
garciay's avatar
garciay committed
	      [] utPort.receive(UtGnResults: { utGnInitializeResult := true }) {
garciay's avatar
garciay committed
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT initialized ***");
        }
        [] utPort.receive {
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT could not be initialized ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_wait.timeout {
          log("*** f_utInitializeIut: INFO: IUT could not be initialized in time ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
      //activate gnPort default alts
    vc_gnDefaultActive := true;
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
    }
tepelmann's avatar
tepelmann committed
        
garciay's avatar
garciay committed
    /**
     * @desc    Requests to change the position of the IUT
     */
    function f_utChangePosition() runs on ItsBaseGeoNetworking {
garciay's avatar
garciay committed
      //deactivate gnPort default alts
    vc_gnDefaultActive := false;
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
      utPort.send(m_changePosition);
      tc_wait.start;
      alt {
	      [] utPort.receive(UtGnResults: { utGnChangePositionResult := true} ) {
          tc_wait.stop;
          log("*** f_utChangePosition: INFO: IUT position changed ***");
        }
        [] utPort.receive(UtGnResults: { utGnChangePositionResult := false }) {
          tc_wait.stop;
          log("*** f_utChangePosition: INFO: IUT position change was not successful ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] a_utDefault() {
        }
        [] tc_wait.timeout {
          log("*** f_utChangePosition: INFO: IUT position not changed in time ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
      //activate gnPort default alts
    vc_gnDefaultActive := true;
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
    }
reinaortega's avatar
reinaortega committed
        
garciay's avatar
garciay committed
    /**
     * @desc    Triggers event from the application layer
     * @param   p_event The event to trigger.
     */
    function f_utTriggerEvent(template (value) UtGnTrigger p_event) runs on ItsBaseGeoNetworking return boolean {
reinaortega's avatar
reinaortega committed
            
garciay's avatar
garciay committed
      // Variables
      var boolean v_return := true;
garciay's avatar
garciay committed
      //deactivate gnPort default alts
    vc_gnDefaultActive := false;
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
      utPort.send(p_event);
      tc_wait.start;
      alt {
	      [] utPort.receive(UtGnResults: { utGnTriggerResult := true }) {
          tc_wait.stop;
	      }
	      [] utPort.receive(UtGnResults: { utGnTriggerResult := false }) {
          tc_wait.stop;
          log("*** UtGnTriggerResult: INFO: UT trigger was not successful ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] a_utDefault() {
        }
        [] tc_wait.timeout {
        v_return := false;
reinaortega's avatar
reinaortega committed
        }
garciay's avatar
garciay committed
      }
            
      //activate gnPort default alts
    vc_gnDefaultActive := true;
            
      return v_return;
    }
reinaortega's avatar
reinaortega committed
        
garciay's avatar
garciay committed
  } // End of group utFunctions
garciay's avatar
garciay committed
  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
     */
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf01Up(Scenario p_scenario := e_staticPosition) runs on ItsGeoNetworking /* TITAN TODO: system ItsGeoNetworkingSystem */ {
            
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
            
      // Map
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      map(self:geoNetworkingPort, system:geoNetworkingPort);
            
      // Connect
      f_connect4SelfOrClientSync();
      activate(a_cf01Down());
            
      // Initialise secured mode
      f_initialiseSecuredMode();
            
      //Initialze the IUT
      f_initialState(p_scenario);
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
            
    } // end f_cf01Up
        
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf01Down() runs on ItsGeoNetworking /* TITAN TODO: system ItsGeoNetworkingSystem */ {
            
      f_uninitialiseSecuredMode();
            
      // Unmap
      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)
     *       - 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
     *
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf02Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeD, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf02Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;    
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
            
    } // end f_cf02Up
        
    /**
     * @desc Deletes configuration cf02
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf02Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc: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
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf03Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeC, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf03Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;   
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
            
    } // end f_cf03Up
        
    /**
     * @desc Deletes configuration cf03
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf03Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc: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
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf04Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeC, omit}, {c_compNodeD, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf04Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;   
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
            
    } // end f_cf04Up
        
    /**
     * @desc Deletes configuration cf04
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf04Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */{
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc:syncPort);
            
    } // end f_cf04Down
garciay's avatar
garciay committed
    /**
     * @desc This configuration features:
     *       - one ITS node (IUT)
     *       - one ITS node (NodeB)
     *       - one ITS node not in direction of NodeB and having
     *         longest distance to NodeB (NodeE)
     *       - Area1 which only includes NodeB, NodeD and IUT
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf05Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeE, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf05Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;   
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Deletes configuration cf05
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf05Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc:syncPort);
            
    } // end f_cf05Down
        
    /**
     * @desc This configuration features:
     *       - one ITS node (IUT)
     *       - one ITS node (NodeB)
     *       - one ITS node not in direction of NodeB and having
     *         shortest distance to NodeB (NodeF)
     *       - Area1 which only includes NodeB, NodeD and IUT
     *       - IUT not in sectorial area of NodeB-NodeF
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf06Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
garciay's avatar
garciay committed
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeF, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf06Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;   
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Deletes configuration cf06
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf06Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc:syncPort);
            
    } // end f_cf06Down
garciay's avatar
garciay committed
    /**
     * @desc This configuration features:
     *       - one ITS node (IUT)
     *       - one ITS node (NodeB)
     *       - one ITS node in direction of NodeB and having
     *         shortest distance to NodeB (NodeD)
     *       - Area1 which only includes NodeB, NodeD and IUT
     * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
     */
garciay's avatar
garciay committed
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf07Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc /* TITAN TODO mtc ItsMtc system ItsGeoNetworkingSystem */{
garciay's avatar
garciay committed
      // Variables
      var PositionTable v_positionTable := {};
      var GeoAreaTable v_areaTable := {};
      var ItsGeoNetworking v_component;
      var integer i;
            
      // Select components
    vc_componentTable := {{c_compNodeB, omit}, {c_compNodeD, omit}};
            
      // Create components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
      }
            
      // Map & Connect
      map(self:acPort, system:acPort);
      map(self:utPort, system:utPort);
      connect(self:syncPort, mtc:syncPort);
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        map(vc_componentTable[i].gnComponent:acPort, system:acPort);
        map(vc_componentTable[i].gnComponent:utPort, system:utPort);
        map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
            
      activate(a_cf07Down());
            
      //Initialze the IUT
      if(p_mainUtComponent == c_compMTC) {
        // Initialise secured mode
        f_initialiseSecuredMode();
garciay's avatar
garciay committed
        // MTC intializes IUT
        f_initialState(p_scenario);
      }
      else {
      v_component := f_getComponent(p_mainUtComponent);
        v_component.start(f_initialState(p_scenario));
        v_component.done;   
      }
            
      // Positions & Areas
      f_preparePositionsAndAreas(v_positionTable, v_areaTable);
            
      // Initialize components
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
        }
      }
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
        if (isvalue(vc_componentTable[i].gnComponent)) {
          vc_componentTable[i].gnComponent.done;
        }
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Deletes configuration cf06
     */
    //FIXME RGY Titan doesn't support mtc and system clauses yet
    function f_cf07Down() runs on ItsMtc /* TITAN TODO: mtc ItsMtc system ItsGeoNetworkingSystem */ {
            
      // Local variables
      var integer i;
            
      f_uninitialiseSecuredMode();
            
      // Unmap & Disconnect
      for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
        unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
        unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
        unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
        disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
      }
      unmap(self:acPort, system:acPort);
      unmap(self:utPort, system:utPort);
      disconnect(self:syncPort, mtc:syncPort);
            
    } // end f_cf0yDown
        
    /**
     * @desc    Behavior function for initializing component's variables and tables
     * @param   p_positionTable Table containing position vectors of all nodes
     * @param   p_areaTable     Table containing all defined geoAreas
     * @param   p_componentName Name of the component
     */
    function f_initialiseComponent(
                                   in PositionTable p_positionTable,
                                   in GeoAreaTable p_areaTable,
                                   in charstring p_componentName)
    runs on ItsGeoNetworking {
            
    vc_positionTable := p_positionTable;
    vc_areaTable := p_areaTable;
    vc_componentName := p_componentName;
            
    vc_localSeqNumber := f_getInitialSequenceNumber();
    vc_multipleMessagesCount := f_getMessageCount();
            
    } // end f_initialiseComponent
        
    /**
     * @desc    Makes the simulated ITS node behave as a neighbour of IUT
     */
    function f_startBeingNeighbour() runs on ItsGeoNetworking {
            
    vc_neighbourDefault := activate(a_neighbourDefault());
      f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader));
      f_sleepIgnoreDef(PX_NEIGHBOUR_DISCOVERY_DELAY);
    } // end f_startBeingNeighbour
        
    /**
     * @desc    Makes the simulated ITS node behave as not being a neighbour of IUT
     */
    function f_stopBeingNeighbour() runs on ItsGeoNetworking {
            
      f_acTriggerEvent(m_stopBeaconing);
      if (PICS_GN_SECURITY == true) {
        deactivate(vc_neighbourDefault);
      }
    } // end f_stopBeingNeighbour
        
    /**
     * @desc Initialise secure mode if required
     */
    function f_initialiseSecuredMode() runs on ItsBaseGeoNetworking {
      if ((PICS_GN_SECURITY == true) or (PICS_IS_IUT_SECURED == true)) {
        if(e_success != f_acEnableSecurity()){
          log("*** INFO: TEST CASE NOW STOPPING ITSELF! ***");
          stop;
        }
      }
    } // End of function f_initialiseSecuredMode()
        
    function f_uninitialiseSecuredMode() runs on ItsBaseGeoNetworking {
      if ((PICS_GN_SECURITY == true) or (PICS_IS_IUT_SECURED == true)) {
        f_acDisableSecurity();
      }
    } // End of function f_uninitialiseSecuredMode()
        
  } // end geoConfigurationFunctions
garciay's avatar
garciay committed
  group componentFunctions {
    /**
     * @desc    Get the component  corresponding to a key
     * @param   p_componentName   Name searched component
     * @return  ItsGeoNetworking - The searched position vector
     */
    function f_getComponent(
                            in charstring p_componentName
                            ) runs on ItsMtc
    return ItsGeoNetworking {
            
      var ItsGeoNetworking v_return := null;
      var integer i := 0;
            
      for (i:=0; i<lengthof(vc_componentTable); i:=i+1) {
        if (vc_componentTable[i].componentName == p_componentName) {
          if (isvalue(vc_componentTable[i].gnComponent)) {
          v_return := valueof(vc_componentTable[i].gnComponent);
          }
          else {
            testcase.stop(__SCOPE__ & " can not handle omitted GN components");
          }
        }
      }
            
      return v_return;
garciay's avatar
garciay committed
  }
garciay's avatar
garciay committed
  group geoPositionFunctions {
        
    /**
     * @desc   Prepare positions and areas tables according to general constellation 
     * @param p_positionTable  Position Table
     * @param p_areaTable      Area Table
     */
    function f_preparePositionsAndAreas(
                                        inout PositionTable p_positionTable,
                                        inout GeoAreaTable p_areaTable
                                        ) runs on ItsBaseGeoNetworking {
            
      var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA, v_longPosVectorNodeB, v_longPosVectorNodeC, v_longPosVectorNodeD, v_longPosVectorNodeE, v_longPosVectorNodeF;
            
      // Get positions
    v_longPosVectorIut := f_getIutLongPosVector();
    v_longPosVectorNodeA := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeA, c_latitudeFactorNodeA);
    v_longPosVectorNodeB := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeB, c_latitudeFactorNodeB);
    v_longPosVectorNodeC := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeC, c_latitudeFactorNodeC);
    v_longPosVectorNodeD := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeD, c_latitudeFactorNodeD);
    v_longPosVectorNodeE := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeE, c_latitudeFactorNodeE);
    v_longPosVectorNodeF := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeF, c_latitudeFactorNodeF);
            
      // Propagate GN addresses
    v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
    v_longPosVectorNodeB.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
    v_longPosVectorNodeC.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
    v_longPosVectorNodeD.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
    v_longPosVectorNodeE.gnAddr := f_getTsGnLocalAddress(c_compNodeE);
    v_longPosVectorNodeF.gnAddr := f_getTsGnLocalAddress(c_compNodeF);
            
      // Position table
      f_addPosition(p_positionTable, c_compIut, v_longPosVectorIut);
      f_addPosition(p_positionTable, c_compNodeA, v_longPosVectorNodeA);
      f_addPosition(p_positionTable, c_compNodeB, v_longPosVectorNodeB);
      f_addPosition(p_positionTable, c_compNodeC, v_longPosVectorNodeC);
      f_addPosition(p_positionTable, c_compNodeD, v_longPosVectorNodeD);
      f_addPosition(p_positionTable, c_compNodeE, v_longPosVectorNodeE);
      f_addPosition(p_positionTable, c_compNodeF, v_longPosVectorNodeF);
            
      // Area table
      f_addArea(p_areaTable, c_area1,
berge's avatar
berge committed
                f_computeCircularArea(v_longPosVectorNodeD, float2int(5.0 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
garciay's avatar
garciay committed
      f_addArea(p_areaTable, c_area2,
berge's avatar
berge committed
                f_computeCircularArea(v_longPosVectorNodeB, float2int(1.5 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));               
garciay's avatar
garciay committed
    }
garciay's avatar
garciay committed
    /**
     * @desc    Add a position vector in position table
     * @param   p_positionTable Position table to be updated
     * @param   p_positionKey   Reference key of the added position vector
     * @param   p_positionValue Added position vector
     */
    function f_addPosition(
                           inout PositionTable p_positionTable,
                           in charstring p_positionKey,
                           in LongPosVector p_positionValue
                           ) {
            
      p_positionTable[lengthof(p_positionTable)] := {
      key := p_positionKey,
      position := p_positionValue
      };
    }
    //FIXME RGY Titan doesn't support @deterministic yet   
    //        function @deterministic f_fillTimestamp(inout LongPosVector v_vector) 
    function f_fillTimestamp(inout LongPosVector v_vector) 
    return LongPosVector {
      if (v_vector.timestamp_ == 0) {
      v_vector.timestamp_ := f_computeGnTimestamp();
      }
      return v_vector;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Get the position vector corresponding to a key
     * @param   p_positionKey   Reference key of the searched position vector
     * @return  LongPosVector - The searched position vector
     */
    function f_getPosition(
                           in charstring p_positionKey
                           ) runs on ItsGeoNetworking
    return LongPosVector {
            
      var LongPosVector v_return;
      var integer i := 0;
garciay's avatar
garciay committed
      for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
        if (vc_positionTable[i].key == p_positionKey) {
        v_return := f_fillTimestamp(vc_positionTable[i].position);
garciay's avatar
garciay committed
      }
            
      /*Spirent removed*/            
      return v_return;
    }
    /**
     * @desc    Set the position vector corresponding to a ComponentNode
     * @param   p_compNode  Reference to the Component to be changed
     * @param   p_longPosVector - The new position vector
     */
garciay's avatar
garciay committed
    function f_changePositon(
                             in charstring p_compNode,
                             in LongPosVector p_longPosVector
                             ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
      var integer i := 0;
garciay's avatar
garciay committed
      for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
        if (vc_positionTable[i].key == p_compNode) {
          vc_positionTable[i].position := p_longPosVector;
          break;
wattelet's avatar
wattelet committed
        }
garciay's avatar
garciay committed
    /**
     * @desc    Compute a position based on reference point and distance factors
     * @param   p_refPosition       Reference point
     * @param   p_longitudeFactor   Number of DISTANCE_UNIT applied for computing longitude
     * @param   p_latitudeFactor    Number of DISTANCE_UNIT applied for computing latitude
     * @return  LongPosVector - Computed position
     * @see     PICS_GN_DEFAULT_MAX_COMMUNICATION_RANGE
     */
    function f_computePosition(
                               in LongPosVector p_refPosition,
                               in integer p_longitudeFactor,
                               in integer p_latitudeFactor
                               ) return LongPosVector {
            
      const integer c_distance2Gps := 100;
      var LongPosVector v_return := p_refPosition;                        
      var UInt32 v_distanceUnit := (c_distance2Gps * PICS_GN_DEFAULT_MAX_COMMUNICATION_RANGE) / 10;
            
    v_return.latitude := v_return.latitude + p_latitudeFactor * v_distanceUnit;
    v_return.longitude := v_return.longitude + p_longitudeFactor * v_distanceUnit;
    v_return.timestamp_ := f_computeGnTimestamp();
    v_return.pai := int2bit(1,1);
            
      return v_return;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Add a geoArea in geoArea table
     * @param   p_geoAreaTable  GeoArea table to be updated
     * @param   p_areaKey       Reference key of the added geoArea
     * @param   p_geoArea       Added geoArea
     */
    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
      };
    }
garciay's avatar
garciay committed
    /**
     * @desc    Get the geoArea corresponding to a key
     * @param   p_areaName   Reference key of the searched geoArea
     * @return  GeoArea - The serached geoArea
     */
    function f_getArea(
                       in charstring p_areaName
                       ) runs on ItsGeoNetworking
    return GeoArea {
      var GeoArea v_return;
      var integer i := 0;
            
      for (i:=0; i<lengthof(vc_areaTable); i:=i+1) {
        if (vc_areaTable[i].key == p_areaName) {
        v_return := vc_areaTable[i].geoArea;
        }
      }
            
      return v_return;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Get the geoBroadcastArea corresponding to a key
     * @param   p_areaName   Reference key of the searched geoBroadcastArea
     * @return  GeoBroadcastArea - The serached geoBroadcastArea
     */
    function f_getGeoBroadcastArea(in charstring p_areaName) runs on ItsGeoNetworking
    return GeoBroadcastArea {
      return f_geoArea2GeoBroadcastArea(f_getArea(p_areaName));
    }
garciay's avatar
garciay committed
    /**
     * @desc    Get the GeoAnycastArea corresponding to a key
     * @param   p_areaName   Reference key of the searched GeoAnycastArea
     * @return  GeoAnycastArea - The serached GeoAnycastArea
     */
    function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsGeoNetworking
    return GeoAnycastArea {
      return f_geoArea2GeoAnycastArea(f_getArea(p_areaName));
    }
garciay's avatar
garciay committed
    /**
     * @desc    Convert GeoArea type to GeoBroadcastArea
     * @param   p_area  GeoArea to be converted
     * @return  GeoBroadcastArea
     */
    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;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Convert GeoArea type to GeoAnycastArea
     * @param   p_area  GeoArea to be converted
     * @return  GeoAnycastArea
     */
    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;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Compute a square geoArea
     * @param   p_centerLongPosVector   Center point of the square area
     * @param   p_distanceA             Width of the square area in meters
     * @return  GeoArea - Computed geoArea
     */
    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
garciay's avatar
garciay committed
    }
            
      return v_geoArea;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Compute a circular geoArea
     * @param   p_centerLongPosVector   Center point of the square area
     * @param   p_distanceA             Radius of the square area in meters
     * @return  GeoArea - Computed geoArea
     */
    function f_computeCircularArea(
                                   in LongPosVector p_centerLongPosVector,
                                   in UInt16 p_distanceA
                                   ) return GeoArea {
garciay's avatar
garciay committed
      var GeoArea v_geoArea;
garciay's avatar
garciay committed
    v_geoArea := {
      shape := e_geoCircle,
      area := {
        geoAreaPosLatitude := p_centerLongPosVector.latitude,
        geoAreaPosLongitude := p_centerLongPosVector.longitude,
        distanceA := p_distanceA,
        distanceB := 0,
        angle := 0
tepelmann's avatar
tepelmann committed
        }
garciay's avatar
garciay committed
    }
            
      return v_geoArea;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Compute radius of an circular area
     * @param   p_squareMeters  Square meters of an circular area
     * @return  Computed radius in meters
     * @see     fx_computeRadiusFromCircularArea
     */
    function f_radiusFromCircularArea(
                                      in float p_squareMeters
                                      ) return float {
tepelmann's avatar
tepelmann committed
         
garciay's avatar
garciay committed
      //            log("*** f_distance: INFO: calling fx_computeRadiusFromCircularArea() ***");
      return fx_computeRadiusFromCircularArea(p_squareMeters);
    }
tepelmann's avatar
tepelmann committed
        
garciay's avatar
garciay committed
    /**
     * @desc    Compute distance between two points
     * @param   p_pointA    First point
     * @param   p_pointB    Second point
     * @return  Computed distance in meters
     * @see     fx_computeDistance
     */
    function f_distance(
                        in LongPosVector p_pointA,
                        in LongPosVector p_pointB
                        ) return float {
garciay's avatar
garciay committed
      //            log("*** f_distance: INFO: calling fx_computeDistance() ***");
      return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);
    }
garciay's avatar
garciay committed
  } // end geoPositionFunctions
garciay's avatar
garciay committed
  group geoAltsteps {
        
    /**
     * @desc The base default.
     */
    altstep a_default() runs on ItsGeoNetworking {
            
      var LongPosVector v_longPosVectorIut;
            
      [vc_gnDefaultActive] a_receiveLsRequest(
                                              ?, ?, v_longPosVectorIut
                                              ) {
        repeat;
      }
      [vc_gnDefaultActive] geoNetworkingPort.receive(
                                                     mw_geoNwInd(
                                                                 mw_geoNwSecPdu(
                                                                                mdw_securedMessage_CAMs,
                                                                                ?
                                                                                ))) {
        // Skip CAM messages
        log("*** a_default: WARNING: Skip secured CAM messages ***");
        repeat;
      }
      [vc_gnDefaultActive] geoNetworkingPort.receive {
        log("*** a_default: WARNING: Received an unexpected message ***");
        repeat;
      }
      [] tc_wait.timeout {
        log("*** a_default: ERROR: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
        f_selfOrClientSyncAndVerdict("error", e_timeout);
      }
      [] tc_ac.timeout {
        log("*** a_default: ERROR: Timeout while awaiting the reception of a message ***");
        f_selfOrClientSyncAndVerdict("error", e_timeout);
      }
      [] a_shutdown() {
        log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc    Neighbour default altstep (answers to LS Requests)
     */
    altstep a_neighbourDefault() runs on ItsGeoNetworking {
            
      [vc_gnDefaultActive] a_receiveLsRequestAndReply(
                                                      ?, f_getPosition(vc_componentName).gnAddr.mid,
                                                      f_getPosition(vc_componentName),
                                                      f_getPosition(vc_componentName)
                                                      ) {
        repeat;
      }
      [vc_componentName == c_compNodeB and vc_gnDefaultActive] a_receiveLsRequestAndReply(
                                                                                          ?, f_getPosition(c_compNodeA).gnAddr.mid,
                                                                                          f_getPosition(c_compNodeA),
                                                                                          f_getPosition(vc_componentName)
                                                                                          ) {
        repeat;
      }
      [] a_default() {
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc The default for handling upper tester messages.
     */
    altstep a_utDefault() runs on ItsBaseGeoNetworking {
      var UtGnEventInd v_ind;
      [vc_utDefaultActive] utPort.receive(UtGnEventInd:?) -> value v_ind {
        //store every upper tester indication received
        vc_utInds[lengthof(vc_utInds)] := v_ind;
        repeat;
      }
      [vc_utDefaultActive] utPort.receive {
        log("*** " & testcasename() & ": INFO: Received unexpected UT message from IUT ***");
        repeat;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf01 de-initialisation.
     */
    altstep a_cf01Down() runs on ItsGeoNetworking {
      [] a_shutdown() {
        f_poDefault();
        f_cf01Down();
        log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf02 de-initialisation.
     */
    altstep a_cf02Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf02Down();
        log("*** a_cf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf03 de-initialisation.
     */
    altstep a_cf03Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf03Down();
        log("*** a_cf03Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf04 de-initialisation.
     */
    altstep a_cf04Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf04Down();
        log("*** a_cf04Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf05 de-initialisation.
     */
    altstep a_cf05Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf05Down();
        log("*** a_cf05Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf06 de-initialisation.
     */
    altstep a_cf06Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf06Down();
        log("*** a_cf06Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }
garciay's avatar
garciay committed
    /**
     * @desc Default handling cf07 de-initialisation.
     */
    altstep a_cf07Down() runs on ItsMtc {
      [] a_shutdown() {
        f_cf07Down();
        log("*** a_cf07Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
        stop;
      }
    }        
    group geoGeoUnicastAltsteps {
            
      /**
       * @desc    Receive GeoUnicast packet
       * @param   p_sourceLongPosVec          Expected source position vector
       * @param   p_destinationShortPosVec    Expected destination position vector
       * @param   p_seqNumber                 Expected sequence number
       */
      altstep a_receiveGeoUnicast(
                                  in template (present) ShortPosVector p_destinationShortPosVec,
                                  in template (present) UInt16 p_seqNumber
                                  ) runs on ItsGeoNetworking {
berge's avatar
berge committed
                
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwUnicastPacket(
                                                                                                     p_destinationShortPosVec,
                                                                                                     p_seqNumber)))) {
        }
      }
berge's avatar
berge committed
            
garciay's avatar
garciay committed
      /**
       * @desc    Receive GeoUnicast packet for specific destination
       * @param   p_destinationShortPosVec    Expected destination position vector
       */
      altstep a_receiveGeoUnicastWithDestination(in template (present) ShortPosVector p_destinationShortPosVec) runs on ItsGeoNetworking {
berge's avatar
berge committed
                
garciay's avatar
garciay committed
        [vc_gnDefaultActive] a_receiveGeoUnicast(p_destinationShortPosVec, ?) {}
      }
garciay's avatar
garciay committed
      /**
       * @desc Receive any GeoUnicast packet
       */
      altstep a_receiveAnyGeoUnicast() runs on ItsGeoNetworking {
berge's avatar
berge committed
                
garciay's avatar
garciay committed
        [vc_gnDefaultActive] a_receiveGeoUnicast(?, ?) {}
      }
            
    } // end geoGeoUnicastAltsteps
        
    group geoGeoBroadcastAltsteps {
            
      /**
       * @desc Receive GeoBroadcast packet
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_seqNumber         Expected sequence number
       */
      altstep a_receiveGeoBroadcast(
                                    in template (present) LongPosVector p_srcLongPosVec,
                                    in template (present) UInt16 p_seqNumber
                                    ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacket(
                                                                                                       p_srcLongPosVec,
                                                                                                       p_seqNumber
                                                                                                       )))) {
        }
      }
            
      /**
       * @desc Receive GeoBroadcast packet with specific Area and HopLimit
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_seqNumber         Expected sequence number
       * @param   p_broadcastArea     Expected geoBroadcastArea
       * @param   p_routerHopLimit    Expected router hop limit
       * @param   p_maxHopLimit       Expected max hop limit (Default: ?)
       */
      altstep a_receiveGeoBroadcastWithAreaWithHopLimit(
                                                        in template (present) LongPosVector p_srcLongPosVec,
                                                        in template (present) UInt16 p_seqNumber,
                                                        in template (present) GeoBroadcastArea p_broadcastArea,
                                                        in template (present) UInt8 p_routerHopLimit,
                                                        in template (present) UInt8 p_maxHopLimit := ?
                                                        ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithAreaAndHl(
                                                                                                                    p_srcLongPosVec,
                                                                                                                    p_seqNumber,
                                                                                                                    p_broadcastArea,
                                                                                                                    p_maxHopLimit
                                                                                                                    ),
                                                                               -,
                                                                               p_routerHopLimit
                                                                               ))) {
        }
      }
            
      /**
       * @desc Receive GeoBroadcast packet for specific Geobroadcast Area
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_seqNumber         Expected sequence number
       * @param   p_broadcastArea     Expected geoBroadcastArea
       */
      altstep a_receiveGeoBroadcastWithArea(
                                            in template (present) LongPosVector p_srcLongPosVec,
                                            in template (present) UInt16 p_seqNumber,
                                            in template (present) GeoBroadcastArea p_broadcastArea
                                            ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                                                                                               p_srcLongPosVec,
                                                                                                               p_seqNumber,
                                                                                                               p_broadcastArea
                                                                                                               )))) {
        }
      }
            
    } // end geoGeoBroadcastAltsteps
        
    group geoGeoAnycastAltsteps {
            
      /**
       * @desc Receive GeoAnycast packet
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_senderLongPosVec  Expected sender position vector
       * @param   p_seqNumber         Expected sequence number
       */
      altstep a_receiveGeoAnycast(
                                  in template (present) LongPosVector p_srcLongPosVec,
                                  in template (present) LongPosVector p_senderLongPosVec,
                                  in template (present) UInt16 p_seqNumber
                                  ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacket(
                                                                                                     p_srcLongPosVec,
                                                                                                     p_seqNumber
                                                                                                     )))) {
        }
      }
            
      /**
       * @desc Receive GeoAnycast packet with specific Area and HopLimit
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_senderLongPosVec  Expected sender position vector
       * @param   p_seqNumber         Expected sequence number
       * @param   p_anycastArea       Expected geoAnycastArea
       * @param   p_hopLimit          Expected hop limit
       * @param   p_maxHopLimit       Expected max hop limit (Default: ?)
       */
      altstep a_receiveGeoAnycastWithAreaWithHopLimit(
                                                      in template (present) LongPosVector p_srcLongPosVec,
                                                      in template (present) UInt16 p_seqNumber,
                                                      in template (present) GeoAnycastArea p_anycastArea,
                                                      in template (present) UInt8 p_hopLimit,
                                                      in template (present) UInt8 p_maxHopLimit := ?
                                                      ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                                                                                             p_srcLongPosVec,
                                                                                                             p_seqNumber,
                                                                                                             p_anycastArea
                                                                                                             ),
                                                                               -,
                                                                               p_hopLimit
                                                                               ))) {
        }
      }
            
      /**
       * @desc Receive GeoAnycast packet for specific GeoAnycast Area
       * @param   p_srcLongPosVec     Expected source position vector
       * @param   p_senderLongPosVec  Expected sender position vector
       * @param   p_seqNumber         Expected sequence number
       * @param   p_anycastArea       Expected geoAnycastArea
       */
      altstep a_receiveGeoAnycastWithArea(
                                          in template (present) LongPosVector p_srcLongPosVec,
                                          in template (present) UInt16 p_seqNumber,
                                          in template (present) GeoAnycastArea p_anycastArea
                                          ) runs on ItsGeoNetworking {
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                                                                                             p_srcLongPosVec,
                                                                                                             p_seqNumber,
                                                                                                             p_anycastArea
                                                                                                             )))) {
        }
      }
            
    } // end geoGeoAnycastAltsteps
        
    group geoLocationServiceAltsteps {
            
      /**
       * @desc    Receive Location Service Request
       * @param   p_seqNumber Expected sequence number of the received LS Request
       * @param   p_gnAddress GN address expected in received LS Request
       * @param   p_reqSrcPosVector Expected source position vector of the received LS Request
       */
      altstep a_receiveLsRequest(
                                 in template (present) UInt16 p_seqNumber,
                                 in template (present) GN_Address.mid p_mid,
                                 out LongPosVector p_reqSrcPosVector
                                 ) runs on ItsGeoNetworking {
        var GeoNetworkingInd v_msg;
garciay's avatar
garciay committed
        [vc_gnDefaultActive] geoNetworkingPort.receive(
                                                       mw_geoNwInd(
                                                                   mw_geoNwPdu(
                                                                               mw_geoNwLsRequestPacket(
                                                                                                       p_seqNumber,
                                                                                                       p_mid
                                                                                                       )
                                                                               )
                                                                   )
                                                       ) -> value v_msg {
        p_reqSrcPosVector := valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector);
        }
      }
            
      /**
       * @desc Receive any Location Service Request
       */
      altstep a_receiveAnyLsRequest() runs on ItsGeoNetworking {
        var LongPosVector v_reqSrcPosVector;
garciay's avatar
garciay committed
        [vc_gnDefaultActive] a_receiveLsRequest(?, ?, v_reqSrcPosVector) {}
      }
            
      /**
       * @desc Receive any Location Service Reply
       */
      altstep a_receiveAnyLsReply() runs on ItsGeoNetworking {
        [vc_gnDefaultActive] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwLsReplyPacket(?, ?) ))) {
          //ignore and repeat
          repeat;
        }
      }
            
      /**
       * @desc Receive Location Service Request and send Location Service Reply
       * @param   p_reqSeqNumber          Expected sequence number of the received LS Request
       * @param   p_gnAddress             GN address expected in received LS Request
       * @param   p_repSrcPosVector       Source position vector of the sent LS Response
       * @param   p_repSenderPosVector    Sender position vector of the sent LS Response
       */
      altstep a_receiveLsRequestAndReply(
                                         in template (present) UInt16 p_reqSeqNumber,
                                         in template (value) GN_Address.mid p_mid,
                                         in template (value) LongPosVector p_repSrcPosVector,
                                         in template (value) LongPosVector p_repSenderPosVector
                                         ) runs on ItsGeoNetworking {
        var LongPosVector v_repDstPosVector;
garciay's avatar
garciay committed
        [vc_gnDefaultActive] a_receiveLsRequest(p_reqSeqNumber, p_mid, v_repDstPosVector) {
          f_sendGeoNetMessage(valueof(m_geoNwReq_linkLayerBroadcast(m_geoNwPdu(
                                                                               m_geoNwLsReplyPacket(
                                                                                                    p_repSrcPosVector,
                                                                                                    f_longPosVector2ShortPosVector(v_repDstPosVector),
                                                                                                    vc_localSeqNumber
                                                                                                    )))));
        }
      }
garciay's avatar
garciay committed
    } // end geoLocationServiceAltsteps
garciay's avatar
garciay committed
  } // end geoAltsteps
garciay's avatar
garciay committed
  group preambles {
        
    /**
     * @desc The default preamble.
     */
    function f_prDefault() runs on ItsGeoNetworking {
      activate(a_default());
      activate(a_utDefault());
    }
garciay's avatar
garciay committed
    /**
     * @desc Preamble for non-neighbour nodes
     */
    function f_prNonNeighbour() runs on ItsGeoNetworking {
      f_prDefault();
    }
garciay's avatar
garciay committed
    /**
     * @desc Preamble for neighbour nodes
     */
    function f_prNeighbour() runs on ItsGeoNetworking {
      f_prDefault();
      f_startBeingNeighbour();
      f_sleep(0.5);
    }
garciay's avatar
garciay committed
    /**
     * @desc Brings the IUT into an initial state.
     * @remark Component variable vc_hashedId8ToBeUsed shall be set with the IUT certificate to be used
     */
    function f_initialState(Scenario p_scenario := e_staticPosition) runs on ItsBaseGeoNetworking {
            
      if (PICS_GN_SECURITY) {
        var Oct8 v_hashedId8ToBeUsed := f_setupIutCertificate(vc_hashedId8ToBeUsed);
        if (oct2int(v_hashedId8ToBeUsed) == 0) {
        v_hashedId8ToBeUsed := 'FFFFFFFFFFFFFFFF'O; // Reset to unknown value, the IUT will use its own certificates
        }
        f_utInitializeIut(m_secGnInitialize(v_hashedId8ToBeUsed));
      } // else, default behavior
      else {
        f_utInitializeIut(m_gnInitialize);
      }
            
      f_acLoadScenario(p_scenario);
      f_acStartScenario();
    }
garciay's avatar
garciay committed
    /**
     * @desc    Receive and reply to LS Requests
     * @param   p_reqSeqNumber          Expected sequence number of the received LS Request
     * @param   p_gnAddress             GN address expected in received LS Request
     * @param   p_repSrcPosVector       Source position vector of the sent LS Response
     * @param   p_repSenderPosVector    Sender position vector of the sent LS Response
     */
    function f_handleLocationService(
                                     in template (present) UInt16 p_reqSeqNumber,
                                     in template (value) GN_Address.mid p_mid,
                                     in template (value) LongPosVector p_repSrcPosVector,
                                     in template (value) LongPosVector p_repSenderPosVector
                                     ) runs on ItsGeoNetworking {
            
      tc_ac.start;
      alt {
        [] a_receiveLsRequestAndReply(p_reqSeqNumber, p_mid, p_repSrcPosVector, p_repSenderPosVector) {
          tc_ac.stop;
        }
      }
garciay's avatar
garciay committed
    }
garciay's avatar
garciay committed
    /**
     * @desc    Send LS request and receive LS Reply
     * @param   p_reqSrcPosVector   Source position vector of the sent LS Request
     * @param   p_reqSeqNumber      Sequence number of the sent LS Request
     * @param   p_gnAddress         GN address for which the LS Request is sent
     * @param   p_repSrcPosVector   Expected source position vector in received LS Response
     * @return  FncRetCode
     */
    function f_processLocationService(
                                      in template (value) LongPosVector p_reqSrcPosVector,
                                      in template (value) UInt16 p_reqSeqNumber,
                                      in template (value) GN_Address p_gnAddress,
                                      out LongPosVector p_repSrcPosVector
                                      ) runs on ItsGeoNetworking return FncRetCode {
      var FncRetCode v_ret := e_error;
      var GeoNetworkingInd v_msg;
            
      f_sendGeoNetMessage(
                          valueof(
                                  m_geoNwReq_linkLayerBroadcast(
                                                                m_geoNwPdu(
                                                                           m_geoNwLsRequestPacket(
                                                                                                  p_reqSrcPosVector,
                                                                                                  p_reqSeqNumber,
                                                                                                  p_gnAddress
                                                                                                  )
                                                                           )
                                                                )
                                  )
                          );
            
      tc_ac.start;
      alt {
        [] geoNetworkingPort.receive(
                                     mw_geoNwInd(
                                                 mw_geoNwPdu(
                                                             mw_geoNwLsReplyPacket(
                                                                                   ?,
                                                                                   mw_shortPosVectorPosition(f_longPosVector2ShortPosVector(valueof(p_reqSrcPosVector)))
                                                                                   )
                                                             )
                                                 )
                                     ) -> value v_msg {
          tc_ac.stop;
        p_repSrcPosVector := valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsReplyHeader.srcPosVector);
        v_ret := e_success;
        }
      }
            
      return v_ret;
    }
garciay's avatar
garciay committed
  } // end preambles
garciay's avatar
garciay committed
  group postambles {
garciay's avatar
garciay committed
    /**
     * @desc The default postamble.
     */
    function f_poDefault() runs on ItsGeoNetworking {
      f_acStopScenario();
    }
garciay's avatar
garciay committed
    /**
     * @desc Postamble for neighbour nodes
     */
    function f_poNeighbour() runs on ItsGeoNetworking {
      f_stopBeingNeighbour();
      f_poDefault();
    }
garciay's avatar
garciay committed
  } // end postambles
garciay's avatar
garciay committed
  group adapterControl {
garciay's avatar
garciay committed
    /**
     * @desc    Triggers event in the test system adaptation.
     * @param   p_event The event to trigger
     * @return  FncRetCode
     */
    function f_acTriggerEvent(template (value) AcGnPrimitive p_event) runs on ItsBaseGeoNetworking return FncRetCode {
      var FncRetCode v_ret := e_success;
garciay's avatar
garciay committed
      acPort.send(p_event);
garciay's avatar
garciay committed
      return v_ret;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Get the position vector corresponding to a specific GN address
     * @param   p_gnAddress     GN address for which the search is performed
     * @return  LongPosVector - IUT's position
     */
    function f_acGetLongPosVector(GN_Address p_gnAddress) runs on ItsBaseGeoNetworking return LongPosVector {
      var AcGnResponse v_result;
garciay's avatar
garciay committed
      f_acTriggerEvent(m_getLongPosVector(p_gnAddress));
      tc_ac.start;
      alt {
        [] acPort.receive(mw_getLongPosVectorAny(p_gnAddress)) -> value v_result {
          tc_ac.stop;
garciay's avatar
garciay committed
        [] acPort.receive {
          tc_ac.stop;
          log("*** f_acGetLongPosVector: ERROR: Received unexpected message ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_ac.timeout {
          log("*** f_acGetLongPosVector: ERROR: Timeout while waiting for adapter control event result ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
            
      return v_result.getLongPosVector;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Triggers test adapter to send beacons for multiple neighbours
     * @param   p_numberOfNeighbour Number of neighbours to simulate
     * @return  FncRetCode
     */
    function f_acStartBeaconingMultipleNeighbour(in integer p_numberOfNeighbour) runs on ItsGeoNetworking return FncRetCode {
garciay's avatar
garciay committed
      return f_acTriggerEvent(m_startBeaconingMultipleNeighbour(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader, p_numberOfNeighbour));
garciay's avatar
garciay committed
    }
garciay's avatar
garciay committed
    /**
     * @desc    Triggers test adapter to enable security support
     * @return  FncRetCode
     */
    function f_acEnableSecurity() runs on ItsBaseGeoNetworking return FncRetCode {
garciay's avatar
garciay committed
      // Local variables
garciay's avatar
garciay committed
      // Load certificates
      if (PICS_GN_SECURITY) {
        if( not f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) ) {
          return e_error;
garciay's avatar
garciay committed
                
        // Initialize vc_location
        f_setGenerationLocation(
                                f_getTsLatitude(),
                                f_getTsLongitude()
                                );
        return f_acTriggerSecEvent(m_acEnableSecurity(cc_taCert_A));
      }
      return f_acTriggerSecEvent(m_acEnableSecurity(PX_CERT_FOR_TS));
    }
garciay's avatar
garciay committed
    /**
     * @desc    Triggers test adapter to disable security support
     * @return  FncRetCode
     */
    function f_acDisableSecurity() runs on ItsBaseGeoNetworking return FncRetCode {
garciay's avatar
garciay committed
      f_unloadCertificates();
garciay's avatar
garciay committed
      return f_acTriggerSecEvent(m_acDisableSecurity);
garciay's avatar
garciay committed
    }
garciay's avatar
garciay committed
    /**
     * @desc    Triggers event in the test system adaptation.
     * @param   p_event The event to trigger
     * @return  FncRetCode
     */
    function f_acTriggerSecEvent(
                                 in template (value) AcSecPrimitive p_event
                                 ) runs on ItsBaseGeoNetworking return FncRetCode {
      var FncRetCode v_ret := e_success;
            
      acPort.send(p_event);
      tc_ac.start;
      alt {
        [] acPort.receive(m_acSecResponseSuccess) {
          tc_ac.stop;
        }
        [] acPort.receive {
          tc_ac.stop;
          log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_ac.timeout {
          log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
            
      return v_ret;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Triggers event in the test system adaptation.
     * @param   p_event The event to trigger
     * @return  FncRetCode
     */
    function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsBaseGeoNetworking return FncRetCode {
      var FncRetCode v_ret := e_success;
garciay's avatar
garciay committed
      acPort.send(p_event);
      tc_ac.start;
      alt {
        [] acPort.receive(m_acGnssResponseSuccess) {
          tc_ac.stop;
garciay's avatar
garciay committed
        [] acPort.receive {
          tc_ac.stop;
          log("*** f_acTriggerEvent: ERROR: Received unexpected message ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_ac.timeout {
          log("*** f_acTriggerEvent: ERROR: Timeout while waiting for adapter control event result ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
garciay's avatar
garciay committed
      return v_ret;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Loads the given scenario
     * 
     * @param   p_scenario   The scenario to load.
     */
    function f_acLoadScenario(Scenario p_scenario) runs on ItsBaseGeoNetworking {
            
      if (PX_GNSS_SCENARIO_SUPPORT==true) {
        f_acTriggerGnssEvent(m_loadScenario(p_scenario));
      }
    } // end f_acLoadScenario
        
    /**
     * @desc    Starts a loaded scenario
     */
    function f_acStartScenario() runs on ItsBaseGeoNetworking {
            
      if (PX_GNSS_SCENARIO_SUPPORT==true) {
        f_acTriggerGnssEvent(m_startScenario);
      vc_scenarioStarted := true;
      }
    } // end f_acStartScenario
        
    /**
     * @desc    Stops a loaded scenario
     */
    function f_acStopScenario() runs on ItsBaseGeoNetworking {
            
      if (PX_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
        f_acTriggerGnssEvent(m_stopScenario);
      vc_scenarioStarted := false;
      }
    } // end f_acStopScenario
        
  } // end adapterControl
garciay's avatar
garciay committed
  group commonFunctions {
        
    /**
     * @desc    Gets the value of the lifetime in seconds.
     * @param   p_lifetime Lifetime to be converted
     * @return  Lifetime in seconds
     */
    function f_getLifetimeValue(in Lifetime p_lifetime) runs on ItsGeoNetworking return float {
      var float v_lifetime := 0.0;
garciay's avatar
garciay committed
      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;
      }
      }
garciay's avatar
garciay committed
      return v_lifetime;
    }
garciay's avatar
garciay committed
    /**
     * @desc    Computes GN timestamp based on current time
     * @return  Unix-Epoch-Time mod 2^32
     */
    function f_computeGnTimestamp() return UInt32 {