/** * @author ETSI / STF405 * @version $URL$ * $Id$ * @desc Module containing functions for GeoNetworking * */ module LibItsGeoNetworking_Functions { // Libcommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_VerdictControl {type FncRetCode;} import from LibCommon_Sync all; // LibIts import from LibIts_TestSystem all; import from LibIts_Interface all; import from LibItsCommon_Functions all; import from LibItsGeoNetworking_TypesAndValues all; import from LibItsGeoNetworking_Templates all; import from LibItsGeoNetworking_Pixits all; import from LibItsGeoNetworking_Pics all; group geoConfigurationFunctions { /** * @desc This configuration features: * - one ITS node (IUT) * - two ITS nodes (nodeA, nodeB) * - Area1 which only includes NodeB and IUT * - Area2 which only includes NodeB * NodeB being close to the area center */ function f_cf01Up() runs on ItsNt { // Variables var PositionTable v_positionTable := {}; var GeoAreaTable v_areaTable := {}; var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeDLongPosVector; // Map map(self:acPort, system:acPort); map(self:utPort, system:utPort); map(self:geoNetworkingPort, system:geoNetworkingPort); // Connect f_connect4SelfOrClientSync(); //Initialze the IUT f_initialState(); //Get positions v_iutLongPosVector := f_getIutLongPosVector(); v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor); v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor); v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor); // Propagate GN addresses v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA); v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB); // Position table f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector); f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector); f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector); // Area table f_addArea(v_areaTable, c_area1, f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); f_addArea(v_areaTable, c_area2, f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB); } // end f_cf01Up /** * @desc Deletes configuration cf01 */ function f_cf01Down() runs on ItsNt { // 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_nodeB * @param p_nodeD */ function f_cf02Up(out ItsNt p_nodeB, out ItsNt p_nodeD) runs on ItsMtc { // Variables var PositionTable v_positionTable := {}; var GeoAreaTable v_areaTable := {}; var LongPosVector v_iutLongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector; // Create p_nodeB := ItsNt.create(c_compNodeB) alive; p_nodeD := ItsNt.create(c_compNodeD) alive; // Map map(p_nodeB:acPort, system:acPort); map(p_nodeD:acPort, system:acPort); map(p_nodeB:utPort, system:utPort); map(p_nodeD:utPort, system:utPort); map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort); // Connect connect(p_nodeB:syncPort, self:syncPort); connect(p_nodeD:syncPort, self:syncPort); //Initialze the IUT f_initialState(); //Get positions v_iutLongPosVector := f_getIutLongPosVector(); v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor); v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor); v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor); // Propagate GN addresses v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB); v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC); v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD); // Position table f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector); f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector); f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector); // Area table f_addArea(v_areaTable, c_area1, f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); f_addArea(v_areaTable, c_area2, f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB)); p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD)); p_nodeD.done; p_nodeD.done; } // end f_cf02Up /** * @desc Deletes configuration cf02 * @param p_nodeB * @param p_nodeD */ function f_cf02Down(in ItsNt p_nodeB, in ItsNt p_nodeD) runs on ItsMtc { // Unmap unmap(p_nodeB:acPort, system:acPort); unmap(p_nodeD:acPort, system:acPort); unmap(p_nodeB:utPort, system:utPort); unmap(p_nodeD:utPort, system:utPort); unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort); // Connect disconnect(p_nodeB:syncPort, self:syncPort); disconnect(p_nodeD:syncPort, self:syncPort); } // end f_cf02Down /** * @desc This configuration features: * - one ITS node (IUT) * - one ITS node (NodeA) * - one ITS node in direction of NodeA (NodeB) * - one ITS node not in direction of NodeA (NodeC) * - Area1 which only includes NodeB and IUT * - Area2 which only includes NodeB * NodeB being close to the area center */ function f_cf03Up(out ItsNt p_nodeB, out ItsNt p_nodeC) runs on ItsMtc { // Variables var PositionTable v_positionTable := {}; var GeoAreaTable v_areaTable := {}; var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector; // Create p_nodeB := ItsNt.create(c_compNodeB) alive; p_nodeC := ItsNt.create(c_compNodeC) alive; // Map map(p_nodeB:acPort, system:acPort); map(p_nodeC:acPort, system:acPort); map(p_nodeB:utPort, system:utPort); map(p_nodeC:utPort, system:utPort); map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort); // Connect connect(p_nodeB:syncPort, self:syncPort); connect(p_nodeC:syncPort, self:syncPort); //Initialze the IUT f_initialState(); //Get positions v_iutLongPosVector := f_getIutLongPosVector(); v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor); v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor); v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor); v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor); // Propagate GN addresses v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA); v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB); v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC); // Position table f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector); f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector); f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector); f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector); // Area table f_addArea(v_areaTable, c_area1, f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); f_addArea(v_areaTable, c_area2, f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB)); p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC)); p_nodeB.done; p_nodeC.done; } // end f_cf03Up /** * @desc Deletes configuration cf03 * @param p_nodeA * @param p_nodeB * @param p_nodeC */ function f_cf03Down(in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc { // Unmap unmap(p_nodeB:acPort, system:acPort); unmap(p_nodeC:acPort, system:acPort); unmap(p_nodeB:utPort, system:utPort); unmap(p_nodeC:utPort, system:utPort); unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort); // Connect disconnect(p_nodeB:syncPort, self:syncPort); disconnect(p_nodeC:syncPort, self:syncPort); } // end f_cf03Down /** * @desc This configuration features: * - one ITS node (IUT) * - one ITS node (NodeA) * - one ITS node in direction of NodeA and having * shortest distance to NodeA (NodeB) * - one ITS node in direction of NodeA (NodeD) * - one ITS node not in direction of NodeA (NodeC) * - Area1 which only includes NodeB, NodeD and IUT * - Area2 which only includes NodeA, NodeB and NodeD * NodeB being close to the area center */ function f_cf04Up(out ItsNt p_nodeB, out ItsNt p_nodeC, out ItsNt p_nodeD) runs on ItsMtc { // Variables var PositionTable v_positionTable := {}; var GeoAreaTable v_areaTable := {}; var LongPosVector v_iutLongPosVector, v_nodeALongPosVector, v_nodeBLongPosVector, v_nodeCLongPosVector, v_nodeDLongPosVector; // Create p_nodeB := ItsNt.create(c_compNodeB) alive; p_nodeC := ItsNt.create(c_compNodeC) alive; p_nodeD := ItsNt.create(c_compNodeD) alive; // Map map(p_nodeB:acPort, system:acPort); map(p_nodeC:acPort, system:acPort); map(p_nodeD:acPort, system:acPort); map(p_nodeB:utPort, system:utPort); map(p_nodeC:utPort, system:utPort); map(p_nodeD:utPort, system:utPort); map(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); map(p_nodeC:geoNetworkingPort, system:geoNetworkingPort); map(p_nodeD:geoNetworkingPort, system:geoNetworkingPort); // Connect connect(p_nodeB:syncPort, self:syncPort); connect(p_nodeC:syncPort, self:syncPort); connect(p_nodeD:syncPort, self:syncPort); //Initialze the IUT f_initialState(); //Get positions v_iutLongPosVector := f_getIutLongPosVector(); v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor); v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor); v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor); v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor); // Propagate GN addresses v_nodeALongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeA); v_nodeBLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeB); v_nodeCLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeC); v_nodeDLongPosVector.gnAddr := f_getTsGnLocalAddress(c_compNodeD); // Position table f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector); f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector); f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector); f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector); f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector); // Area table f_addArea(v_areaTable, c_area1, f_computeSquareArea(v_nodeDLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); f_addArea(v_areaTable, c_area2, f_computeSquareArea(v_nodeBLongPosVector, float2int(1.1 * f_distance(v_nodeBLongPosVector, v_nodeDLongPosVector)))); p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB)); p_nodeC.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeC)); p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD)); p_nodeB.done; p_nodeC.done; p_nodeD.done; } // end f_cf04Up /** * @desc Deletes configuration cf04 * @param p_nodeB * @param p_nodeC * @param p_nodeD */ function f_cf04Down(in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc { // Unmap unmap(p_nodeB:acPort, system:acPort); unmap(p_nodeC:acPort, system:acPort); unmap(p_nodeD:acPort, system:acPort); unmap(p_nodeB:utPort, system:utPort); unmap(p_nodeC:utPort, system:utPort); unmap(p_nodeD:utPort, system:utPort); unmap(p_nodeB:geoNetworkingPort, system:geoNetworkingPort); unmap(p_nodeC:geoNetworkingPort, system:geoNetworkingPort); unmap(p_nodeD:geoNetworkingPort, system:geoNetworkingPort); // Connect disconnect(p_nodeB:syncPort, self:syncPort); disconnect(p_nodeC:syncPort, self:syncPort); disconnect(p_nodeD:syncPort, self:syncPort); } // end f_cf04Down function f_initialiseComponent( in PositionTable p_positionTable, in GeoAreaTable p_areaTable, in charstring p_componentName) runs on ItsNt { vc_positionTable := p_positionTable; vc_areaTable := p_areaTable; vc_componentName := p_componentName; } // end f_initialiseComponent function f_startBeingNeighbour() runs on ItsNt { vc_neighbourDefault := activate(a_neighbourDefault()); f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader)); } // end f_startBeingNeighbour function f_stopBeingNeighbour() runs on ItsNt { f_acTriggerEvent(m_stopBeaconing); deactivate(vc_neighbourDefault); } // end f_stopBeingNeighbour } // end geoConfigurationFunctions group geoPositionFunctions { 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 }; } function f_getPosition( in charstring p_positionKey ) runs on ItsNt return LongPosVector { var LongPosVector v_return; var integer i := 0; for (i:=0; i value v_msg { p_reqSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector); } } /** * @desc Receive any Location Service Request */ altstep a_receiveAnyLsRequest() runs on ItsNt { var LongPosVector v_reqSrcPosVector; [] a_receiveLsRequest(?, ?, v_reqSrcPosVector) {} } /** * @desc Receive Location Service Request and send Location Service Reply */ altstep a_receiveLsRequestAndReply( in template (present) UInt16 p_reqSeqNumber, in template (value) GN_Address p_gnAddress, in template (value) LongPosVector p_repSrcPosVector, in template (value) LongPosVector p_repSenderPosVector ) runs on ItsNt { var LongPosVector v_repDstPosVector; [] a_receiveLsRequest(p_reqSeqNumber, p_gnAddress, v_repDstPosVector) { f_sendGeoNetMessage(m_geoNwReq(m_geoNwPdu( m_lsReplyHeader( p_repSrcPosVector, f_longPosVector2ShortPosVector(v_repDstPosVector), p_repSenderPosVector, vc_localSeqNumber )))); } } } // end geoLocationServiceAltsteps } // end geoAltsteps group preambles { /** * @desc The default preamble. */ function f_prDefault() runs on ItsNt { activate(a_default()); } function f_prNonNeighbour() runs on ItsNt { f_prDefault(); } function f_prNeighbour() runs on ItsNt { f_prDefault(); f_startBeingNeighbour(); } /** * @desc Brings the IUT into an initial state. * @return */ function f_initialState() { var ItsNt initComponent := ItsNt.create; initComponent.start(f_utInitializeIut(m_gnInitialize)); initComponent.done; } function f_handleLocationService( in template (present) UInt16 p_reqSeqNumber, in template (value) GN_Address p_gnAddress, in template (value) LongPosVector p_repSrcPosVector, in template (value) LongPosVector p_repSenderPosVector ) runs on ItsNt { tc_ac.start; alt { [] a_receiveLsRequestAndReply(p_reqSeqNumber, p_gnAddress, p_repSrcPosVector, p_repSenderPosVector) { tc_ac.stop; } } } function f_processLocationService( in template (value) LongPosVector p_reqSrcPosVector, in template (value) UInt16 p_reqSeqNumber, in template (value) GN_Address p_gnAddress, out LongPosVector p_repSrcPosVector ) runs on ItsNt return FncRetCode { var FncRetCode v_ret := e_error; var GeoNetworkingInd v_msg; f_sendGeoNetMessage( m_geoNwReq( m_geoNwPdu( m_lsRequestHeader( p_reqSrcPosVector, p_reqSrcPosVector, p_reqSeqNumber, p_gnAddress ) ) ) ); tc_ac.start; alt { [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_lsReplyHeader( p_reqSeqNumber, ?, f_longPosVector2ShortPosVector(valueof(p_reqSrcPosVector)) ) ) ) ) -> value v_msg { tc_ac.stop; p_repSrcPosVector := valueof(v_msg.msgIn.header.lsRequestHeader.srcPosVector); v_ret := e_success; } } return v_ret; } } // end preambles group postambles { /** * @desc The default postamble. */ function f_poDefault() runs on ItsNt { //empty } function f_poNeighbour() runs on ItsNt { f_stopBeingNeighbour(); f_poDefault(); } } // end postambles group adapterControl { /** * @desc Triggers event in the test system adaptation. * @param p_event The event to trigger * @return */ function f_acTriggerEvent(template (value) AcGnPrimitive p_event) runs on ItsAdapterComponent return FncRetCode { var FncRetCode v_ret := e_success; acPort.send(p_event); return v_ret; } /** * @desc Triggers event in the test system adaptation. * @param p_event The event to trigger * @return */ function f_acGetLongPosVector(GN_Address p_gnAddress) runs on ItsAdapterComponent return LongPosVector { var AcGnResponse v_result; f_acTriggerEvent(m_getLongPosVector(p_gnAddress)); tc_ac.start; alt { [] acPort.receive(mw_getLongPosVectorAny(p_gnAddress)) -> value v_result { tc_ac.stop; } [] acPort.receive { tc_ac.stop; f_selfOrClientSyncAndVerdict("error", e_error, "*** f_acGetLongPosVector: Received unexpected message ***"); } [] tc_ac.timeout { f_selfOrClientSyncAndVerdict("error", e_timeout, "*** f_acGetLongPosVector: Timeout while waiting for adapter control event result ***"); } } return v_result.getLongPosVector; } function f_acStartBeaconingMultipleNeighbour(in integer p_numberOfNeighbour) runs on ItsNt return FncRetCode { return f_acTriggerEvent(m_startBeaconingMultipleNeighbour(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader, p_numberOfNeighbour)); } } // end adapterControl group commonFunctions { /** * @desc Gets the value of the lifetime in seconds. * @return */ function f_getLifetimeValue(in Lifetime p_lifetime) runs on ItsNt return float { var float v_lifetime := 0.0; select (p_lifetime.ltBase) { case (e_50ms) { v_lifetime := int2float(p_lifetime.multiplier) * 0.5; } case (e_1s) { v_lifetime := int2float(p_lifetime.multiplier) * 1.0; } case (e_10s) { v_lifetime := int2float(p_lifetime.multiplier) * 10.0; } case (e_100s) { v_lifetime := int2float(p_lifetime.multiplier) * 100.0; } } return v_lifetime; } } // end commonFunctions group testerFunctions { /** * @desc Gets the tester GN local address for a specific node */ function f_getTsGnLocalAddress(in charstring p_node) return GN_Address { var GN_Address v_gnAddr := valueof(m_dummyGnAddr); select (p_node) { case (c_compNodeA) { v_gnAddr := PX_TS_NODE_A_LOCAL_GN_ADDR; } case (c_compNodeB) { v_gnAddr := PX_TS_NODE_B_LOCAL_GN_ADDR; } case (c_compNodeC) { v_gnAddr := PX_TS_NODE_C_LOCAL_GN_ADDR; } case (c_compNodeD) { v_gnAddr := PX_TS_NODE_D_LOCAL_GN_ADDR; } case else { log("*** f_getTsGnLocalAddress: INFO: Unknown component " & p_node & " ***"); } } return v_gnAddr; } /** * @desc Sends a GeoNetworking message and in case of an included sequence number in the message the * local sequence number will be increased by one. * @param p_geoNetReq The message to sent. */ function f_sendGeoNetMessage(in template (value) GeoNetworkingReq p_geoNetReq) runs on ItsNt { geoNetworkingPort.send(p_geoNetReq); if (not (ischosen(p_geoNetReq.msgOut.header.shbHeader) or ischosen(p_geoNetReq.msgOut.header.beaconHeader))) { f_setLocalSequenceNumber(); } } /** * @desc Sets the value of the sequence number for the next event. * @return */ function f_setLocalSequenceNumber() runs on ItsNt { vc_localSeqNumber := (vc_localSeqNumber + 1) mod c_uInt16Max; } } // end testerFunctions group iutFunctions { /** * @desc Gets the IUT GN local address */ function f_getIutGnLocalAddress() return GN_Address { return PICS_GN_LOCAL_GN_ADDR; } /** * @desc Gets the IUT GN local address configuration method */ function f_getIutGnLocalAddressConfigurationMethod() return TypeOfAddress { return PICS_GN_LOCAL_ADDR_CONF_METHOD; } /** * @desc Gets the GeoUnicast forwarding algorithm */ function f_getGeoUnicastForwardingAlgorithm() return GeoUnicastForwardingAlgorithm { return PICS_GN_GEOUNICAST_FORWARDING_ALGORITHM; } /** * @desc Gets the IUT default hop limit */ function f_getDefaultHopLimit() return UInt8 { return PICS_GN_DEFAULT_HOP_LIMIT; } /** * @desc Gets the LS retransmission timer.. Valid for NetRepInterval = default (cong. ctrl). * @return */ function f_getLSRetransmitTimer() return float { var float v_itsGnLocationServiceRetransmitTimer := int2float(PICS_GN_LOCATION_SERVICE_RETRANSMIT_TIMER/1000); return v_itsGnLocationServiceRetransmitTimer; } /** * @desc Gets the LS retransmission timer for NetRepInterval = medium (cong. ctrl). * @return */ function f_getLSRetransmitTimerMedium() return float { var float v_itsGnLocationServiceRetransmitTimerMedium := int2float(PX_GN_LOCATION_SERVICE_TIMER_MEDIUM/1000); return v_itsGnLocationServiceRetransmitTimerMedium; } /** * @desc Gets the LS retransmission timer for NetRepInterval = maximum (cong. ctrl). * @return */ function f_getLSRetransmitTimerMaximum() return float { var float v_itsGnLocationServiceRetransmitTimerMaximum := int2float(PX_GN_LOCATION_SERVICE_TIMER_MAXIMUM/1000); return v_itsGnLocationServiceRetransmitTimerMaximum; } /** * @desc Gets the App retransmission timer. Valid for AppRepInterval = default (cong. ctrl). * @return */ function f_getAppRetransmitTimer() return float { var float v_itsGnLocationApplicationRetransmitTimer := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER/1000); return v_itsGnLocationApplicationRetransmitTimer; } /** * @desc Gets the App retransmission timer for AppRepInterval = medium (cong. ctrl). * @return */ function f_getAppRetransmitTimerMedium() return float { var float v_itsGnLocationApplicationRetransmitTimerMedium := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MEDIUM/1000); return v_itsGnLocationApplicationRetransmitTimerMedium; } /** * @desc Gets the App retransmission timer for AppRepInterval = maximum (cong. ctrl). * @return */ function f_getAppRetransmitTimerMaximum() return float { var float v_itsGnLocationApplicationRetransmitTimerMaximum := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER_MAXIMUM/1000); return v_itsGnLocationApplicationRetransmitTimerMaximum; } /** * @desc Gets the LS maximum retransmission number. * @return */ function f_getLSMaxRetrans() return integer { var integer v_itsGnLocationServiceMaxRetrans := PICS_GN_LOCATION_SERVICE_MAX_RETRANS; return v_itsGnLocationServiceMaxRetrans; } /** * @desc Gets the Application maximum retransmission number. * @return */ function f_getAppMaxRetrans() return integer { var integer v_itsGnApplicationMaxRetrans := PICS_GN_APPLICATION_MAX_RETRANS; return v_itsGnApplicationMaxRetrans; } /** * @desc Gets the Location Service packet buffer size. * @return */ function f_getLSPacketBufferSize() return integer { var integer v_itsGnLocationServicePacketBufferSize := PICS_GN_LOCATION_SERVICE_PACKET_BUFFER_SIZE; return v_itsGnLocationServicePacketBufferSize; } // end f_getLSPacketBufferSize /** * @desc Gets the UC forwarding packet buffer size. * @return */ function f_getUcForwardingPacketBufferSize() return integer { var integer v_itsGnUcForwardingPacketBufferSize := PICS_GN_UC_FORWARDING_PACKET_BUFFER_SIZE; return v_itsGnUcForwardingPacketBufferSize; } // end f_getUcForwardingPacketBufferSize /** * @desc Gets the BC forwarding packet buffer size. * @return */ function f_getBcForwardingPacketBufferSize() return integer { var integer v_itsGnBcForwardingPacketBufferSize := PICS_GN_BC_FORWARDING_PACKET_BUFFER_SIZE; return v_itsGnBcForwardingPacketBufferSize; } // end f_getBcForwardingPacketBufferSize /** * @desc Gets the upper limit of the maximum lifetime. * @return */ function f_getMaxPacketLifeTime() return float { var float v_itsGnMaxPacketLifetime := int2float(PICS_GN_MAX_PACKET_LIFETIME); return v_itsGnMaxPacketLifetime; } /** * @desc Gets delta for timers. * @return */ function f_getDeltaTimer() return float { var float v_deltaTimer := PX_T_DELTA; return v_deltaTimer; } /** * @desc Gets the beacon service retransmit timer. * @return */ function f_getBSRetransmitTimer() return float { var float v_itsGnBeaconServiceRetransmitTimer; v_itsGnBeaconServiceRetransmitTimer := int2float( (PICS_GN_BEACON_SERVICE_TIMER+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000); return v_itsGnBeaconServiceRetransmitTimer; } /** * @desc Gets the beacon service retransmit timer for NetBeaconInterval = medium (cong. ctrl). * @return */ function f_getBSRetransmitTimerMedium() return float { var float v_itsGnBeaconServiceRetransmitTimerMedium; // timer value increased (medium) v_itsGnBeaconServiceRetransmitTimerMedium := int2float( (PX_GN_BEACON_SERVICE_TIMER_MEDIUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000); return v_itsGnBeaconServiceRetransmitTimerMedium; } /** * @desc Gets the beacon service retransmit timer for NetBeaconInterval = maximum (cong. ctrl). * @return */ function f_getBSRetransmitTimerMaximum() return float { var float v_itsGnBeaconServiceRetransmitTimerMaximum; // timer value increased (maximum) v_itsGnBeaconServiceRetransmitTimerMaximum := int2float( (PX_GN_BEACON_SERVICE_TIMER_MAXIMUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000); return v_itsGnBeaconServiceRetransmitTimerMaximum; } /** * @desc Gets the maximum beacon service jitter. * @return */ function f_getBSMaxJitter() return float { var float v_itsGnBeaconServiceMaxJitter := (f_getMaxPacketLifeTime()*1000.0)/4.0; return v_itsGnBeaconServiceMaxJitter; } /** * @desc Gets the Lifetime of a Location Table Entry. * @return */ function f_getLifetimeLocTE() return float { var float v_itsGnLifetimeLocTE := int2float(PICS_GN_LIFETIME_LOC_TE); return v_itsGnLifetimeLocTE; } // end f_getLifetimeLocTE /** * @desc Gets the maximum communication range for CBF algorithm */ function f_getCbfMaxCommunicationRange() return integer { var integer v_maxCommunicationRange := PICS_GN_DEFAULT_MAX_COMMUNICATION_RANGE; return v_maxCommunicationRange; } // end f_getCbfMaxCommunicationRange function f_getGeoUnicastCbfMaxTime() return integer { var integer v_cbfMaxTime := PICS_GN_GEOUNICAST_CBF_MAX_TIME; return v_cbfMaxTime; } // end f_getGeoUnicastCbfMaxTime function f_getGeoUnicastCbfMinTime() return integer { var integer v_cbfMinTime := PICS_GN_GEOUNICAST_CBF_MIN_TIME; return v_cbfMinTime; } // end f_getGeoUnicastCbfMinTime /** * @desc Set the number of neighbour in the Location Table. * @return */ function f_setNrNeighbourLocTableDefault() runs on ItsNt { var integer v_nrNeighbour := f_random (0, PX_MIN_NR_NEIGHBOUR); f_acStartBeaconingMultipleNeighbour(v_nrNeighbour); } // end f_setNrNeighbourLocTableDefault /** * @desc Set the number of neighbour in the Location Table. * @return */ function f_setNrNeighbourLocTableMedium() runs on ItsNt { var integer v_nrNeighbour := f_random (PX_MIN_NR_NEIGHBOUR, PX_MAX_NR_NEIGHBOUR); f_acStartBeaconingMultipleNeighbour(v_nrNeighbour); } // end f_setNrNeighbourLocTableMedium /** * @desc Set the number of neighbour in the Location Table. * @return */ function f_setNrNeighbourLocTableMaximum() runs on ItsNt { var integer v_nrNeighbour := f_random (PX_MAX_NR_NEIGHBOUR, (2*PX_MIN_NR_NEIGHBOUR)); f_acStartBeaconingMultipleNeighbour(v_nrNeighbour); } // end f_setNrNeighbourLocTableMaximum } // end iutFunctions group posVectorFunctions { function f_longPosVector2ShortPosVector(in LongPosVector p_longPosVector) return ShortPosVector { var ShortPosVector v_shortPosVector; v_shortPosVector := { gnAddr := p_longPosVector.gnAddr, timestamp := p_longPosVector.timestamp, latitude := p_longPosVector.latitude, longitude := p_longPosVector.longitude }; return v_shortPosVector; } function f_getIutLongPosVector() runs on ItsAdapterComponent return LongPosVector { return f_acGetLongPosVector(f_getIutGnLocalAddress()); } function f_getIutShortPosVector() runs on ItsAdapterComponent return ShortPosVector { return f_longPosVector2ShortPosVector(f_getIutLongPosVector()); } /** * @desc Compute a position using a reference position, a distance and an orientation * @param p_iutLongPosVector Reference position * @param p_distance Distance to the reference position (in meter) * @param p_orientation direction of the computed position (0 to 359; 0 means North) * @return LongPosVector */ function f_computePositionUsingDistance(in LongPosVector p_iutLongPosVector, in integer p_distance, in integer p_orientation) return LongPosVector { var LongPosVector v_result := p_iutLongPosVector; fx_computePositionUsingDistance(p_iutLongPosVector, p_distance, p_orientation, v_result.latitude, v_result.longitude); return v_result; } } // end posVectorFunctions group externalFunctions { external function fx_computeDistance( in UInt32 p_latitudeA, in UInt32 p_longitudeA, in UInt32 p_latitudeB, in UInt32 p_longitudeB ) return float; /** * @desc Compute a position using a reference position, a distance and an orientation * @param p_iutLongPosVector Reference position * @param p_distance Distance to the reference position (in meter) * @param p_orientation direction of the computed position (0 to 359; 0 means North) * @return LongPosVector */ external function fx_computePositionUsingDistance( in LongPosVector p_iutLongPosVector, in integer p_distance, in integer p_orientation, out UInt32 p_latitude, out UInt32 p_longitude ); } } // end LibItsGeoNetworking_Functions