/** * @author ETSI / STF405 * @version $URL$ * $Id$ * @desc Module containing common functions for ITS CAM * */ module LibItsCam_Functions { // LibCommon import from LibCommon_Sync all; import from LibCommon_VerdictControl all; // LibIts import from LibItsCam_TestSystem all; import from LibItsCam_Templates all; import from LibItsCam_Pixits all; import from LibItsCam_TypesAndValues all; import from LibItsCommon_Functions all; import from CAM_PDU_Descriptions language "ASN.1:1997" all; import from DENM_PDU_Descriptions language "ASN.1:1997" all; group utFuntions { /** * @desc Requests to bring the IUT in an initial state * @param p_init The initialisation to trigger. */ function f_utInitializeIut(template (value) UtInitialize p_init) runs on ItsCam { utPort.send(p_init); tc_wait.start; alt { [] utPort.receive(UtResult:true) { 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); } [else] { // Shortcut defaults repeat; } } } /** * @desc Triggers event from the application layer * @param p_event The event to trigger. */ function f_utTriggerEvent(template (value) UtEvent p_event) runs on ItsCam { var template (value) UtTrigger v_utMsg := { p_event }; utPort.send(v_utMsg); alt { [] utPort.receive(UtResult:true) { tc_wait.stop; } [] utPort.receive { tc_wait.stop; } [] tc_wait.timeout { } [else] { // Shortcut defaults repeat; } } } /** * @desc Checks that the event was indicated at the application layer * @param p_event The event to check. * @param p_discard The event should not appear. Default value: FALSE. */ function f_utCheckEvent(template (value) UtEvent p_event, boolean p_discard) runs on ItsCam { var template (value) UtCheck v_utMsg := { p_event }; utPort.send(v_utMsg); tc_wait.start; alt { [] utPort.receive(UtResult:true) { tc_wait.stop; if (p_discard == false) { log("*** f_utCheckEvent: INFO: Event correctly indicated at application layer ***"); } else { log("*** f_utCheckEvent: ERROR: Event indicated at application layer where it should be discarded ***"); f_selfOrClientSyncAndVerdict("error", e_error); } } [] utPort.receive(UtResult:false) { tc_wait.stop; if (p_discard == false) { log("*** f_utCheckEvent: ERROR: Event not correctly indicated at application layer ***"); f_selfOrClientSyncAndVerdict("error", e_error); } else { log("*** f_utCheckEvent: INFO: Event not indicated at application layer***"); } } [] tc_wait.timeout { log("*** f_utCheckEvent: ERROR: Timeout while waiting for event check result ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } [else] { // Shortcut defaults repeat; } } } } // End of group utFunctions group camConfigurationFunctions { /** * @desc Setups default configuration */ function f_cfUp() runs on ItsCam { map(self:utPort, system:utPort); map(self:camPort, system:camPort); f_connect4SelfOrClientSync(); } // end f_cfUp /** * @desc Deletes default configuration */ function f_cfDown() runs on ItsCam { unmap(self:utPort, system:utPort); unmap(self:camPort, system:camPort); f_disconnect4SelfOrClientSync(); } // end f_cfDown } // end of camConfigurationFunctions group defaults { /** * @desc basic default behaviour handling */ altstep a_default() runs on ItsCam { [] camPort.receive(mw_camInd ( mw_camMsg_any )){ log("*** a_default: INFO: CAM message received in default ***"); vc_camReceived := true; repeat; } [] camPort.receive { log("*** a_default: ERROR: event received on CAM port in default ***"); f_selfOrClientSyncAndVerdict("error", e_error); } [] any timer.timeout { log("*** a_default: INCONC: a timer expired in default ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } [] a_shutdown() { f_poDefault(); f_cfDown(); log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); stop; } }//end altstep a_basicDefault } // end of defaults group preambles { /** * @desc Initialize the IUT * @remark No specific actions specified in the base standard */ function f_prInitialState() runs on ItsCam { f_utInitializeIut(m_camInitialize); // basic default altstep activate(a_default()); } // end f_prInitialState } // end of preambles group postambles { /** * @desc The default postamble. */ function f_poDefault() runs on ItsCam { //empty } } // end group postambles group otherFunctions { /** @desc function to generate a random bitstring value * corresponding to 1 bit position set to 1 (eg '00010000', '01000000', ...) * @see f_random * @param p_length bitstring length - max 15 * @return bitstring * */ function f_bitPositionRandom( in integer p_length ) return bitstring { //Variables var bitstring v_random := '1'B; var integer i := 0; for(i:=0; i < (p_length - 1); i:=i+1) { v_random := '0'B & v_random; } v_random := v_random << f_random(0, (p_length - 1)); log("*** f_bitPositionRandom: INFO: OK - random value = " & bit2str(v_random) & " ***"); return v_random; } // end function f_bitPositionRandom } // end group otherFunctions group getIutFunctions { /** * @desc Function to get the PT Line Description * @see PX_PTLINE_COURSE, PX_PTLINE_REF, PX_PTLINE_ROUTE */ function f_getIutPtLineDescription() return PTLineDescription { var PTLineDescription v_ptLineDescription := {"", "", ""}; v_ptLineDescription := {PX_PTLINE_COURSE, PX_PTLINE_REF, PX_PTLINE_ROUTE}; return v_ptLineDescription ; } // end function f_getIutPtLineDescription } // end getIutFunctions group getTesterFunctions { /** * @desc Gets tester's station characteristics * @return Station characteristics * @see PX_TESTER_IS_MOBILE, PX_TESTER_IS_PRIVATE, PX_TESTER_IS_PHYSICAL_RELEVANT */ function f_getTesterStationCharacteristics() return CoopAwareness.stationCharacteristics { var CoopAwareness.stationCharacteristics v_stationCharacteristics := { true, true, true }; v_stationCharacteristics := {PX_TESTER_IS_MOBILE, PX_TESTER_IS_PRIVATE, PX_TESTER_IS_PHYSICAL_RELEVANT}; return v_stationCharacteristics ; } // end f_getTesterStationCharacteristics /** * @desc Creates a valid CAM for tester */ function f_getTesterValidCam() return template (value) CamPdu { var CoopAwareness.stationCharacteristics v_stationCharacteristics; if(PX_TESTER_IS_MOBILE == false) { // basic IRS v_stationCharacteristics := {false, PX_TESTER_IS_PRIVATE, PX_TESTER_IS_PHYSICAL_RELEVANT}; return m_camMsg_irs( f_getCurrentTime(), f_getTsStationId(), v_stationCharacteristics, m_tsPosition ); } else { // Vehicle v_stationCharacteristics := {true, PX_TESTER_IS_PRIVATE, PX_TESTER_IS_PHYSICAL_RELEVANT}; return m_camMsg_vehicle( f_getCurrentTime(), f_getTsStationId(), v_stationCharacteristics, m_tsPosition ); } } // end f_getTesterValidCam } // end getTesterFunctions } // end LibItsCam_Functions