LibItsDenm_Functions.ttcn 15.2 KB
Newer Older
/**
 *	@author 	ETSI / STF405
berge's avatar
berge committed
 *  @version 	$URL$
 *				$Id$
 *	@desc		Module containing functions for DENM
 *
 */
module LibItsDenm_Functions {
berge's avatar
berge committed
    // LibIts
    import from LibIts_TestSystem all;
    import from LibIts_Interface all; 
tepelmann's avatar
tepelmann committed
    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;
berge's avatar
berge committed
    
tepelmann's avatar
tepelmann committed
    // LibCommon
    import from LibCommon_VerdictControl all;

berge's avatar
berge committed
    /**
     * @desc 	Create Facility component and connects DENM port
berge's avatar
berge committed
     * @remark	Only used when ItsFa is a PTC
berge's avatar
berge committed
     * @param	p_ptcDenm returned Facility component variable
     */    
berge's avatar
berge committed
    function f_ptcDenmUp(out ItsFa p_ptcDenm) {
berge's avatar
berge committed
        
        // Create Facility component
        p_ptcDenm := ItsFa.create("DENM Tester");
berge's avatar
berge committed
        
        // map ports
        map(p_ptcDenm:denmPort, system:denmPort);
        
berge's avatar
berge committed
    } // end f_ptcDenmUp       
berge's avatar
berge committed
    
    /**
     * @desc 	Wait for component to finish and unmap DENM ports
berge's avatar
berge committed
     * @remark	Only used when ItsFa is a PTC
berge's avatar
berge committed
     * @param	p_camPtc Facility component variable
     */    
berge's avatar
berge committed
    function f_ptcDenmDown(in ItsFa p_ptcDenm) runs on ItsMtc {    
berge's avatar
berge committed
    	tc_guard.start;
        alt {
        	[] p_ptcDenm.done {
            	tc_guard.stop;
            }
            
            [] tc_guard.timeout {
berge's avatar
berge committed
             	log("*** f_ptcDenmDown: ERROR: Timeout while waiting for component ***");
berge's avatar
berge committed
             	setverdict(inconc);   
            }
        }
berge's avatar
berge committed
        unmap(p_ptcDenm:denmPort);
berge's avatar
berge committed
    } // end f_ptcDenmDown
tepelmann's avatar
tepelmann committed
    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 (p_trigger == e_ets) {
                f_sendDenMessage(
tepelmann's avatar
tepelmann committed
                    m_denmReq(
                    	m_denmPdu(
                        	m_denmWithCause(c_dataVersionCancellation, p_event, f_getCurrentPosition(), f_getStationId())
                        )
tepelmann's avatar
tepelmann committed
                    )
                );
            }
            else {
                v_ret := f_triggerEventCancellation(p_event);
            }
            f_setVerdictPreOrPostamble(v_ret);
            
            f_poDefault();
        }
        
    } // end group postambles
    
    group eventFunctions {
        
        //TODO check if type Situation is suitable
        /**
         * @desc Triggers event from the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_triggerEvent(template (value) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Triggers cancellation event from the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_triggerEventCancellation(template (value) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            var DataVersion v_dataVersion := c_dataVersionCancellation;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Triggers event negation from the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_triggerEventNegation(template (value) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            var DecentralizedEnvironmentalNotificationMessage.management.isNegation v_isNegation := true;
tepelmann's avatar
tepelmann committed
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Triggers event with additional TrafficFlowEffect information field included from the application layer
         * @param p_event The event cause and subcause.
         * @param p_tfe The Traffic Flow Effect.
         * @return 
         */
        function f_triggerEventTrafficFlowEffect(
            template (value) Situation p_event, 
            template (value) TrafficFlowEffect p_tfe
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Triggers event with additional LinkedCause information field included from the application layer
         * @param p_event The event cause and subcause.
         * @param p_linkedCause The linked event.
         * @return 
         */
        function f_triggerEventLinkedCause(
            template (value) Situation p_event, 
            template (value) Situation p_linkedCause
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
berge's avatar
berge committed
            return v_ret;
        }

		/**
         * @desc Triggers event with expiration time information field and frequency information field 
         * 		  included from the application layer
         * @param p_event The event cause and subcause.
         * @param p_expirationTime The expiration time.
         * @param p_frequency The frequency.
         * @return 
         */        
        function f_triggerEventExpirationTimeFrequency(
            template (value) Situation p_event, 
            template (value) TimeStamp p_expirationTime,
            template (value) DecentralizedSituationManagement.frequency p_frequency
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
tepelmann's avatar
tepelmann committed
            return v_ret;
        }
berge's avatar
berge committed

        /**
         * @desc Triggers event with expiration time information field included from the application layer
         * @param p_event The event cause and subcause.
         * @param p_expirationTime The expiration time.
         * @return 
         */        
        function f_triggerEventExpirationTime(
            template (value) Situation p_event, 
            template (value) TimeStamp p_expirationTime
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
berge's avatar
berge committed

        /**
         * @desc Triggers update of event's expiration time
         * @param p_event The event cause and subcause.
         * @param p_expirationTime The new expiration time.
         * @return 
         */        
        function f_triggerEventExpirationTimeUpdate(
            template (value) Situation p_event, 
            template (value) TimeStamp p_expirationTime
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }        
               
tepelmann's avatar
tepelmann committed
        /**
         * @desc Triggers event with additional Event Characteristics information field included from the application layer
         * @param p_event The event cause and subcause.
         * @param p_eventCharact The event characteristics.
         * @return 
         */
        function f_triggerEventEventCharact(
            template (value) Situation p_event, 
            template (value) DecentralizedSituation.eventCharact p_eventCharact
            ) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        //TODO check if type Situation is suitable
        /**
         * @desc Checks that the event was indicated the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_checkEvent(template (value) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Checks that the event cancellation was indicated to the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_checkEventCancellation(template (value) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            return v_ret;
        }
        
        /**
         * @desc Checks that the event negation was indicated to the application layer
         * @param p_event The event cause and subcause.
         * @return 
         */
        function f_checkEventNegation(template (present) Situation p_event) runs on ItsFa return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            //TODO raise action or send message via port
            
            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;
tepelmann's avatar
tepelmann committed
            
            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 {
tepelmann's avatar
tepelmann committed
            var DenmInd v_denmInd;
            return f_awaitDenMessageOut(p_rcvMsg, v_denmInd);
tepelmann's avatar
tepelmann committed
        }
        
        /**
         * @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 template (value) DenmInd p_rcvdMsg) runs on ItsFa return FncRetCode {
berge's avatar
berge committed
            var FncRetCode v_ret := e_timeout;
tepelmann's avatar
tepelmann committed
            
berge's avatar
berge committed
            tc_ac.start;
tepelmann's avatar
tepelmann committed
            alt {
                [] denmPort.receive(p_rcvMsg) -> value p_rcvdMsg {
berge's avatar
berge committed
                    tc_ac.stop;
tepelmann's avatar
tepelmann committed
                    v_ret := e_success;
                }
berge's avatar
berge committed
                [] tc_ac.timeout {
                	log("Timeout while awaiting the reception of a message");
                	v_ret := e_timeout;
           		}
tepelmann's avatar
tepelmann committed
            }
            
            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;
                
                //TODO get the value from PIXIT or MIB
                
                return v_iutDefaultEventDuration;
            }            
            
        } // end testerGetFunctions
        
        // TODO: Clean up 
        
tepelmann's avatar
tepelmann committed
        /**
berge's avatar
berge committed
         * @desc Gets the station identifier of IUT.
tepelmann's avatar
tepelmann committed
         * @return 
         */
        function f_getStationId() return StationID {
            var StationID v_stationId;
            
            //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;
            
            //TODO get the value from PIXIT or ...
            
            return v_eventPos;
        }
        
berge's avatar
berge committed
        /**
         * @desc Gets the current time
         * @return 
         */
        function f_getCurrentTime() return TimeStamp {
            var TimeStamp v_timeStamp;
            
            //TODO get the value from xf ...
berge's avatar
berge committed
            
            return v_timeStamp;
        }
        
tepelmann's avatar
tepelmann committed
    } // end group getFunctions
    
} // end LibItsDenm_Functions