Commit fca08548 authored by berge's avatar berge
Browse files

Implemented position and area computation

parent 92bbd4ff
Loading
Loading
Loading
Loading
+140 −37
Original line number Original line Diff line number Diff line
@@ -70,16 +70,27 @@ module LibItsGeoNetworking_Functions {


            // Variables
            // Variables
            var PositionTable v_positionTable := {};
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector := f_getIutLongPosVector();
            var LongPosVector v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            var LongPosVector v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            var LongPosVector v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            
            // Map
            // Map
            map(self:geoNetworkingPort, system:geoNetworkingPort);
            map(self:geoNetworkingPort, system:geoNetworkingPort);
            
            
            // Position table            
            // Position table            
            f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
        
        
            f_initialiseComponent(v_positionTable, c_compNodeB);
            // 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
        } // end f_cf01Up


@@ -109,6 +120,11 @@ module LibItsGeoNetworking_Functions {
            
            
            // Variables
            // Variables
            var PositionTable v_positionTable := {};
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector := f_getIutLongPosVector();            
            var LongPosVector v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            var LongPosVector v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            var LongPosVector v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            
            // Create
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
            p_nodeB := ItsNt.create(c_compNodeB) alive;
@@ -123,12 +139,18 @@ module LibItsGeoNetworking_Functions {
            connect(p_nodeD:syncPort, self:syncPort);
            connect(p_nodeD:syncPort, self:syncPort);
        
        
            // Position table
            // Position table
            f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeD, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);
            

            p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
            // Area table
            p_nodeD.start(f_initialiseComponent(v_positionTable, c_compNodeD));
            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;
            p_nodeD.done;
            p_nodeD.done;
        
        
@@ -165,6 +187,12 @@ module LibItsGeoNetworking_Functions {


            // Variables
            // Variables
            var PositionTable v_positionTable := {};
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector := f_getIutLongPosVector();
            var LongPosVector v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            var LongPosVector v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            var LongPosVector v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            var LongPosVector v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            
            // Create
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
            p_nodeB := ItsNt.create(c_compNodeB) alive;
@@ -179,13 +207,19 @@ module LibItsGeoNetworking_Functions {
            connect(p_nodeC:syncPort, self:syncPort);
            connect(p_nodeC:syncPort, self:syncPort);


            // Position table
            // Position table
            f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeC, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
            
            
            p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
            // Area table
            p_nodeC.start(f_initialiseComponent(v_positionTable, c_compNodeC));
            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_nodeB.done;
            p_nodeC.done;
            p_nodeC.done;
                    
                    
@@ -225,6 +259,12 @@ module LibItsGeoNetworking_Functions {


            // Variables
            // Variables
            var PositionTable v_positionTable := {};
            var PositionTable v_positionTable := {};
            var GeoAreaTable v_areaTable := {};
            var LongPosVector v_iutLongPosVector := f_getIutLongPosVector();
            var LongPosVector v_nodeALongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeA_longitudeFactor, c_compNodeA_latitudeFactor);
            var LongPosVector v_nodeBLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeB_longitudeFactor, c_compNodeB_latitudeFactor);
            var LongPosVector v_nodeCLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeC_longitudeFactor, c_compNodeC_latitudeFactor);
            var LongPosVector v_nodeDLongPosVector := f_computePosition(v_iutLongPosVector, c_compNodeD_longitudeFactor, c_compNodeD_latitudeFactor);
            
            
            // Create
            // Create
            p_nodeB := ItsNt.create(c_compNodeB) alive;
            p_nodeB := ItsNt.create(c_compNodeB) alive;
@@ -242,15 +282,21 @@ module LibItsGeoNetworking_Functions {
            connect(p_nodeD:syncPort, self:syncPort);
            connect(p_nodeD:syncPort, self:syncPort);
            
            
            // Position table
            // Position table
            f_addPosition(v_positionTable, c_compIut, f_getIutLongPosVector());
            f_addPosition(v_positionTable, c_compIut, v_iutLongPosVector);
            f_addPosition(v_positionTable, c_compNodeA, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeA, v_nodeALongPosVector);
            f_addPosition(v_positionTable, c_compNodeB, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeB, v_nodeBLongPosVector);
            f_addPosition(v_positionTable, c_compNodeC, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeC, v_nodeCLongPosVector);
            f_addPosition(v_positionTable, c_compNodeD, f_computePosition());
            f_addPosition(v_positionTable, c_compNodeD, v_nodeDLongPosVector);
                        

            p_nodeB.start(f_initialiseComponent(v_positionTable, c_compNodeB));
            // Area table
            p_nodeC.start(f_initialiseComponent(v_positionTable, c_compNodeC));
            f_addArea(v_areaTable, c_area1, 
            p_nodeD.start(f_initialiseComponent(v_positionTable, c_compNodeD));
                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_nodeB.done;
            p_nodeC.done;
            p_nodeC.done;
            p_nodeD.done;
            p_nodeD.done;
@@ -279,10 +325,12 @@ module LibItsGeoNetworking_Functions {
        
        
        function f_initialiseComponent(
        function f_initialiseComponent(
            in PositionTable p_positionTable,
            in PositionTable p_positionTable,
            in GeoAreaTable p_areaTable,
            in charstring p_componentName) 
            in charstring p_componentName) 
        runs on ItsNt {
        runs on ItsNt {
            
            
            vc_positionTable := p_positionTable;
            vc_positionTable := p_positionTable;
            vc_areaTable := p_areaTable;
            vc_componentName := p_componentName; 
            vc_componentName := p_componentName; 
            
            
        } // end f_initialiseComponent
        } // end f_initialiseComponent
@@ -350,14 +398,31 @@ module LibItsGeoNetworking_Functions {
            return v_return;
            return v_return;
        }
        }
        
        
        function f_computePosition() return LongPosVector {
        function f_computePosition(
            in LongPosVector p_refPosition, 
            in integer p_longitudeFactor, 
            in integer p_latitudeFactor
        ) return LongPosVector {
        
        
            var LongPosVector v_return := valueof(m_dummyLongPosVector);
            var LongPosVector v_return := p_refPosition;
            // TODO
        
            v_return.latitude := v_return.latitude + p_latitudeFactor * PXT_DISTANCE_UNIT;
            v_return.longitude := v_return.longitude + p_longitudeFactor * PXT_DISTANCE_UNIT;


            return v_return;
            return v_return;
        }
        }
        
        
        function f_addArea(
            inout GeoAreaTable p_geoAreaTable,
            in charstring p_areaKey,
            in GeoArea p_geoArea
        ) {
            p_geoAreaTable[lengthof(p_geoAreaTable)] := {
                key := p_areaKey,
                geoArea := p_geoArea
            };
        }
        
        function f_getArea(in GeoAreaTable p_areaTable, in charstring p_areaName) return GeoArea {
        function f_getArea(in GeoAreaTable p_areaTable, in charstring p_areaName) return GeoArea {
            var GeoArea v_return;
            var GeoArea v_return;
            var integer i := 0;
            var integer i := 0;
@@ -425,6 +490,35 @@ module LibItsGeoNetworking_Functions {
            return v_anycastArea;
            return v_anycastArea;
        }
        }
        
        
        function f_computeSquareArea(
            in LongPosVector p_centerLongPosVector, 
            in UInt16 p_distanceA
        ) return GeoArea {
                
            var GeoArea v_geoArea;
            
            v_geoArea := {
                shape := e_geoRect,
                area := {
                    geoAreaPosLatitude := p_centerLongPosVector.latitude,
                    geoAreaPosLongitude := p_centerLongPosVector.longitude,
                    distanceA := p_distanceA,
                    distanceB := p_distanceA,
                    angle := 0 
                }
            }
            
            return v_geoArea;   
        }
        
        function f_distance(
            in LongPosVector p_pointA,
            in LongPosVector p_pointB
        ) return float {
         
            return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);   
        }
        
    } // end geoPositionFunctions    
    } // end geoPositionFunctions    
    
    
    group geoAltsteps {
    group geoAltsteps {
@@ -893,7 +987,7 @@ module LibItsGeoNetworking_Functions {
         * @param p_event The event to trigger
         * @param p_event The event to trigger
         * @return
         * @return
         */
         */
        function f_acTriggerEvent(template (value) AcGNEvent p_event) runs on ItsFa return FncRetCode {
        function f_acTriggerEvent(template (value) AcGNEvent p_event) runs on ItsNt return FncRetCode {
            var FncRetCode v_ret := e_success;
            var FncRetCode v_ret := e_success;
            
            
            acPort.send(p_event);
            acPort.send(p_event);
@@ -1221,7 +1315,7 @@ module LibItsGeoNetworking_Functions {
            v_shortPosVector := {
            v_shortPosVector := {
                gnAddr := p_longPosVector.gnAddr, 
                gnAddr := p_longPosVector.gnAddr, 
                timestamp := p_longPosVector.timestamp, 
                timestamp := p_longPosVector.timestamp, 
                latitute := p_longPosVector.latitute, 
                latitude := p_longPosVector.latitude, 
                longitude := p_longPosVector.longitude
                longitude := p_longPosVector.longitude
            };
            };
            
            
@@ -1242,4 +1336,13 @@ module LibItsGeoNetworking_Functions {
        
        
    } // end posVectorFunctions
    } // 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;
               
    }
    
} // end LibItsGeoNetworking_Functions
} // end LibItsGeoNetworking_Functions
 No newline at end of file
+9 −2
Original line number Original line Diff line number Diff line
@@ -24,6 +24,13 @@ module LibItsGeoNetworking_Pixits {
         */
         */
    	modulepar integer PX_MAX_NR_NEIGHBOUR := 50;
    	modulepar integer PX_MAX_NR_NEIGHBOUR := 50;


        /**
         * @desc    Number of 1/10 micro degrees in one unit of distance
         * @remark  This Pixit is used to position nodes relatively to each other.
         *          It corresponds to the distance betwen 2 nodes (10000 ~ 100m).
         */
        modulepar UInt32 PXT_DISTANCE_UNIT := 10000;

    } // end of group
    } // end of group


    } // end of group geoNetworkingPixits
    } // end of group geoNetworkingPixits
+2 −2
Original line number Original line Diff line number Diff line
@@ -245,7 +245,7 @@ module LibItsGeoNetworking_Templates {
        	) := {
        	) := {
                    gnAddr := p_gnAddress,
                    gnAddr := p_gnAddress,
                    timestamp := ?,
                    timestamp := ?,
                    latitute := ?,
                    latitude := ?,
                    longitude := ?,
                    longitude := ?,
                    speed := ?,
                    speed := ?,
                    heading := ?,
                    heading := ?,
@@ -1086,7 +1086,7 @@ module LibItsGeoNetworking_Templates {
            template (value) LongPosVector m_dummyLongPosVector := {
            template (value) LongPosVector m_dummyLongPosVector := {
                gnAddr := m_dummyGnAddr,
                gnAddr := m_dummyGnAddr,
                timestamp := c_uInt32Zero,
                timestamp := c_uInt32Zero,
                latitute := c_uInt32Zero,
                latitude := c_uInt32Zero,
                longitude := c_uInt32Zero,
                longitude := c_uInt32Zero,
                speed := c_uInt16Zero,
                speed := c_uInt16Zero,
                heading := c_uInt16Zero,
                heading := c_uInt16Zero,
+13 −4
Original line number Original line Diff line number Diff line
@@ -25,6 +25,15 @@ module LibItsGeoNetworking_TypesAndValues {
        const charstring c_area1 := "AREA1";
        const charstring c_area1 := "AREA1";
        const charstring c_area2 := "AREA2";
        const charstring c_area2 := "AREA2";
        
        
        const integer c_compNodeA_latitudeFactor := 3;
        const integer c_compNodeB_latitudeFactor := 2;
        const integer c_compNodeC_latitudeFactor := -1;
        const integer c_compNodeD_latitudeFactor := 1;
        const integer c_compNodeA_longitudeFactor := 0;
        const integer c_compNodeB_longitudeFactor := 0;
        const integer c_compNodeC_longitudeFactor := 0;
        const integer c_compNodeD_longitudeFactor := 0;
                        
    } // end geoConfigurationValues
    } // end geoConfigurationValues


    group geoSyncMessages {
    group geoSyncMessages {
@@ -525,7 +534,7 @@ module LibItsGeoNetworking_TypesAndValues {
                 * 
                 * 
                 * @member gnAddr
                 * @member gnAddr
                 * @member timestamp
                 * @member timestamp
                 * @member latitute
                 * @member latitude
                 * @member longitude
                 * @member longitude
                 * @member speed
                 * @member speed
                 * @member heading
                 * @member heading
@@ -539,7 +548,7 @@ module LibItsGeoNetworking_TypesAndValues {
                type record LongPosVector {
                type record LongPosVector {
                    GN_Address  gnAddr,
                    GN_Address  gnAddr,
                    UInt32      timestamp,
                    UInt32      timestamp,
                    UInt32      latitute,
                    UInt32      latitude,
                    UInt32      longitude,
                    UInt32      longitude,
                    UInt16      speed,
                    UInt16      speed,
                    UInt16      heading,
                    UInt16      heading,
@@ -604,13 +613,13 @@ module LibItsGeoNetworking_TypesAndValues {
                 * 
                 * 
                 * @member gnAddr
                 * @member gnAddr
                 * @member timestamp
                 * @member timestamp
                 * @member latitute
                 * @member latitude
                 * @member longitude
                 * @member longitude
                 */
                 */
                type record ShortPosVector {
                type record ShortPosVector {
                    GN_Address  gnAddr,
                    GN_Address  gnAddr,
                    UInt32      timestamp,
                    UInt32      timestamp,
                    UInt32      latitute,
                    UInt32      latitude,
                    UInt32      longitude
                    UInt32      longitude
                }
                }