/** * @author ETSI / STF405 * @version $URL$ * $Id$ * @desc Module containing functions for DENM * */ module LibItsDenm_Functions { // LibIts import from LibIts_TestSystem all; import from LibIts_Interface all; import from LibItsDenm_TypesAndValues all; import from LibItsDenm_Templates all; import from CAM_PDU_Descriptions language "ASN.1:1997" all; import from DENM_PDU_Descriptions language "ASN.1:1997" all; // LibCommon import from LibCommon_VerdictControl all; /** * @desc Create Facility component and connects DENM port * @remark Only used when ItsFa is a PTC * @param p_ptcDenm returned Facility component variable */ function f_ptcDenmUp(out ItsFa p_ptcDenm) { // Create Facility component p_ptcDenm := ItsFa.create("DENM Tester"); // map ports map(p_ptcDenm:denmPort, system:denmPort); map(p_ptcDenm:utPort, system:utPort); } // end f_ptcDenmUp /** * @desc Wait for component to finish and unmap DENM ports * @remark Only used when ItsFa is a PTC * @param p_camPtc Facility component variable */ function f_ptcDenmDown(in ItsFa p_ptcDenm) runs on ItsMtc { tc_guard.start; alt { [] p_ptcDenm.done { tc_guard.stop; } [] tc_guard.timeout { log("*** f_ptcDenmDown: ERROR: Timeout while waiting for component ***"); setverdict(inconc); } } unmap(p_ptcDenm:denmPort); unmap(p_ptcDenm:utPort); } // end f_ptcDenmDown group altsteps { /** * @desc The base default. */ altstep a_default() runs on ItsFa { [] denmPort.receive { setverdict (inconc, "Received an unexpected message"); //TODO shall stop be called here? stop; } [] tc_wait.timeout { setverdict (inconc, "Timeout while awaiting reaction of the IUT prior to Upper Tester action"); //TODO shall stop be called here? stop; } [] tc_ac.timeout { setverdict (inconc, "Timeout while awaiting the reception of a message"); //TODO shall stop be called here? stop; } } } // end group altsteps group preambles { /** * @desc The default preamble. */ function f_prDefault() runs on ItsFa { vc_default := activate(a_default()); } /** * @desc Brings the IUT into an initial state. * @return */ function f_prInitialState() runs on ItsFa return FncRetCode { var FncRetCode v_ret := e_success; f_prDefault(); //TODO raise action or send message via port f_setVerdictPreOrPostamble(v_ret); return v_ret; } } // end group preambles group postambles { /** * @desc The default postamble. */ function f_poDefault() runs on ItsFa { var FncRetCode v_ret := e_success; //empty f_setVerdictPreOrPostamble(v_ret); } /** * @desc Postamble including cancellation of an event. * @param p_trigger Indicates if the cancellation have to be raised by the test system(e_ets) or at the application layer of the IUT(e_iut). * @param p_event The event to cancel. * @verdict */ function f_poCancelEvent(template (value) Trigger p_trigger, template (value) Situation p_event) runs on ItsFa { var FncRetCode v_ret := e_success; if (valueof(p_trigger) == e_ets) { f_sendDenMessage( m_denmReq( m_denmPdu( m_denmWithCause(c_dataVersionCancellation, p_event, f_getCurrentPosition(), f_getStationId()) ) ) ); } else { v_ret := f_utTriggerEvent(m_utEventCancellation(p_event, c_dataVersionCancellation)); } f_setVerdictPreOrPostamble(v_ret); f_poDefault(); } } // end group postambles group eventFunctions { /** * @desc Triggers event from the application layer * @param p_event The event to trigger. * @return */ function f_utTriggerEvent(template (value) UtEvent p_event) runs on ItsFa return FncRetCode { var FncRetCode v_ret := e_success; var template (value) UtTrigger v_utMsg := { p_event }; utPort.send(v_utMsg); return v_ret; } /** * @desc Checks that the event was indicated at the application layer * @param p_event The event to check. * @return */ function f_utCheckEvent(template (value) UtEvent p_event) runs on ItsFa return FncRetCode { var FncRetCode v_ret := e_success; var template (value) UtCheck v_utMsg := { p_event }; utPort.send(v_utMsg); tc_ac.start; alt { [] utPort.receive(UtResult:true) { setverdict (pass, "Event correctly indicated at application layer"); v_ret := e_success; } [] utPort.receive { setverdict (fail, "Event not correctly indicated at application layer"); v_ret := e_error; } [] tc_ac.timeout { setverdict (inconc, "Timeout while waiting for event check result"); v_ret := e_timeout; } } return v_ret; } } // end group eventFunctions group sendFunctions { /** * @desc Sends a DEN message * @param p_sendMsg The DEN message to send. * @return */ function f_sendDenMessage(template (value) DenmReq p_sendMsg) runs on ItsFa { p_sendMsg.msgOut.denm.management.actionID.sequenceNo := vc_sequenceNo; denmPort.send(p_sendMsg); } } // end sendFunctions group receiveFunctions { /** * @desc Awaits a DEN message * @param p_rcvMsg The expected message to be received. * @return */ function f_awaitDenMessage(template (present) DenmInd p_rcvMsg) runs on ItsFa return FncRetCode { var DenmInd v_denmInd; return f_awaitDenMessageOut(p_rcvMsg, v_denmInd); } /** * @desc Awaits a DEN message * @param p_rcvMsg The expected message to be received. * @param p_rcvdMsg The received message - OUT. * @return */ function f_awaitDenMessageOut(in template (present) DenmInd p_rcvMsg, out DenmInd p_rcvdMsg) runs on ItsFa return FncRetCode { var FncRetCode v_ret := e_timeout; tc_ac.start; alt { [] denmPort.receive(p_rcvMsg) -> value p_rcvdMsg { tc_ac.stop; v_ret := e_success; } [] tc_ac.timeout { log("Timeout while awaiting the reception of a message"); v_ret := e_timeout; } } return v_ret; } } // end receiveFunctions group getFunctions { group iutGetFunctions { } // end iutGetFunctions group testerGetFunctions { /** * @desc Gets the station identifier of IUT. * @return */ function f_getIutDefaultEventDuration() return TimeStamp { var TimeStamp v_iutDefaultEventDuration := 0; //TODO get the value from PIXIT or MIB return v_iutDefaultEventDuration; } } // end testerGetFunctions // TODO: Clean up /** * @desc Gets the station identifier of IUT. * @return */ function f_getStationId() return StationID { var StationID v_stationId := 0; //TODO get the value from PIXIT or MIB return v_stationId; } /** * @desc Gets the position of the test system. * @return */ function f_getCurrentPosition() return DecentralizedSituationLocation.eventPosition { var DecentralizedSituationLocation.eventPosition v_eventPos := { eventPositionCurrentDefinition := { refPosition := { longitude := {hemisphere := east, degree := 0}, latitude := {hemisphere := north, degree := 0}, elevation := 0, heading := omit, streetName := omit, positionConfidence := omit, elevationConfidence := omit, roadSegmentID :=0 }, eventSpeed := omit } }; //TODO get the value from PIXIT or ... return v_eventPos; } /** * @desc Gets the current time * @return */ function f_getCurrentTime() return TimeStamp { var TimeStamp v_timeStamp := 0; //TODO get the value from xf ... return v_timeStamp; } } // end group getFunctions } // end LibItsDenm_Functions