Skip to content
LibItsGeoNetworking_Functions.ttcn 55.4 KiB
Newer Older
                }
                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
    
berge's avatar
berge committed
    group testerFunctions {
berge's avatar
berge committed
        
        /**
         * @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 & " ***");
berge's avatar
berge committed
        /**
tepelmann's avatar
tepelmann committed
         * @desc Sends a GeoNetworking message and in case of an included sequence number in the message the 
berge's avatar
berge committed
         *       local sequence number will be increased by one.
         * @param p_geoNetReq The message to sent.
tepelmann's avatar
tepelmann committed
         */
        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();
            }
berge's avatar
berge committed
        }
      
        /**
         * @desc Sets the value of the sequence number for the next event.
         * @return 
         */
        function f_setLocalSequenceNumber() runs on ItsNt {
tepelmann's avatar
tepelmann committed
            vc_localSeqNumber := (vc_localSeqNumber + 1) mod c_uInt16Max;
        /**
         * @desc Gets the IUT GN local address
berge's avatar
berge committed
        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;
        }
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer.. Valid for NetRepInterval = default (cong. ctrl).
         * @return 
         */
        function f_getLSRetransmitTimer() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnLocationServiceRetransmitTimer := int2float(PICS_GN_LOCATION_SERVICE_RETRANSMIT_TIMER/1000);
            
            return v_itsGnLocationServiceRetransmitTimer;
        }
        
fischer's avatar
fischer committed
        /**
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer for NetRepInterval = medium (cong. ctrl).
fischer's avatar
fischer committed
         * @return 
         */
        function f_getLSRetransmitTimerMedium() return float {
berge's avatar
berge committed
            var float v_itsGnLocationServiceRetransmitTimerMedium := int2float(PX_GN_LOCATION_SERVICE_TIMER_MEDIUM/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationServiceRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
fischer's avatar
fischer committed
         * @desc Gets the LS retransmission timer for NetRepInterval = maximum (cong. ctrl).
fischer's avatar
fischer committed
         * @return 
         */
        function f_getLSRetransmitTimerMaximum() return float {
berge's avatar
berge committed
            var float v_itsGnLocationServiceRetransmitTimerMaximum := int2float(PX_GN_LOCATION_SERVICE_TIMER_MAXIMUM/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationServiceRetransmitTimerMaximum;
fischer's avatar
fischer committed
        }
fischer's avatar
fischer committed

        /**
         * @desc Gets the App retransmission timer. Valid for AppRepInterval = default (cong. ctrl).
         * @return 
         */
        function f_getAppRetransmitTimer() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnLocationApplicationRetransmitTimer := int2float(PX_GN_APPLICATION_RETRANSMIT_TIMER/1000);
fischer's avatar
fischer committed
            
tepelmann's avatar
tepelmann committed
            return v_itsGnLocationApplicationRetransmitTimer;
fischer's avatar
fischer committed
        }
        
        /**
         * @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);
fischer's avatar
fischer committed
            
            return v_itsGnLocationApplicationRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
         * @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);
fischer's avatar
fischer committed
            
            return v_itsGnLocationApplicationRetransmitTimerMaximum;
fischer's avatar
fischer committed
        }
fischer's avatar
fischer committed
        
        /**
         * @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;
        }
fischer's avatar
fischer committed

        /**
         * @desc Gets the Application maximum retransmission number.
         * @return 
         */
        function f_getAppMaxRetrans() return integer {
            var integer v_itsGnApplicationMaxRetrans := PICS_GN_APPLICATION_MAX_RETRANS;
fischer's avatar
fischer committed
            
            return v_itsGnApplicationMaxRetrans;
fischer's avatar
fischer committed
        }
tepelmann's avatar
tepelmann committed
        /**
         * @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;
tepelmann's avatar
tepelmann committed
            
            return v_itsGnLocationServicePacketBufferSize;
        } // end f_getLSPacketBufferSize
        
berge's avatar
berge committed
        /**
         * @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;
berge's avatar
berge committed
            
            return v_itsGnUcForwardingPacketBufferSize;
        } // end f_getUcForwardingPacketBufferSize
        
berge's avatar
berge committed
        /**
         * @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;
berge's avatar
berge committed
            
            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 {
tepelmann's avatar
tepelmann committed
            var float v_deltaTimer := PX_T_DELTA;
        /**
         * @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);
fischer's avatar
fischer committed
        /**
         * @desc Gets the beacon service retransmit timer for NetBeaconInterval = medium (cong. ctrl).
         * @return 
         */
        function f_getBSRetransmitTimerMedium() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnBeaconServiceRetransmitTimerMedium; // timer value increased (medium)
tepelmann's avatar
tepelmann committed
            v_itsGnBeaconServiceRetransmitTimerMedium := int2float(
                (PX_GN_BEACON_SERVICE_TIMER_MEDIUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
tepelmann's avatar
tepelmann committed
            return v_itsGnBeaconServiceRetransmitTimerMedium;
fischer's avatar
fischer committed
        }
        
        /**
         * @desc Gets the beacon service retransmit timer for NetBeaconInterval = maximum (cong. ctrl).
         * @return 
         */
        function f_getBSRetransmitTimerMaximum() return float {
tepelmann's avatar
tepelmann committed
            var float v_itsGnBeaconServiceRetransmitTimerMaximum; // timer value increased (maximum)
tepelmann's avatar
tepelmann committed
            v_itsGnBeaconServiceRetransmitTimerMaximum := int2float(
                (PX_GN_BEACON_SERVICE_TIMER_MAXIMUM+float2int((f_getBSMaxJitter() - 0.0 +1.0)*rnd()) + 0)/1000);
tepelmann's avatar
tepelmann committed
            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;

        /**
         * @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
berge's avatar
berge committed
        /**
         * @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 {
fischer's avatar
fischer committed
            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
berge's avatar
berge committed
    group posVectorFunctions {
        
berge's avatar
berge committed
        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
            };
            
berge's avatar
berge committed
            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()); 
berge's avatar
berge committed
        /**
         * @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;
        }
        
berge's avatar
berge committed
    } // 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;
berge's avatar
berge committed
        
        /**
         * @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(
berge's avatar
berge committed
            in LongPosVector p_iutLongPosVector, 
            in integer p_distance, 
            in integer p_orientation,
            out UInt32 p_latitude,
            out UInt32 p_longitude
        );       
berge's avatar
berge committed
} // end LibItsGeoNetworking_Functions