Newer
Older
* @author ETSI / STF405 / STF449
* @version $URL$
* $Id$
* @desc Module containing functions for GeoNetworking
// Libcommon
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
import from LibCommon_VerdictControl {type FncRetCode;}
import from LibCommon_Sync all;
import from LibItsGeoNetworking_Functions all;
import from LibItsGeoNetworking_TestSystem all;
import from LibItsGeoNetworking_Pics all;
import from LibItsExternal_TypesAndValues {type MacAddress};
/**
* @desc Requests to bring the IUT in an initial state
* @param p_init The initialisation to trigger.
*/
function f_utInitializeIut(template (value) UtInitialize p_init) runs on ItsBaseGeoNetworking {
tc_wait.stop;
log("*** f_utInitializeIut: INFO: IUT initialized ***");
}
[] utPort.receive {
tc_wait.stop;
log("*** f_utInitializeIut: INFO: IUT could not be initialized ***");
f_selfOrClientSyncAndVerdict("error", e_error);
}
[] tc_wait.timeout {
log("*** f_utInitializeIut: INFO: IUT could not be initialized in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
[else] { // Shortcut defaults
*/
function f_utChangePosition() runs on ItsBaseGeoNetworking {
log("*** f_utChangePosition: INFO: IUT position changed ***");
}
[] utPort.receive {
tc_wait.stop;
log("*** f_utChangePosition: INFO: IUT position not changed ***");
f_selfOrClientSyncAndVerdict("error", e_error);
}
[] tc_wait.timeout {
log("*** f_utChangePosition: INFO: IUT position not changed in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
[else] { // Shortcut defaults
}
/**
* @desc Triggers event from the application layer
* @param p_event The event to trigger.
*/
function f_utTriggerEvent(template (value) UtGnTrigger p_event) runs on ItsGeoNetworking return boolean {
// Variables
var boolean v_return := true;
tc_wait.stop;
}
[] utPort.receive {
tc_wait.stop;
}
[] tc_wait.timeout {
group geoConfigurationFunctions {
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - two ITS nodes (nodeA, nodeB)
* - Area1 which only includes NodeB and IUT
// Variables
var PositionTable v_positionTable := {};
var GeoAreaTable v_areaTable := {};
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
map(self:geoNetworkingPort, system:geoNetworkingPort);
// Connect
f_connect4SelfOrClientSync();
//Initialze the IUT
f_initialState();
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
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_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
function f_cf02Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeD, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
activate(a_cf02Down());
if(p_mainUtComponent == c_compMTC) {
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
function f_cf02Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
unmap(self:acPort, system:acPort);
} // end f_cf02Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* - one ITS node in direction of NodeA (NodeB)
* - Area2 which only includes NodeB
* NodeB being close to the area center
* @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
function f_cf03Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeC, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
if(p_mainUtComponent == c_compMTC) {
// MTC intializes IUT
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
}
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
/**
* @desc Deletes configuration cf03
*/
function f_cf03Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
unmap(self:acPort, system:acPort);
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeA)
* 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_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
function f_cf04Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeC, omit}, {c_compNodeD, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
if(p_mainUtComponent == c_compMTC) {
// MTC intializes IUT
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
}
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
/**
* @desc Deletes configuration cf04
*/
function f_cf04Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeB)
* - one ITS node not in direction of NodeB and having
* longest distance to NodeB (NodeE)
* - Area1 which only includes NodeB, NodeD and IUT
* @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
*/
function f_cf05Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var GeoAreaTable v_areaTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeE, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
connect(self:syncPort, mtc:syncPort);
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
activate(a_cf05Down());
//Initialze the IUT
if(p_mainUtComponent == c_compMTC) {
// MTC intializes IUT
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
}
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
}
/**
* @desc Deletes configuration cf05
*/
function f_cf05Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
unmap(self:acPort, system:acPort);
unmap(self:utPort, system:utPort);
disconnect(self:syncPort, mtc:syncPort);
} // end f_cf05Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeB)
* - one ITS node not in direction of NodeB and having
* shortest distance to NodeB (NodeF)
* - Area1 which only includes NodeB, NodeD and IUT
* - IUT not in sectorial area of NodeB-NodeF
* @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
*/
function f_cf06Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var GeoAreaTable v_areaTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeF, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
connect(self:syncPort, mtc:syncPort);
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
activate(a_cf06Down());
//Initialze the IUT
if(p_mainUtComponent == c_compMTC) {
// MTC intializes IUT
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
}
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
}
/**
* @desc Deletes configuration cf06
*/
function f_cf06Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
unmap(self:acPort, system:acPort);
unmap(self:utPort, system:utPort);
disconnect(self:syncPort, mtc:syncPort);
} // end f_cf06Down
/**
* @desc This configuration features:
* - one ITS node (IUT)
* - one ITS node (NodeB)
* - one ITS node in direction of NodeB and having
* shortest distance to NodeB (NodeD)
* - Area1 which only includes NodeB, NodeD and IUT
* @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
*/
function f_cf07Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
// Variables
var PositionTable v_positionTable := {};
var GeoAreaTable v_areaTable := {};
var ItsGeoNetworking v_component;
var integer i;
// Select components
vc_componentTable := {{c_compNodeB, omit}, {c_compNodeD, omit}};
// Create components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent := ItsGeoNetworking.create(vc_componentTable[i].componentName) alive;
}
// Map & Connect
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
connect(self:syncPort, mtc:syncPort);
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
map(vc_componentTable[i].gnComponent:acPort, system:acPort);
map(vc_componentTable[i].gnComponent:utPort, system:utPort);
map(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
connect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
activate(a_cf07Down());
//Initialze the IUT
if(p_mainUtComponent == c_compMTC) {
// MTC intializes IUT
f_initialState();
}
else {
v_component := f_getComponent(p_mainUtComponent);
v_component.start(f_initialState());
v_component.done;
}
// Positions & Areas
f_preparePositionsAndAreas(v_positionTable, v_areaTable);
// Initialize components
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.start(f_initialiseComponent(v_positionTable, v_areaTable, vc_componentTable[i].componentName));
}
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
vc_componentTable[i].gnComponent.done;
}
}
/**
* @desc Deletes configuration cf06
*/
function f_cf07Down() runs on ItsMtc {
var integer i;
// Unmap & Disconnect
for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
unmap(vc_componentTable[i].gnComponent:utPort, system:utPort);
unmap(vc_componentTable[i].gnComponent:acPort, system:acPort);
unmap(vc_componentTable[i].gnComponent:geoNetworkingPort, system:geoNetworkingPort);
disconnect(vc_componentTable[i].gnComponent:syncPort, self:syncPort);
}
unmap(self:acPort, system:acPort);
unmap(self:utPort, system:utPort);
disconnect(self:syncPort, mtc:syncPort);
} // end f_cf06Down
/**
* @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,
vc_positionTable := p_positionTable;
* @desc Makes the simulated ITS node behave as a neighbour of IUT
function f_startBeingNeighbour() runs on ItsGeoNetworking {
vc_neighbourDefault := activate(a_neighbourDefault());
tepelmann
committed
f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader));
f_sleepIgnoreDef(PX_NEIGHBOUR_DISCOVERY_DELAY);
* @desc Makes the simulated ITS node behave as not being a neighbour of IUT
function f_stopBeingNeighbour() runs on ItsGeoNetworking {
group componentFunctions {
* @desc Get the component corresponding to a key
* @param p_componentName Name searched component
* @return ItsGeoNetworking - The searched position vector
*/
function f_getComponent(
in charstring p_componentName
) runs on ItsMtc
return ItsGeoNetworking {
var integer i := 0;
for (i:=0; i<lengthof(vc_componentTable); i:=i+1) {
if (vc_componentTable[i].componentName == p_componentName) {
v_return := vc_componentTable[i].gnComponent;
}
}
}
}
/**
* @desc Prepare positions and areas tables according to general constellation
* @param p_positionTable Position Table
* @param p_areaTable Area Table
*/
function f_preparePositionsAndAreas(
inout PositionTable p_positionTable,
inout GeoAreaTable p_areaTable
var LongPosVector v_longPosVectorIut, v_longPosVectorNodeA, v_longPosVectorNodeB, v_longPosVectorNodeC, v_longPosVectorNodeD, v_longPosVectorNodeE, v_longPosVectorNodeF;
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_longPosVectorNodeE := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeE, c_latitudeFactorNodeE);
v_longPosVectorNodeF := f_computePosition(v_longPosVectorIut, c_longitudeFactorNodeF, c_latitudeFactorNodeF);
// Propagate GN addresses
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);
v_longPosVectorNodeE.gnAddr := f_getTsGnLocalAddress(c_compNodeE);
v_longPosVectorNodeF.gnAddr := f_getTsGnLocalAddress(c_compNodeF);
// Position table
f_addPosition(p_positionTable, c_compIut, v_longPosVectorIut);
f_addPosition(p_positionTable, c_compNodeA, v_longPosVectorNodeA);
f_addPosition(p_positionTable, c_compNodeB, v_longPosVectorNodeB);
f_addPosition(p_positionTable, c_compNodeC, v_longPosVectorNodeC);
f_addPosition(p_positionTable, c_compNodeD, v_longPosVectorNodeD);
f_addPosition(p_positionTable, c_compNodeE, v_longPosVectorNodeE);
f_addPosition(p_positionTable, c_compNodeF, v_longPosVectorNodeF);
// Area table
f_addArea(p_areaTable, c_area1,
f_computeCircularArea(v_longPosVectorNodeD, float2int(5.0 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
f_addArea(p_areaTable, c_area2,
f_computeCircularArea(v_longPosVectorNodeB, float2int(1.5 * f_distance(v_longPosVectorNodeB, v_longPosVectorNodeD))));
/**
* @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 searched position vector
in charstring p_positionKey
tepelmann
committed
var LongPosVector v_return := null;
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;
}
}
tepelmann
committed
if((v_return != null) and (v_return.timestamp == 0)) {
v_return.timestamp := f_computeGnTimestamp();
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
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
};
}
* @param p_areaName Reference key of the searched geoArea
* @return GeoArea - The serached 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;
* @param p_areaName Reference key of the searched geoBroadcastArea
* @return GeoBroadcastArea - The serached geoBroadcastArea
*/
function f_getGeoBroadcastArea(in charstring p_areaName) runs on ItsGeoNetworking
return GeoBroadcastArea {
return f_geoArea2GeoBroadcastArea(f_getArea(p_areaName));
* @param p_areaName Reference key of the searched GeoAnycastArea
* @return GeoAnycastArea - The serached GeoAnycastArea
*/
function f_getGeoAnycastArea(in charstring p_areaName) runs on ItsGeoNetworking
return GeoAnycastArea {
return f_geoArea2GeoAnycastArea(f_getArea(p_areaName));
/**
* @desc Convert GeoArea type to GeoBroadcastArea
* @param p_area GeoArea to be converted
* @return GeoBroadcastArea
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
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
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,
/**
* @desc Compute a circular geoArea
* @param p_centerLongPosVector Center point of the square area
* @param p_distanceA Radius of the square area in meters
* @return GeoArea - Computed geoArea
*/
function f_computeCircularArea(
in UInt16 p_distanceA
) return GeoArea {
var GeoArea v_geoArea;
v_geoArea := {
shape := e_geoCircle,
area := {
geoAreaPosLatitude := p_centerLongPosVector.latitude,
geoAreaPosLongitude := p_centerLongPosVector.longitude,
distanceA := p_distanceA,
distanceB := 0,