Newer
Older
* @author ETSI / STF405
* @version $URL$
* $Id$
* @desc Module containing functions for GeoNetworking
// 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 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 LongPosVector v_longPosVectorIut, v_longPosVectorNodeA, v_longPosVectorNodeB, v_longPosVectorNodeD;
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
map(self:geoNetworkingPort, system:geoNetworkingPort);
// Connect
f_connect4SelfOrClientSync();
activate(a_cf01Down());
//Initialze the IUT
f_initialState();
//Get positions
v_longPosVectorIut := f_getIutLongPosVector();
v_longPosVectorNodeA := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeA, c_latitudeFactorNodeA);
v_longPosVectorNodeB := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeB, c_latitudeFactorNodeB);
v_longPosVectorNodeD := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeD, c_latitudeFactorNodeD);
v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_longPosVectorNodeB.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
f_addPosition(v_positionTable, c_compIut, v_longPosVectorIut);
f_addPosition(v_positionTable, c_compNodeA, v_longPosVectorNodeA);
f_addPosition(v_positionTable, c_compNodeB, v_longPosVectorNodeB);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_longPosVectorNodeD, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_computeSquareArea(v_longPosVectorNodeB, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
*/
function f_cf01Down() runs on ItsNt {
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 Component for NodeB
* @param p_nodeD Component for NodeD
function f_cf02Up(out ItsNt p_nodeB, out ItsNt p_nodeD) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_longPosVectorIut, v_longPosVectorNodeB, v_longPosVectorNodeC, v_longPosVectorNodeD;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
// Map
map(self:acPort, system:acPort);
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(self:syncPort, self:syncPort);
activate(a_cf02Down(p_nodeB, p_nodeD));
//Initialze the IUT
f_initialState();
//Get positions
v_longPosVectorIut := f_getIutLongPosVector();
v_longPosVectorNodeB := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeB, c_latitudeFactorNodeB);
v_longPosVectorNodeC := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeC, c_latitudeFactorNodeC);
v_longPosVectorNodeD := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeD, c_latitudeFactorNodeD);
v_longPosVectorNodeB.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_longPosVectorNodeC.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
v_longPosVectorNodeD.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
f_addPosition(v_positionTable, c_compIut, v_longPosVectorIut);
f_addPosition(v_positionTable, c_compNodeB, v_longPosVectorNodeB);
f_addPosition(v_positionTable, c_compNodeD, v_longPosVectorNodeD);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_longPosVectorNodeD, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_computeSquareArea(v_longPosVectorNodeB, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
p_nodeB.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB));
p_nodeD.start(f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeD));
* @param p_nodeB Component for NodeB
* @param p_nodeD Component for NodeD
function f_cf02Down(in ItsNt p_nodeB, in ItsNt p_nodeD) runs on ItsMtc {
unmap(self:acPort, system:acPort);
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);
// Disconnect
disconnect(p_nodeB:syncPort, self:syncPort);
disconnect(self: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
* @param p_nodeB Component for NodeB
* @param p_nodeC Component for NodeC
function f_cf03Up(out ItsNt p_nodeB, out ItsNt p_nodeC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA, v_longPosVectorNodeB, v_longPosVectorNodeC, v_longPosVectorNodeD;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
// Map
map(self:acPort, system:acPort);
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);
connect(self:syncPort, self:syncPort);
activate(a_cf03Down(p_nodeB, p_nodeC));
//Initialze the IUT
f_initialState();
//Get positions
v_longPosVectorIut := f_getIutLongPosVector();
v_longPosVectorNodeA := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeA, c_latitudeFactorNodeA);
v_longPosVectorNodeB := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeB, c_latitudeFactorNodeB);
v_longPosVectorNodeC := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeC, c_latitudeFactorNodeC);
v_longPosVectorNodeD := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeD, c_latitudeFactorNodeD);
v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_longPosVectorNodeB.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_longPosVectorNodeC.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
f_addPosition(v_positionTable, c_compIut, v_longPosVectorIut);
f_addPosition(v_positionTable, c_compNodeA, v_longPosVectorNodeA);
f_addPosition(v_positionTable, c_compNodeB, v_longPosVectorNodeB);
f_addPosition(v_positionTable, c_compNodeC, v_longPosVectorNodeC);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_longPosVectorNodeD, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_computeSquareArea(v_longPosVectorNodeB, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
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_nodeB Component for NodeB
* @param p_nodeC Component for NodeC
function f_cf03Down(in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc {
unmap(self:acPort, system:acPort);
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);
// Disconnect
disconnect(p_nodeB:syncPort, self:syncPort);
disconnect(p_nodeC:syncPort, self:syncPort);
disconnect(self: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
* @param p_nodeB Component for NodeB
* @param p_nodeC Component for NodeC
* @param p_nodeD Component for NodeD
function f_cf04Up(out ItsNt p_nodeB, out ItsNt p_nodeC, out ItsNt p_nodeD) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA, v_longPosVectorNodeB, v_longPosVectorNodeC, v_longPosVectorNodeD;
// Create
p_nodeB := ItsNt.create(c_compNodeB) alive;
p_nodeC := ItsNt.create(c_compNodeC) alive;
p_nodeD := ItsNt.create(c_compNodeD) alive;
// Map
map(self:acPort, system:acPort);
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);
connect(self:syncPort, self:syncPort);
activate(a_cf04Down(p_nodeB, p_nodeC, p_nodeD));
//Initialze the IUT
f_initialState();
//Get positions
v_longPosVectorIut := f_getIutLongPosVector();
v_longPosVectorNodeA := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeA, c_latitudeFactorNodeA);
v_longPosVectorNodeB := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeB, c_latitudeFactorNodeB);
v_longPosVectorNodeC := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeC, c_latitudeFactorNodeC);
v_longPosVectorNodeD := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeD, c_latitudeFactorNodeD);
v_longPosVectorNodeA.gnAddr := f_getTsGnLocalAddress(c_compNodeA);
v_longPosVectorNodeB.gnAddr := f_getTsGnLocalAddress(c_compNodeB);
v_longPosVectorNodeC.gnAddr := f_getTsGnLocalAddress(c_compNodeC);
v_longPosVectorNodeD.gnAddr := f_getTsGnLocalAddress(c_compNodeD);
f_addPosition(v_positionTable, c_compIut, v_longPosVectorIut);
f_addPosition(v_positionTable, c_compNodeA, v_longPosVectorNodeA);
f_addPosition(v_positionTable, c_compNodeB, v_longPosVectorNodeB);
f_addPosition(v_positionTable, c_compNodeC, v_longPosVectorNodeC);
f_addPosition(v_positionTable, c_compNodeD, v_longPosVectorNodeD);
// Area table
f_addArea(v_areaTable, c_area1,
f_computeSquareArea(v_longPosVectorNodeD, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_computeSquareArea(v_longPosVectorNodeB, float2int(1.1 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
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 Component for NodeB
* @param p_nodeC Component for NodeC
* @param p_nodeD Component for NodeD
function f_cf04Down(in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc {
unmap(self:acPort, system:acPort);
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);
// Disonnect
disconnect(p_nodeB:syncPort, self:syncPort);
disconnect(p_nodeC:syncPort, self:syncPort);
disconnect(p_nodeD:syncPort, self:syncPort);
disconnect(self:syncPort, self:syncPort);
/**
* @desc Behavior function for initializing component's variables and tables
* @param p_positionTable Table containing position vectors of all nodes
* @param p_areaTable Table containing all defined geoAreas
* @param p_componentName Name of the component
*/
function f_initialiseComponent(
in PositionTable p_positionTable,
in charstring p_componentName)
runs on ItsNt {
vc_positionTable := p_positionTable;
vc_componentName := p_componentName;
} // end f_initialiseComponent
/**
* @desc Makes the simulated ITS node behave as a neighbour of IUT
*/
vc_neighbourDefault := activate(a_neighbourDefault());
tepelmann
committed
f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader));
/**
* @desc Makes the simulated ITS node behave as not being a neighbour of IUT
*/
} // end geoConfigurationFunctions
group geoPositionFunctions {
/**
* @desc Add a position vector in position table
* @param p_positionTable Position table to be updated
* @param p_positionKey Reference key of the added position vector
* @param p_positionValue Added position vector
*/
in LongPosVector p_positionValue
) {
key := p_positionKey,
position := p_positionValue
};
/**
* @desc Get the position vector corresponding to a key
* @param p_positionKey Reference key of the searched position vector
* @return LongPosVector - The serached position vector
*/
in charstring p_positionKey
) runs on ItsNt
return LongPosVector {
var LongPosVector v_return;
var integer i := 0;
for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
if (vc_positionTable[i].key == p_positionKey) {
v_return := vc_positionTable[i].position;
}
}
return v_return;
}
/**
* @desc Compute a position based on reference point and distance factors
* @param p_refPosition Reference point
* @param p_longitudeFactor Number of PX_DISTANCE_UNIT applied for computing longitude
* @param p_latitudeFactor Number of PX_DISTANCE_UNIT applied for computing latitude
* @return LongPosVector - Computed position
* @see PX_DISTANCE_UNIT
*/
function f_computePosition(
in LongPosVector p_refPosition,
in integer p_longitudeFactor,
in integer p_latitudeFactor
) return LongPosVector {
var LongPosVector v_return := p_refPosition;
v_return.latitude := v_return.latitude + p_latitudeFactor * PX_DISTANCE_UNIT;
v_return.longitude := v_return.longitude + p_longitudeFactor * PX_DISTANCE_UNIT;
/**
* @desc Add a geoArea in geoArea table
* @param p_geoAreaTable GeoArea table to be updated
* @param p_areaKey Reference key of the added geoArea
* @param p_geoArea Added geoArea
*/
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
};
}
/**
* @desc Get the geoArea corresponding to a key
* @param p_areaName Reference key of the searched geoArea
* @return GeoArea - The serached geoArea
*/
in charstring p_areaName
) runs on ItsNt
return GeoArea {
var GeoArea v_return;
var integer i := 0;
for (i:=0; i<lengthof(vc_areaTable); i:=i+1) {
if (vc_areaTable[i].key == p_areaName) {
v_return := vc_areaTable[i].geoArea;
/**
* @desc Get the geoBroadcastArea corresponding to a key
* @param p_areaName Reference key of the searched geoBroadcastArea
* @return GeoBroadcastArea - The serached geoBroadcastArea
*/
function f_getGeoBroadcastArea(in charstring p_areaName) runs on ItsNt
return GeoBroadcastArea {
return f_geoArea2GeoBroadcastArea(f_getArea(p_areaName));
/**
* @desc Get the GeoAnycastArea corresponding to a key
* @param p_areaName Reference key of the searched GeoAnycastArea
* @return GeoAnycastArea - The serached GeoAnycastArea
*/
function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsNt
return GeoAnycastArea {
return f_geoArea2GeoAnycastArea(f_getArea(p_areaName));
/**
* @desc Convert GeoArea type to GeoBroadcastArea
* @param p_area GeoArea to be converted
* @return GeoBroadcastArea
*/
function f_geoArea2GeoBroadcastArea(GeoArea p_area)
return GeoBroadcastArea {
var GeoBroadcastArea v_broadcastArea;
if (p_area.shape == e_geoCircle) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
}
else if (p_area.shape == e_geoRect) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
}
else if (p_area.shape == e_geoElip) {
v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
}
else {
v_broadcastArea.geoBroadcastSubType := e_reserved;
}
v_broadcastArea.geoBroadcastArea := p_area.area;
return v_broadcastArea;
/**
* @desc Convert GeoArea type to GeoAnycastArea
* @param p_area GeoArea to be converted
* @return GeoAnycastArea
*/
function f_geoArea2GeoAnycastArea(GeoArea p_area)
return GeoAnycastArea {
var GeoAnycastArea v_anycastArea;
if (p_area.shape == e_geoCircle) {
v_anycastArea.geoAnycastSubType := e_geoAnycastCircle;
}
else if (p_area.shape == e_geoRect) {
v_anycastArea.geoAnycastSubType := e_geoAnycastRect;
}
else if (p_area.shape == e_geoElip) {
v_anycastArea.geoAnycastSubType := e_geoAnycastElip;
}
else {
v_anycastArea.geoAnycastSubType := e_reserved;
}
v_anycastArea.geoAnycastArea := p_area.area;
return v_anycastArea;
}
/**
* @desc Compute a square geoArea
* @param p_centerLongPosVector Center point of the square area
* @param p_distanceA Width of the square area in meters
* @return GeoArea - Computed geoArea
*/
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;
}
/**
* @desc Compute distance between two points
* @param p_pointA First point
* @param p_pointB Second point
* @return Computed distance in meters
* @see fx_computeDistance
*/
function f_distance(
in LongPosVector p_pointA,
in LongPosVector p_pointB
) return float {
log("*** f_distance: INFO: calling fx_computeDistance() ***");
return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);
}
* @desc The base default.
*/
altstep a_default() runs on ItsNt {
var LongPosVector v_longPosVectorIut;
[] geoNetworkingPort.receive {
log("*** a_default: ERROR: Received an unexpected message ***");
f_selfOrClientSyncAndVerdict("error", e_error);
log("*** a_default: ERROR: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
log("*** a_default: ERROR: Timeout while awaiting the reception of a message ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
/**
* @desc Neighbour default altstep (answers to LS Requests)
*/
altstep a_neighbourDefault() runs on ItsNt {
[] a_receiveLsRequestAndReply(
berge
committed
?, f_getPosition(vc_componentName).gnAddr.mid,
f_getPosition(vc_componentName),
[] a_default() {
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
/**
* @desc Default handling cf01 de-initialisation.
*/
altstep a_cf01Down() runs on ItsNt {
[] a_shutdown() {
f_poDefault();
f_cf01Down();
log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
}
/**
* @desc Default handling cf02 de-initialisation.
*/
altstep a_cf02Down(in ItsNt p_nodeB, in ItsNt p_nodeD) runs on ItsMtc {
[] a_shutdown() {
f_cf02Down(p_nodeB, p_nodeD);
log("*** a_cf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
}
/**
* @desc Default handling cf03 de-initialisation.
*/
altstep a_cf03Down(in ItsNt p_nodeB, in ItsNt p_nodeC) runs on ItsMtc {
[] a_shutdown() {
f_cf03Down(p_nodeB, p_nodeC);
log("*** a_cf03Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
}
/**
* @desc Default handling cf04 de-initialisation.
*/
altstep a_cf04Down(in ItsNt p_nodeB, in ItsNt p_nodeC, in ItsNt p_nodeD) runs on ItsMtc {
[] a_shutdown() {
f_cf04Down(p_nodeB, p_nodeC, p_nodeD);
log("*** a_cf04Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
stop;
}
}
/**
* @desc Receive GeoUnicast packet
* @param p_senderLongPosVec Expected sender position vector
* @param p_destinationShortPosVec Expected destination position vector
* @param p_seqNumber Expected sequence number
altstep a_receiveGeoUnicast(
in template (present) LongPosVector p_senderLongPosVec,
in template (present) ShortPosVector p_destinationShortPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoUnicastHeader(
p_senderLongPosVec,
p_destinationShortPosVec,
p_seqNumber)))) {
}
}
/**
* @desc Receive GeoUnicast packet for specific destination
* @param p_destinationShortPosVec Expected destination position vector
altstep a_receiveGeoUnicastWithDestination(in template (present) ShortPosVector p_destinationShortPosVec) runs on ItsNt {
[] a_receiveGeoUnicast(?, p_destinationShortPosVec, ?) {}
/**
* @desc Receive any GeoUnicast packet
*/
group geoGeoBroadcastAltsteps {
/**
* @desc Receive GeoBroadcast packet
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeader(
p_srcLongPosVec,
/**
* @desc Receive GeoBroadcast packet with specific Area and HopLimit
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
* @param p_broadcastArea Expected geoBroadcastArea
* @param p_hopLimit Expected hop limit
*/
altstep a_receiveGeoBroadcastWithAreaWithHopLimit(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoBroadcastArea p_broadcastArea,
in template (present) UInt8 p_hopLimit
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithAreaWithHopLimit(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_broadcastArea,
p_hopLimit
)))) {
}
}
/**
* @desc Receive GeoBroadcast packet for specific Geobroadcast Area
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
* @param p_broadcastArea Expected geoBroadcastArea
*/
altstep a_receiveGeoBroadcastWithArea(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) GeoBroadcastArea p_broadcastArea
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoBroadcastHeaderWithArea(
p_srcLongPosVec,
p_seqNumber,
p_broadcastArea
)))) {
}
}
} // end geoGeoBroadcastAltsteps
group geoGeoAnycastAltsteps {
/**
* @desc Receive GeoAnycast packet
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
*/
altstep a_receiveGeoAnycast(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeader(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber
)))) {
}
}
/**
* @desc Receive GeoAnycast packet with specific Area and HopLimit
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
* @param p_anycastArea Expected geoAnycastArea
* @param p_hopLimit Expected hop limit
*/
altstep a_receiveGeoAnycastWithAreaWithHopLimit(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoAnycastArea p_anycastArea,
in template (present) UInt8 p_hopLimit
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithAreaWithHopLimit(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_anycastArea,
p_hopLimit
)))) {
}
}
/**
* @desc Receive GeoAnycast packet for specific GeoAnycast Area
* @param p_srcLongPosVec Expected source position vector
* @param p_senderLongPosVec Expected sender position vector
* @param p_seqNumber Expected sequence number
* @param p_anycastArea Expected geoAnycastArea
*/
altstep a_receiveGeoAnycastWithArea(
in template (present) LongPosVector p_srcLongPosVec,
in template (present) LongPosVector p_senderLongPosVec,
in template (present) UInt16 p_seqNumber,
in template (present) GeoAnycastArea p_anycastArea
) runs on ItsNt {
[] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoAnycastHeaderWithArea(
p_srcLongPosVec,
p_senderLongPosVec,
p_seqNumber,
p_anycastArea
)))) {
}
}
} // end geoGeoAnycastAltsteps
* @desc Receive Location Service Request
* @param p_seqNumber Expected sequence number of the received LS Request
* @param p_gnAddress GN address expected in received LS Request
* @param p_reqSrcPosVector Expected source position vector of the received LS Request
in template (present) UInt16 p_seqNumber,
berge
committed
in template (present) GN_Address.mid p_mid,
var GeoNetworkingInd v_msg;
[] geoNetworkingPort.receive(
mw_geoNwInd(
mw_geoNwPdu(
mw_lsRequestHeader(
p_seqNumber,
berge
committed
p_mid
)
)
)
) -> 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
* @param p_reqSeqNumber Expected sequence number of the received LS Request
* @param p_gnAddress GN address expected in received LS Request
* @param p_repSrcPosVector Source position vector of the sent LS Response
* @param p_repSenderPosVector Sender position vector of the sent LS Response
berge
committed
in template (value) GN_Address.mid p_mid,
in template (value) LongPosVector p_repSenderPosVector
var LongPosVector v_repDstPosVector;
berge
committed
[] a_receiveLsRequest(p_reqSeqNumber, p_mid, v_repDstPosVector) {
f_sendGeoNetMessage(m_geoNwReq(m_geoNwPdu(
f_longPosVector2ShortPosVector(v_repDstPosVector),
}
}
} // end geoLocationServiceAltsteps
} // end geoAltsteps
group preambles {
/**
* @desc The default preamble.
*/
function f_prDefault() runs on ItsNt {
activate(a_default());
}
/**
* @desc Preamble for non-neighbour nodes
*/
function f_prNonNeighbour() runs on ItsNt {
f_prDefault();
}
/**
* @desc Preamble for neighbour nodes
*/
function f_prNeighbour() runs on ItsNt {
/**
* @desc Brings the IUT into an initial state.
*/
function f_initialState() {
var ItsNt v_initComponent := ItsNt.create;
berge
committed
map(v_initComponent:utPort, system:utPort);
v_initComponent.start(f_utInitializeIut(m_gnInitialize));
v_initComponent.done;
berge
committed
unmap(v_initComponent:utPort, system:utPort);
/**
* @desc Receive and reply to LS Requests
* @param p_reqSeqNumber Expected sequence number of the received LS Request
* @param p_gnAddress GN address expected in received LS Request
* @param p_repSrcPosVector Source position vector of the sent LS Response
* @param p_repSenderPosVector Sender position vector of the sent LS Response
*/
function f_handleLocationService(
in template (present) UInt16 p_reqSeqNumber,
berge
committed
in template (value) GN_Address.mid p_mid,
in template (value) LongPosVector p_repSrcPosVector,
in template (value) LongPosVector p_repSenderPosVector
) runs on ItsNt {
tc_ac.start;
alt {
berge
committed
[] a_receiveLsRequestAndReply(p_reqSeqNumber, p_mid, p_repSrcPosVector, p_repSenderPosVector) {
tc_ac.stop;
}
}
}
/**
* @desc Send LS request and receive LS Reply
* @param p_reqSrcPosVector Source position vector of the sent LS Request
* @param p_reqSeqNumber Sequence number of the sent LS Request
* @param p_gnAddress GN address for which the LS Request is sent
* @param p_repSrcPosVector Expected source position vector in received LS Response
* @return FncRetCode
*/
function f_processLocationService(
in template (value) LongPosVector p_reqSrcPosVector,
in template (value) UInt16 p_reqSeqNumber,
in template (value) GN_Address p_gnAddress,
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
) 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 {
/**
* @desc Postamble for neighbour nodes
*/
function f_poNeighbour() runs on ItsNt {
* @desc Triggers event in the test system adaptation.
* @param p_event The event to trigger
* @return FncRetCode
function f_acTriggerEvent(template (value) AcGnPrimitive p_event) runs on ItsAdapterComponent return FncRetCode {
var FncRetCode v_ret := e_success;
}
* @desc Get the position vector corresponding to a specific GN address
* @param p_gnAddress GN address for which the search is performed
* @return LongPosVector - IUT's position
function f_acGetLongPosVector(GN_Address p_gnAddress) runs on ItsAdapterComponent return LongPosVector {
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;
log("*** f_acGetLongPosVector: ERROR: Received unexpected message ***");
f_selfOrClientSyncAndVerdict("error", e_error);
}
[] tc_ac.timeout {
log("*** f_acGetLongPosVector: ERROR: Timeout while waiting for adapter control event result ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
}
return v_result.getLongPosVector;
}
/**
* @desc Triggers test adapter to send beacons for multiple neighbours
* @param p_numberOfNeighbour Number of neighbours to simulate
* @return FncRetCode
*/
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));
}
group commonFunctions {
/**
* @desc Gets the value of the lifetime in seconds.
* @param p_lifetime Lifetime to be converted
* @return Lifetime in seconds