ItsRSUsSimulator_Functions.ttcn 56.6 KB
Newer Older
garciay's avatar
garciay committed
1
2
3
4
5
6
7
8
9
10
11
12
13
module ItsRSUsSimulator_Functions {
    
    // LibCommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_DataStrings all;
    import from LibCommon_VerdictControl all;
    import from LibCommon_Sync all;
    import from LibCommon_Time all;
    
    // LibIts
    import from ITS_Container language "ASN.1:1997" all;
    import from CAM_PDU_Descriptions language "ASN.1:1997" all;
    import from DENM_PDU_Descriptions language "ASN.1:1997" all;
14
15
16
    import from MAPEM_PDU_Descriptions language "ASN.1:1997" all;
    import from SPATEM_PDU_Descriptions language "ASN.1:1997" all;
    import from IVIM_PDU_Descriptions language "ASN.1:1997" all;
17
    //import from EVCSN_PDU_Descriptions language "ASN.1:1997" all;
18
19
    import from SREM_PDU_Descriptions language "ASN.1:1997" all;
    import from SSEM_PDU_Descriptions language "ASN.1:1997" all;
garciay's avatar
garciay committed
20
    import from DSRC language "ASN.1:1997" all;
21
22
    import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
    import from IEEE1609dot2 language "ASN.1:1997" all;
vagrant's avatar
vagrant committed
23
24
25
26
27
    import from EtsiTs102941BaseTypes language "ASN.1:1997" all;
    import from EtsiTs102941TypesEnrolment language "ASN.1:1997" all;
    import from EtsiTs102941TypesAuthorization language "ASN.1:1997" all;
    import from EtsiTs102941TypesAuthorizationValidation language "ASN.1:1997" all;
    import from EtsiTs102941MessagesCa language "ASN.1:1997" all;
28
    import from EtsiTs103097Module language "ASN.1:1997" all;
garciay's avatar
garciay committed
29
30
31
32
33
34
35
36
    
    // LibItsCommon
    import from LibItsCommon_Functions all;
    
    // LibItsBtp
    import from LibItsBtp_TypesAndValues all;
    import from LibItsBtp_Templates all;
    
garciay's avatar
garciay committed
37
    // LibItsCam
38
    import from LibItsCam_TypesAndValues all;
garciay's avatar
garciay committed
39
40
    import from LibItsCam_Templates all;
    
garciay's avatar
garciay committed
41
    // LibItsDenm
42
    import from LibItsDenm_TypesAndValues all;
garciay's avatar
garciay committed
43
44
    import from LibItsDenm_Templates all;
    
garciay's avatar
garciay committed
45
46
47
    // LibItsMapemSpatemm
    import from LibItsMapemSpatem_Templates all;
    
48
49
50
51
52
53
    // LibItsMapemSpatemm
    import from LibItsIvim_Templates all;
    
    // LibItsMapemSpatemm
    import from LibItsSremSsem_Templates all;
    
garciay's avatar
garciay committed
54
55
56
57
58
59
60
    // LibItsGeoNetworking
    import from LibItsGeoNetworking_TestSystem all;
    import from LibItsGeoNetworking_Functions all;
    import from LibItsGeoNetworking_Templates all;
    import from LibItsGeoNetworking_TypesAndValues all;
    import from LibItsGeoNetworking_Pixits all;
    
garciay's avatar
garciay committed
61
62
63
    // LibItsSecurity
    import from LibItsSecurity_TypesAndValues all;
    import from LibItsSecurity_Functions all;
vagrant's avatar
vagrant committed
64
65
66
67
68
69
70
71
    import from LibItsSecurity_Templates all;
    
    // LibItsHttp
    import from LibItsHttp_TypesAndValues all;
    import from LibItsHttp_Templates all;
    import from LibItsHttp_BinaryTemplates all;
    import from LibItsHttp_Functions all;
    import from LibItsHttp_TestSystem all;
garciay's avatar
garciay committed
72
    
73
74
    // LibItsPki
    import from LibItsPki_TypesAndValues all;
vagrant's avatar
vagrant committed
75
    import from LibItsPki_Templates all;
76
    import from LibItsPki_Functions all;
vagrant's avatar
vagrant committed
77
78
79
    import from LibItsPki_TestSystem all;
    import from LibItsPki_Pics all;
    import from LibItsPki_Pixits all;
80
    
garciay's avatar
garciay committed
81
82
83
84
    // AtsRSUsSimulator
    import from ItsRSUsSimulator_TypesAndValues all;
    import from ItsRSUsSimulator_TestSystem all;
    import from ItsRSUsSimulator_Templates all;
85
    import from ItsRSUsSimulator_PicsInitConsts all;
garciay's avatar
garciay committed
86
87
88
    import from ItsRSUsSimulator_Pics all;
    import from ItsRSUsSimulator_Pixits all;
    
garciay's avatar
garciay committed
89
90
    group externalFunctions {
        
garciay's avatar
garciay committed
91
92
93
94
95
96
97
98
99
        /**
         * @desc    External function to compute a position using a reference position, a distance and an orientation 
         * @param   p_refLongPosVector  Vehicle reference position
         * @param   p_cenLongPosVector  Collision point position
         * @param   p_rotation          Rotation angle in 1/10 of degrees (from North)
         * @param   p_latitude          Computed position's latitude
         * @param   p_longitude         Computed position's longitude
         * @remark See http://www.movable-type.co.uk/scripts/latlong.html
         */
garciay's avatar
garciay committed
100
101
102
103
104
        external function fx_computePositionFromRotation(
                                                         in Int32 p_refLatitude, 
                                                         in Int32 p_refLongitude, 
                                                         in Int32 p_cenLatitude, 
                                                         in Int32 p_cenLongitude, 
garciay's avatar
garciay committed
105
                                                         in Int32 p_rotation, 
garciay's avatar
garciay committed
106
107
108
109
110
111
                                                         out Int32 p_latitude,
                                                         out Int32 p_longitude
        );
        
    } // End of group externalFunctions
    
112
    group rsuConfigurationFunctions {
garciay's avatar
garciay committed
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
        
        /**
         * @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 ItsRSUsSimulator {
            
            // Local variables
            
            // Map
            map(self:acPort, system:acPort);
128
            map(self:cfPort, system:cfPort);
garciay's avatar
garciay committed
129
130
131
132
133
134
135
            map(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            f_connect4SelfOrClientSync();
            activate(a_cf01Down());
            
            // Initialise secured mode
136
            LibItsGeoNetworking_Functions.f_initialiseSecuredMode();
137

138
            //Initialze the Config module
garciay's avatar
garciay committed
139
            //cfPort.send(CfInitialize:{});
garciay's avatar
garciay committed
140
141
            
            // Initialisations
142
            f_setup_rsu(vc_rsu_id);
143
144
145
146
147

            if (vc_pki == true) {
              // TODO              LibItsPki_Function.f_cf01();
            }
            
garciay's avatar
garciay committed
148
149
150
151
        } // End of function f_cf01Up
        
        function f_cf01Down() runs on ItsRSUsSimulator {
            
152
153
            vc_rsuMessagesValueList := {};
            
154
            LibItsGeoNetworking_Functions.f_uninitialiseSecuredMode();
garciay's avatar
garciay committed
155
156
157
            
            // Unmap
            unmap(self:acPort, system:acPort);
158
            unmap(self:cfPort, system:cfPort);
garciay's avatar
garciay committed
159
160
161
162
163
            unmap(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Disconnect
            f_disconnect4SelfOrClientSync();
            
164
            deactivate;
garciay's avatar
garciay committed
165
166
        } // End of function f_cf01Down
        
garciay's avatar
garciay committed
167
168
169
        /**
         * @desc Default handling cf01 de-initialisation.
         */
garciay's avatar
garciay committed
170
        altstep a_cf01Down() runs on ItsRSUsSimulator {
garciay's avatar
garciay committed
171
172
173
174
175
176
177
178
            [] a_shutdown() {
                f_poDefault();
                f_cf01Down();
                log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        } // End of altstep a_cf01Down
        
179
180
    } // End of group rsuConfigurationFunctions
    
garciay's avatar
garciay committed
181
182
183
184
    group usecase6 {
        
        function f_initialiseVehicleSimulatorComponent(
                                                       in ItsRSUsSimulator p_component,
garciay's avatar
garciay committed
185
                                                       in integer p_vehicleIndex,
garciay's avatar
garciay committed
186
187
188
189
                                                       out template (omit) CAM p_cam
        ) runs on ItsRSUsSimulator { 
            p_cam := 
                m_camMsg_vehicle(
garciay's avatar
garciay committed
190
                    f_getTsStationId() + p_vehicleIndex,
garciay's avatar
garciay committed
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
                    f_getCurrentTime() mod 65536,    // Shall be updated in function f_prepare_vehicle_cam
                    m_rsuPosition(
                        0,                           // Shall be computed
                        0                            // Shall be computed
                    )
            );
            map(p_component:geoNetworkingPort, system:geoNetworkingPort);
        } // End of function f_initialiseVehicleSimulatorComponent
        
        function f_uninitialiseVehicleSimulatorComponent(
                                                         in ItsRSUsSimulator p_component
        ) runs on ItsRSUsSimulator { 
            p_component.done;
            unmap(p_component:geoNetworkingPort, system:geoNetworkingPort);
        } // End of function f_uninitialiseVehicleSimulatorComponent
        
    } // End of group usecase6 
garciay's avatar
garciay committed
208
    
209
210
211
212
213
214
    function f_setup_rsu(
                         in integer p_rsu_id
    ) runs on ItsRSUsSimulator { 
        
        // Local variables
        var template (value) DenmParmContainers v_denmParmContainers;
215
        var template (omit) octetstring v_beacon := omit;
216
217
218
219
220
        var template (omit) DENMs v_denms := omit;
        var template (omit) CAM v_cam := omit;
        var template (omit) MAPEM v_mapem := omit;
        var template (omit) SPATEMs v_spatems := omit;
        var template (omit) IVIM v_ivim := omit;
221
        //var template (omit) EvcsnPdu v_evcsn := omit;
222
223
224
225
        var template (omit) SSEM v_ssem := omit;
        var integer v_counter;
        
        vc_longPosVectorRsu := PICS_RSU_PARAMS[p_rsu_id].longPosVector;
226
227
        // MAPEM, only if PX_ETSI_USE_CASE_ID is set to 3
        if ((vc_mapem == true) and (PX_ETSI_USE_CASE_ID == 3) and ispresent(PICS_MAPEM_PARMS_RSUs[p_rsu_id].intersections)) {
228
229
230
            // Build the list of the MAPEM events
            v_mapem := 
                m_mapemParm(
231
                    PICS_RSU_PARAMS[vc_rsu_id].stationID,
232
233
234
235
236
237
238
239
                    m_mapem(
                        f_getMsgIssueRevision(),
                        PICS_MAPEM_PARMS_RSUs[p_rsu_id].intersections,
                        PICS_MAPEM_PARMS_RSUs[p_rsu_id].roadSegments
            ));
            // Update revision fields
            v_mapem.map_.intersections[0].revision := f_incMsgIssueRevision();
            // TODO Add more?
240
241
        } else {
            vc_mapem := false;
242
        }
243
244
        // SPATEM, only if PX_ETSI_USE_CASE_ID is set to 3
        if ((vc_spatem == true) and (PX_ETSI_USE_CASE_ID == 3) and (lengthof(PICS_SPATEM_PARMS_RSUs[p_rsu_id]) != 0)) {
245
246
247
248
            // Reset counter
            vc_currentPhaseStartTime := 36001;
            vc_endPhaseStartTime := 0;
            vc_spatemStatesId := 0;
garciay's avatar
garciay committed
249
            // Build the list of the SPATEM events
250
251
252
253
254
255
256
257
258
259
260
261
262
263
            for (v_counter := 0; v_counter < lengthof(PICS_SPATEM_PARMS_RSUs[p_rsu_id]); v_counter := v_counter + 1) {
                v_spatems[v_counter] := 
                    m_spatemParm(
                        PICS_RSU_PARAMS[p_rsu_id].stationID,
                        m_spatem(
                            PICS_SPATEM_PARMS_RSUs[p_rsu_id][v_counter].intersections,
                            "SignalGroupID #" & int2str(PICS_SPATEM_PARMS_RSUs[p_rsu_id][v_counter].signalGroupID)
                ));
                for (var integer v_intersection := 0; v_intersection < lengthof(v_spatems[v_counter].spat.intersections); v_intersection := v_intersection + 1) {
                    vc_states[v_counter][v_intersection] := v_spatems[v_counter].spat.intersections[v_intersection].states;
                } // End of 'for' statement
                // TODO Build SPATEM with dynamic values
            } // End of 'for' statement
            // TODO Build SPATEM with dynamic values
264
265
        } else {
            vc_spatem := false;
266
        }
267
268
        // IVIM, only if PX_ETSI_USE_CASE_ID is set to 5
        if ((vc_ivim == true) and (PX_ETSI_USE_CASE_ID == 5) and ispresent(PICS_IVIM_PARMS_RSUs[p_rsu_id].provider)) {
garciay's avatar
garciay committed
269
            // Build the list of the IVIM events
270
271
272
273
274
275
276
277
278
            v_ivim := 
                m_ivimParm(
                    PICS_RSU_PARAMS[p_rsu_id].stationID,
                    m_ivimStructure(
                        m_iviManagementContainer(
                            PICS_IVIM_PARMS_RSUs[p_rsu_id].provider,
                            PICS_IVIM_PARMS_RSUs[p_rsu_id].iviIdentificationNumber,
                            0//IviStatus_new_
                        ),
garciay's avatar
garciay committed
279
                        PICS_IVIM_PARMS_RSUs[p_rsu_id].iviContainers
280
281
282
            ));
            // Update ivi status
            v_ivim.ivi.mandatory.validFrom := f_getCurrentTime();
283
            v_ivim.ivi.mandatory.validTo := valueof(v_ivim.ivi.mandatory.validFrom) + 43200000; // 12hours
284
285
        } else {
            vc_ivim := false;
286
        }
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
        /* // EVCSN, only if PX_ETSI_USE_CASE_ID is set to 8 */
        /* if ((vc_evcsn == true) and (PX_ETSI_USE_CASE_ID == 8)) { */
        /*     // Build the list of the EVCSN events */
        /*     v_evcsn :=  */
        /*         m_evcsnParm( */
        /*             PICS_RSU_PARAMS[p_rsu_id].stationID, */
        /*             m_evcsn( */
        /*                 m_itsPOIHeader( */
        /*                     -, */
        /*                     0, // To be updated at run time */
        /*                     - */
        /*                 ), */
        /*                 m_itsEVCSNData( */
        /*                     -, */
        /*                     { c_PICS_ITS_CHARGING } */
        /*                 ) */
        /*     )); */
        /*     // Update poi status */
        /* } else { */
        /*     vc_evcsn := false; */
        /* } */
308
        // DENM, only if PX_ETSI_USE_CASE_ID is set to 1
garciay's avatar
garciay committed
309
        if ((vc_denm == true) and (PX_ETSI_USE_CASE_ID == 1)) {
310
311
312
313
314
315
316
317
318
319
320
            // Build the list of the DENM events for the specified RSU (PX_RSU_ID) and the given zone (PX_ETSI_ZONE_ID)
            for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
                var DenmEventsParmsPerZone v_denmEventsParmsPerZone := PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1];
                
                v_denmParmContainers := m_denmParmContainers(
                    PICS_RSU_PARAMS[p_rsu_id].stationID,
                    f_incDenmSequenceNumber(),
                    PICS_DENM_REPETITION_INTERVAL,
                    v_denmEventsParmsPerZone[v_counter].eventPosition,
                    v_denmEventsParmsPerZone[v_counter].causeCodeType,
                    v_denmEventsParmsPerZone[v_counter].eventHistory,
321
                    v_denmEventsParmsPerZone[v_counter].traces,
322
                    PICS_DENM_VALIDITY_DURATION,
323
324
                    PICS_DENM_RELEVANCE_DISTANCE,
                    PICS_DENM_RELEVANCE_TRAFFIC_DIRECTION
325
326
                );
                v_denms[v_counter] := valueof(
327
328
                    m_denmPdu_rsu(
                        PICS_RSU_PARAMS[p_rsu_id].stationID,
329
330
331
332
333
334
335
336
337
                        m_denm(
                               v_denmParmContainers.managementContainer, 
                               v_denmParmContainers.situationContainer,
                               v_denmParmContainers.locationContainer
                )));
                if (ispresent(v_denmEventsParmsPerZone[v_counter].roadWorksContainerExtended)) {
                    v_denms[v_counter].denm.alacarte := m_alacarte(v_denmEventsParmsPerZone[v_counter].roadWorksContainerExtended);
                }
            } // End of 'for' statement
338
            // Update referenceDenms field, all except the current one
garciay's avatar
garciay committed
339
340
341
342
343
344
345
346
347
348
349
350
            for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
                if (ispresent(v_denms[v_counter].denm.alacarte.roadWorks)) {
                    var integer v_referenceDenms := 0;
                    for (var integer v_counter1 := 0; v_counter1 < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter1 := v_counter1 + 1) {
                        if (v_counter1 == v_counter) {
                            continue;
                        }
                        v_denms[v_counter].denm.alacarte.roadWorks.referenceDenms[v_referenceDenms] := v_denms[v_counter1].denm.management.actionID;
                        v_referenceDenms := v_referenceDenms + 1;
                    } // End of 'for' statement
                }
            } // End of 'for' statement
351
352
        } else {
            vc_denm := false;
353
354
        }
        // CAM
355
        if (vc_cam == true) {
356
            // Build the list of the CAM events
garciay's avatar
garciay committed
357
358
359
360
361
            if (PX_ETSI_USE_CASE_ID == 7) {
                vc_longPosVectorRsu := PICS_UC7_LPV.longPosVector;
                v_cam := 
                    m_camParm(
                        PICS_UC7_LPV.stationID,
garciay's avatar
garciay committed
362
363
                        PICS_UC7_LPV.stationType,
                        PICS_UC7_LPV.vehicleRole, 
garciay's avatar
garciay committed
364
365
366
367
368
369
370
371
372
373
374
                        m_rsuPosition(
                            PICS_UC7_LPV.longPosVector.latitude,
                            PICS_UC7_LPV.longPosVector.longitude
                        ), 
                        PICS_UC7_LPV.pathHistory,
                        {
                            rsuContainerHighFrequency := {
                                protectedCommunicationZonesRSU := omit
                            }
                        }
                );
garciay's avatar
garciay committed
375
376
377
378
379
380
381
382
383
384
            } else if (PX_ETSI_USE_CASE_ID == 6) { // FIXME To be removed only for test
                v_cam := 
                    m_camMsg_vehicle(
                      PICS_RSU_PARAMS[p_rsu_id].stationID,
                      f_getCurrentTime() mod 65536,    // Shall be updated in function f_prepare_vehicle_cam
                      m_rsuPosition(
                          vc_longPosVectorRsu.latitude,
                          vc_longPosVectorRsu.longitude
                      )
                 );
garciay's avatar
garciay committed
385
            } else if (PX_ETSI_USE_CASE_ID == 9) {
386
387
388
                v_cam := 
                    m_camParm(
                        PICS_RSU_PARAMS[p_rsu_id].stationID,
garciay's avatar
garciay committed
389
390
                        -,
                        -,
391
392
393
394
395
396
397
                        m_rsuPosition(
                            vc_longPosVectorRsu.latitude,
                            vc_longPosVectorRsu.longitude
                        ), 
                        PICS_RSU_PARAMS[p_rsu_id].pathHistory,
                        m_highFrequencyContainer_rsuContainerHighFrequency(
                            m_rSUContainerHighFrequency(
garciay's avatar
garciay committed
398
                                PICS_UC9_PCZ
399
400
401
402
403
                )));
            } else {
                v_cam := 
                    m_camParm(
                        PICS_RSU_PARAMS[p_rsu_id].stationID,
garciay's avatar
garciay committed
404
405
                        -,
                        -,
406
407
408
409
                        m_rsuPosition(
                            vc_longPosVectorRsu.latitude,
                            vc_longPosVectorRsu.longitude
                        ), 
garciay's avatar
garciay committed
410
411
412
413
414
415
                        PICS_RSU_PARAMS[p_rsu_id].pathHistory,
                        {
                            rsuContainerHighFrequency := {
                                protectedCommunicationZonesRSU := omit
                            }
                        }
416
417
                );
            }
418
        } 
419
        if (vc_beacon == true) {
420
421
422
            // Build the list of the BeACON events
            v_beacon := 'AAAAAAAA'O; // TODO Use a PICS
        } 
423
424
425
        // Build the messages value list for this RSU
        vc_rsuMessagesValueList[p_rsu_id] := 
            m_rsuProfile(
426
                v_beacon,
427
428
429
430
431
                v_cam, 
                v_denms,
                v_mapem,
                v_spatems,
                v_ivim,
432
                //                v_evcsn,
433
434
                v_ssem
        );
435
        //log("vc_rsuMessagesValueList[p_rsu_id] = ", vc_rsuMessagesValueList[p_rsu_id]);
436
        if (PICS_RSU_PARAMS[p_rsu_id].geoShape == e_geoCircle) {
437
438
439
440
441
442
443
444
445
446
            vc_geoArea := {
                shape := e_geoCircle,
                area := {
                    geoAreaPosLatitude := vc_longPosVectorRsu.latitude,
                    geoAreaPosLongitude := vc_longPosVectorRsu.longitude,
                    distanceA := PICS_RSU_PARAMS[p_rsu_id].geoParms.radius,
                    distanceB := PICS_RSU_PARAMS[p_rsu_id].geoParms.radius,
                    angle := 0
                }
            }
447
448
449
450
451
452
453
454
        } else {
            log("*** " & testcasename() & ": INCONC: Wrong PICS_RSU_GEOAREA_FORM event initialisation ***");
            setverdict(inconc);
            stop;
        }
        
    } // End of function f_setup_rsu
    
455
    function f_process_cf_event(
456
457
458
459
460
461
                                in CfEvent p_cfEvent
    ) runs on ItsRSUsSimulator return boolean {
        var template (value) CfResult v_result := true;
        
        // Terminate simulation
        if (p_cfEvent == "stop") {
462
463
464
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].beacon)) {
                tc_beacon.stop;
            }
465
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].cam)) {
466
467
                tc_cam.stop;
            }
468
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].denms)) {
469
470
                tc_denm.stop;
            }
471
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].mapem)) {
472
473
                tc_mapem.stop;
            }
474
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].spatems)) {
475
476
                tc_spatem.stop;
            }
477
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].ivim)) {
478
479
480
481
482
483
484
                tc_ivim.stop;
            }
        } else {
            v_result := false;
        }
        
        cfPort.send(v_result);
485
486
487

        return true;
    } // End of function f_process_cf_event
garciay's avatar
garciay committed
488
    
489
    function f_prepare_beacon(
490
                              out template (value) GnRawPayload p_payload
491
492
493
    ) runs on ItsRSUsSimulator {
        
        p_payload := valueof(
494
495
496
497
498
499
                             f_adaptPayload(
                                            vc_rsuMessagesValueList[vc_rsu_id].beacon,
                                            0,
                                            -,
                                            e_any
                                            )
500
        );
501
      log("f_prepare_beacon: ", p_payload);
garciay's avatar
garciay committed
502
    } // End of function f_prepare_beacon
503
    
garciay's avatar
garciay committed
504
    function f_prepare_cam(
505
                           out template (value) GnRawPayload p_payload
garciay's avatar
garciay committed
506
507
    ) runs on ItsRSUsSimulator {
        
508
        vc_rsuMessagesValueList[vc_rsu_id].cam.cam.generationDeltaTime := f_getCurrentTime() mod 65536; // See ETSI EN 302 637-2 V1.3.0 - Clause B.3 generationDelatTime
garciay's avatar
garciay committed
509
510
511
512
513
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
514
                            vc_rsuMessagesValueList[vc_rsu_id].cam
garciay's avatar
garciay committed
515
516
517
518
519
                ))),
                PICS_CAM_BTP_DESTINATION_PORT,
                PICS_CAM_BTP_SOURCE_PORT
            )
        );
520
    } // End of function f_prepare_cam
garciay's avatar
garciay committed
521
522
    
    function f_prepare_denm(
523
                            out template (value) GnRawPayload p_payload,
524
                            in boolean p_cancellation := false
garciay's avatar
garciay committed
525
526
    ) runs on ItsRSUsSimulator {
        
527
        // Update dynamic parms
528
        vc_rsuMessagesValueList[vc_rsu_id].denms[vc_denmEventCounter].denm.management.referenceTime  := f_getCurrentTime();
529
530
531
        if (p_cancellation == true) {
            vc_rsuMessagesValueList[vc_rsu_id].denms[vc_denmEventCounter].denm.management.termination := isCancellation;
        }
garciay's avatar
garciay committed
532
533
534
535
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
536
                        valueof(vc_rsuMessagesValueList[vc_rsu_id].denms[vc_denmEventCounter]
garciay's avatar
garciay committed
537
538
539
540
541
                ))),
                PICS_DENM_BTP_DESTINATION_PORT,
                PICS_DENM_BTP_SOURCE_PORT
            )
        ); 
542
        vc_denmEventCounter := (vc_denmEventCounter + 1) mod lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms);
543
    } // End of function f_prepare_denm
garciay's avatar
garciay committed
544
545
    
    function f_prepare_mapem(
546
                             out template (value) GnRawPayload p_payload
garciay's avatar
garciay committed
547
548
    ) runs on ItsRSUsSimulator {
        
garciay's avatar
garciay committed
549
550
551
552
553
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
554
                            vc_rsuMessagesValueList[vc_rsu_id].mapem
garciay's avatar
garciay committed
555
556
557
558
559
                ))),
                PICS_MAPEM_BTP_DESTINATION_PORT,
                PICS_MAPEM_BTP_SOURCE_PORT
            )
        );
560
    } // End of function f_prepare_mapem
garciay's avatar
garciay committed
561
    
562
    function f_computeEndPhaseStartTime(
563
564
                                        in TimeMark p_timeMark,
                                        in UInt32 p_inc
565
566
567
568
569
    ) return TimeMark {
        var UInt32 v_endPhaseStartTime := p_timeMark + p_inc;
        return v_endPhaseStartTime mod 36000;
    }
    
garciay's avatar
garciay committed
570
    function f_prepare_spatem(
571
                              in template (value) SPATEM p_spatem,
572
                              out template (value) GnRawPayload p_payload
garciay's avatar
garciay committed
573
    ) runs on ItsRSUsSimulator {
574
        var template (omit) SPATEM v_spatem := p_spatem; // Make a copy
575
        var TimeMark v_currentTimeMark := f_getCurrentTimeMark();
garciay's avatar
garciay committed
576
        
garciay's avatar
garciay committed
577
        if (vc_currentPhaseStartTime == 36001) { // First call
garciay's avatar
garciay committed
578
            vc_currentPhaseStartTime := v_currentTimeMark;
garciay's avatar
garciay committed
579
580
581
582
583
584
585
586
587
588
589
            select (vc_spatemStatesId) {
                case (0) {
                    vc_endPhaseStartTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
                }
                case (1) {
                    vc_endPhaseStartTime := f_computeEndPhaseStartTime(v_currentTimeMark, PICS_SPATEM_REPITITION_DURATION_STATE_30);
                }
                case (2) {
                    vc_endPhaseStartTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
                }
            } // End of 'select' statement
590
        }
garciay's avatar
garciay committed
591
592
593
594
595
596
597
598
        if (v_currentTimeMark >= vc_endPhaseStartTime) {
            var float t := (int2float(v_currentTimeMark - vc_endPhaseStartTime) / int2float(v_currentTimeMark));
            log("t = ", t);
            if (t < 1.0) { // Change state
                vc_spatemStatesId := (vc_spatemStatesId + 1) mod vc_spatemStatesNum;
                vc_currentPhaseStartTime := v_currentTimeMark;
                vc_endPhaseStartTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
            }
599
600
601
        }
        log("vc_currentPhaseStartTime = ", vc_currentPhaseStartTime);
        log("v_currentTimeMark = ", v_currentTimeMark);
garciay's avatar
garciay committed
602
        log("vc_endPhaseStartTime = ", vc_endPhaseStartTime);
603
        log("vc_spatemStatesId = ", vc_spatemStatesId);
604
605
        // Rebuild SPATEM message
        for (var integer v_intersection := 0; v_intersection < lengthof(v_spatem.spat.intersections); v_intersection := v_intersection + 1) {
606
            var template (omit) MovementList v_states := vc_states[vc_signalGroupParmId][v_intersection];
607
608
609
            v_spatem.spat.intersections[v_intersection].states := { v_states[vc_spatemStatesId] };
            v_spatem.spat.intersections[v_intersection].moy := f_getMinuteOfTheYear();
            v_spatem.spat.intersections[v_intersection].timeStamp := f_getDSecond();
garciay's avatar
garciay committed
610
            v_spatem.spat.intersections[v_intersection].revision := (valueof(v_spatem.spat.intersections[v_intersection].revision) + 1) mod 128;
611
            select (vc_spatemStatesId) {
garciay's avatar
garciay committed
612
613
                case (0) { // permissive_Movement_Allowed
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[1]; // permissive-clearance
garciay's avatar
garciay committed
614
615
616
617
618
                    //v_spatem.spat.intersections[v_intersection].states[2] := v_states[2];
                    // Update startTime & minEndTime
                    v_spatem.spat.intersections[v_intersection].states[0].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.startTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_40);
619
                }
garciay's avatar
garciay committed
620
621
                case (1) { // permissive-clearance
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[2]; // stop-And-Remain
garciay's avatar
garciay committed
622
623
624
625
626
                    //v_spatem.spat.intersections[v_intersection].states[2] := v_states[0];
                    // Update startTime & minEndTime
                    v_spatem.spat.intersections[v_intersection].states[0].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(v_currentTimeMark, PICS_SPATEM_REPITITION_DURATION_STATE_10);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.startTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_10);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_30);
627
                }
garciay's avatar
garciay committed
628
629
                case (2) { // stop-And-Remain
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[0]; // permissive_Movement_Allowed
garciay's avatar
garciay committed
630
631
632
633
634
                    //v_spatem.spat.intersections[v_intersection].states[2] := v_states[1];
                    // Update startTime & minEndTime
                    v_spatem.spat.intersections[v_intersection].states[0].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_20);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.startTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_20);
                    v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.minEndTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, PICS_SPATEM_REPITITION_DURATION_STATE_50);
635
636
637
638
639
                }
                case else {
                }
            } // End of 'select' statement
        } // End of 'for' statement
garciay's avatar
garciay committed
640
        log("v_spatem.spat.intersections = ", v_spatem.spat.intersections);
641
642
643
644
645
646
647
648
        
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
                            v_spatem
                ))),
649
650
                PICS_SPATEM_BTP_DESTINATION_PORT,
                PICS_SPATEM_BTP_SOURCE_PORT
651
652
            )
        );
garciay's avatar
garciay committed
653
        
654
    } // End of function f_prepare_spatem
garciay's avatar
garciay committed
655
656
    
    function f_prepare_ivim(
657
                            out template (value) GnRawPayload p_payload
garciay's avatar
garciay committed
658
659
    ) runs on ItsRSUsSimulator {
        
660
661
662
663
664
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
665
                            vc_rsuMessagesValueList[vc_rsu_id].ivim
666
667
668
669
670
                ))),
                PICS_IVIM_BTP_DESTINATION_PORT,
                PICS_IVIM_BTP_SOURCE_PORT
            )
        );
671
    } // End of function f_prepare_ivim
garciay's avatar
garciay committed
672
    
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
    /* function f_prepare_evcsn( */
    /*                          out template (value) GnRawPayload p_payload */
    /* ) runs on ItsRSUsSimulator { */
        
    /*     vc_rsuMessagesValueList[vc_rsu_id].evcsn.evcsn.poiHeader.timeStamp := f_getCurrentTime(); // Check if it is ITS or UTC time */
    /*     log("vc_rsuMessagesValueList[vc_rsu_id].evcsn", valueof(vc_rsuMessagesValueList[vc_rsu_id].evcsn)); */
    /*     p_payload := valueof( */
    /*         f_adaptPayload( */
    /*             bit2oct( */
    /*                 encvalue( */
    /*                     valueof( */
    /*                         vc_rsuMessagesValueList[vc_rsu_id].evcsn */
    /*             ))), */
    /*             PICS_EVCSN_BTP_DESTINATION_PORT, */
    /*             PICS_EVCSN_BTP_SOURCE_PORT */
    /*         ) */
    /*     ); */
    /* } // End of function f_prepare_evcsn */
garciay's avatar
garciay committed
691
    
garciay's avatar
garciay committed
692
693
694
    function f_adaptPayload(
                            in template (value) octetstring p_finalPayload,
                            in template (value) BtpPortId  p_destPort,
695
696
                            in template (value) BtpPortId  p_srcPort := 0,
                            in NextHeader p_nextHeader := PX_GN_UPPER_LAYER
697
698
    ) return template (value) GnRawPayload {
      var template (value) GnRawPayload v_payload := ''O;
garciay's avatar
garciay committed
699
        
700
        if(p_nextHeader == e_any) {
701
            v_payload := p_finalPayload;
garciay's avatar
garciay committed
702
703
704
            return v_payload;
        }
        
705
        if(p_nextHeader == e_ipv6) {
garciay's avatar
garciay committed
706
707
708
709
710
            log("*** " & testcasename() & ": INCONC: Layer IPv6 not supported ***");
            setverdict(inconc);
            stop;
        }
        
711
        if(p_nextHeader == e_btpA) {
garciay's avatar
garciay committed
712
            v_payload := int2oct(valueof(p_destPort), 2) & int2oct(valueof(p_srcPort), 2) & valueof(p_finalPayload);
garciay's avatar
garciay committed
713
714
715
            return v_payload;
        }
        
716
        if(p_nextHeader == e_btpB) {
garciay's avatar
garciay committed
717
            v_payload := int2oct(valueof(p_destPort), 2) & int2oct(valueof(p_srcPort), 2) & valueof(p_finalPayload);
garciay's avatar
garciay committed
718
719
720
721
            return v_payload;
        }
        
        return v_payload;
722
    } // End of function f_adaptPayload
garciay's avatar
garciay committed
723
724
725
726
727
728
729
730
731
732
733

    function f_isInApproach(
                            in ThreeDLocation p_detectionPoint,
                            in ThreeDLocation p_location,
                            in float p_dist := 150.0
    ) return boolean {
        var float v_dist := fx_computeDistance(p_detectionPoint.latitude, p_detectionPoint.longitude, p_location.latitude, p_location.longitude);
        log("v_dist = ", v_dist);
        return v_dist <= p_dist;
    }

garciay's avatar
garciay committed
734
735
736
737
    function f_mirror_and_send_vehicle_cam(
                                           in template (value) CAM p_camSimu,
                                           in CAM p_camVehicle,
                                           in ThreeDLocation p_location
garciay's avatar
garciay committed
738
739
    ) runs on ItsRSUsSimulator {
        // Local variables
garciay's avatar
garciay committed
740
        var ReferencePosition v_newPosition := p_camVehicle.cam.camParameters.basicContainer.referencePosition;
741
        var template (value) GnRawPayload v_payload;
garciay's avatar
garciay committed
742
        
garciay's avatar
garciay committed
743
        // Apply 90° rotation
garciay's avatar
garciay committed
744
        if (PICS_USE_LPV == true) {
garciay's avatar
garciay committed
745
746
747
            fx_computePositionFromRotation(
                p_location.latitude,
                p_location.longitude,
garciay's avatar
garciay committed
748
749
                PICS_UC6_COLLISION_POINT_Z2.latitude, // Z1
                PICS_UC6_COLLISION_POINT_Z2.longitude, // Z1
garciay's avatar
garciay committed
750
751
752
753
754
755
756
757
758
                900, 
                v_newPosition.latitude, 
                v_newPosition.longitude
            );
            log("Rotation: (", p_location.latitude, ", ", p_location.longitude, ") --> (", v_newPosition.latitude, ", ", v_newPosition.longitude, ")");
        } else {
            fx_computePositionFromRotation(
                p_camVehicle.cam.camParameters.basicContainer.referencePosition.latitude, 
                p_camVehicle.cam.camParameters.basicContainer.referencePosition.longitude, 
garciay's avatar
garciay committed
759
760
761
                PICS_UC6_COLLISION_POINT_Z2.latitude, // Z1 
                PICS_UC6_COLLISION_POINT_Z2.longitude, // Z1 
                2450, 
garciay's avatar
garciay committed
762
763
764
765
766
                v_newPosition.latitude, 
                v_newPosition.longitude
            );
            log("Rotation: (", p_camVehicle.cam.camParameters.basicContainer.referencePosition.latitude, ", ", p_camVehicle.cam.camParameters.basicContainer.referencePosition.longitude, ") --> (", v_newPosition.latitude, ", ", v_newPosition.longitude, ")");
        }
garciay's avatar
garciay committed
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
        /*v_newPosition.latitude := ;
        v_newPosition.longitude := ;*/
        // Update CAM
        p_camSimu.cam.generationDeltaTime := f_getCurrentTime() mod 65536; // See ETSI EN 302 637-2 V1.3.0 - Clause B.3 generationDelatTime
        p_camSimu.cam.camParameters.basicContainer.referencePosition := v_newPosition;
        p_camSimu.cam.camParameters.highFrequencyContainer := p_camVehicle.cam.camParameters.highFrequencyContainer;
        v_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
                            p_camSimu
                ))),
                PICS_CAM_BTP_DESTINATION_PORT,
                PICS_CAM_BTP_SOURCE_PORT
            )
garciay's avatar
garciay committed
783
        );
garciay's avatar
garciay committed
784
785
786
787
788
789
790
791
792
        // Update GN
        vc_longPosVectorRsu := PICS_UC6_VEHICLE_TEMPLATE_POSITION;
        vc_longPosVectorRsu.latitude := valueof(p_camSimu.cam.camParameters.basicContainer.referencePosition.latitude);
        vc_longPosVectorRsu.longitude := valueof(p_camSimu.cam.camParameters.basicContainer.referencePosition.longitude);
        vc_geoArea := PICS_UC6_VEHICLE_TEMPLATE_GEOAREA;
        vc_geoArea.area.geoAreaPosLatitude := valueof(p_camSimu.cam.camParameters.basicContainer.referencePosition.latitude);
        vc_geoArea.area.geoAreaPosLongitude := valueof(p_camSimu.cam.camParameters.basicContainer.referencePosition.longitude);
        // And send it
        f_send(v_payload, PICS_CAM_ITS_AID);
garciay's avatar
garciay committed
793
    } // End of function f_mirror_and_send_vehicle_cam
garciay's avatar
garciay committed
794
    
garciay's avatar
garciay committed
795
    function f_send(
796
                    in template (value) GnRawPayload p_payload,
797
                    in UInt32 p_its_aid
garciay's avatar
garciay committed
798
799
800
    ) runs on ItsRSUsSimulator {
        var GeoNetworkingPdu v_geoNetworkingPdu;
        
garciay's avatar
garciay committed
801
        vc_longPosVectorRsu.timestamp_ := f_computeGnTimestamp();
garciay's avatar
garciay committed
802
        
803
        if (p_its_aid == 36) { // CAM
804
            v_geoNetworkingPdu := valueof(m_geoNwPdu( // FIXME Use PIXIT parameter to get a fully configurable template
garciay's avatar
garciay committed
805
                m_geoNwShbPacket_payload(
806
807
808
                    vc_longPosVectorRsu,
                    valueof(p_payload)
                ),
809
810
811
812
                Lifetime:{
                  multiplier := c_defaultLifetime,
                  ltBase := e_100s
                },
garciay's avatar
garciay committed
813
                c_hopLimit1
814
            ));
garciay's avatar
garciay committed
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
        } else if (p_its_aid == 37) { // DENM
            v_geoNetworkingPdu := valueof(m_geoNwPdu( // FIXME Use PIXIT parameter to get a fully configurable template
                m_geoNwTsbPacket_payload(
                    f_incLocalSeqNumber(),
                    vc_longPosVectorRsu,
                    -,
                    -,
                    valueof(p_payload)
                ),
                Lifetime:{
                  multiplier := c_defaultLifetime,
                  ltBase := e_100s
                },
                c_hopLimit1
            ));
garciay's avatar
garciay committed
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
        } else if ((p_its_aid == 137) or (p_its_aid == 138))  { // MAPEM/SPATEM
            v_geoNetworkingPdu := valueof(m_geoNwPdu( // FIXME Use PIXIT parameter to get a fully configurable template
                m_geoNwTsbPacket_payload(
                    f_incLocalSeqNumber(),
                    vc_longPosVectorRsu,
                    -,
                    -,
                    valueof(p_payload)
                ),
                Lifetime:{
                  multiplier := c_defaultLifetime,
                  ltBase := e_100s
                },
                c_hopLimit1
            ));
845
846
847
848
849
850
851
852
853
854
        } else {
            v_geoNetworkingPdu := valueof(m_geoNwPdu( // FIXME Use PIXIT parameter to get a fully configurable template
                m_geoNwBroadcastPacket_payload( // TODO modifes 'template (value) GnNonSecuredPacket m_geoNwBroadcastPacket' to set the field
                    vc_longPosVectorRsu,
                    f_incLocalSeqNumber(),
                    f_geoArea2GeoBroadcastArea(vc_geoArea),
                    -,
                    -,
                    valueof(p_payload)
                ),
855
856
857
858
                Lifetime:{
                  multiplier := c_defaultLifetime,
                  ltBase := e_100s
                },
859
                c_hopLimit1
860
            ));
garciay's avatar
garciay committed
861
            v_geoNetworkingPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
862
        }
863
        f_sendGeoNetMessage(valueof(m_geoNwReq_linkLayerBroadcast(v_geoNetworkingPdu, p_its_aid)));
864
    } // End of function f_send
garciay's avatar
garciay committed
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884

    function f_processCam(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
        var bitstring v_enc_msg;
        log("CAM=", p_geoNetworkingPdu);
        if (PICS_SEND_CAM_INDICATION) {
          var UtCamEventInd v_utCamEventInd;
          var integer v_result;
          // Extract CAM message
          var octetstring v_payload := p_geoNetworkingPdu.gnPacket.packet.payload;
          // Remove BTP layer
          v_payload := substr(v_payload, 4, lengthof(v_payload) - 4);
          // Send UtEventCamIndication
          v_enc_msg := oct2bit(v_payload);
          if (decvalue(v_enc_msg, v_utCamEventInd.camMsg) == 0) {
            cfPort.send(v_utCamEventInd);
          }
        }
    }
garciay's avatar
garciay committed
885
886
887
888
    
    function f_processSrem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
889
        log("SREM=", p_geoNetworkingPdu);
890
891
        if (ispresent(p_geoNetworkingPdu.gnPacket.packet.payload)) {
          /* TODO Decode and process GnPayload or use different ports
892
893
894
            if (ispresent(p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload)) {
                if (ischosen(p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload.sremPacket)) {
                    var SignalRequestMessage v_signalRequestMessage := p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload.btpPacket.payload.decodedPayload.sremPacket.srm;
895
                    var template (value) GnRawPayload v_payload;
896
897
898
899
900
901
902
903
904
                    
                    log(v_signalRequestMessage);
                    // Build response
                    // TODO v_ssem.ssm.status
                    v_payload := valueof(
                        f_adaptPayload(
                            bit2oct(
                                encvalue(
                                    valueof(
garciay's avatar
garciay committed
905
906
907
                                        m_ssem(
                                            v_signalRequestMessage
                            )))),
908
909
910
911
                            PICS_SSEM_BTP_DESTINATION_PORT,
                            PICS_SSEM_BTP_SOURCE_PORT
                        )
                    );
912
913
                    // Send SSEM 
                    f_send(v_payload, PICS_SSEM_ITS_AID);
914
915
                } // else, ignore message
            } // else, ignore message
916
          */
917
        } // else, ignore message
918
    } // End of function f_processSrem
garciay's avatar
garciay committed
919
920
921
922
923
924
    
    function f_incLocalSeqNumber() runs on ItsRSUsSimulator return UInt16 {
        vc_localSeqNumber := (vc_localSeqNumber + 1) mod 65536;
        return vc_localSeqNumber;
    }
    
garciay's avatar
garciay committed
925
926
927
928
929
930
931
932
933
934
935
936
937
938
    function f_incMsgIssueRevision() runs on ItsRSUsSimulator return MsgCount {
        vc_msgIssueRevision := (vc_msgIssueRevision + 1) mod 128; // See MsgCount declaration
        return vc_msgIssueRevision;
    }
    
    function f_getMsgIssueRevision() runs on ItsRSUsSimulator return MsgCount {
        return vc_msgIssueRevision;
    }
    
    function f_incDenmSequenceNumber() runs on ItsRSUsSimulator return SequenceNumber {
        vc_sequenceNumber := (vc_sequenceNumber + 1) mod 65536; // See SequenceNumber declaration
        return vc_sequenceNumber;
    }
    
garciay's avatar
garciay committed
939
    function f_getDenmSequenceNumber() runs on ItsRSUsSimulator return SequenceNumber {
garciay's avatar
garciay committed
940
        return vc_sequenceNumber;
garciay's avatar
garciay committed
941
942
    }
    
garciay's avatar
garciay committed
943
944
945
946
    function f_payload_template(
                                in integer p_dest_port, 
                                in integer p_src_port
    ) return template (present) octetstring {
garciay's avatar
garciay committed
947
      log(">>> f_payload_template: ", p_dest_port, " - ", p_src_port);
948
949
950
        var template (present) Oct2 v_t1 := int2oct(PICS_SREM_BTP_DESTINATION_PORT, 2);
        var template (present) Oct2 v_t2 := int2oct(PICS_SREM_BTP_SOURCE_PORT, 2);
        var template (present) octetstring v_t3 := ? length (5 .. 65535);
filatov's avatar
filatov committed
951
        var template (present) octetstring v_out := valueof(v_t1) & valueof(v_t2) & valueof(v_t3);
garciay's avatar
garciay committed
952
953
        return v_out
    }
954
    
955
    altstep a_process_cf_ut_command() runs on ItsRSUsSimulator {
garciay's avatar
garciay committed
956
      var UtGnInitialize v_utGnInitialize;
957
      var UtPkiInitialize v_utPkiInitialize;
garciay's avatar
garciay committed
958
      var UtGnTrigger v_utGnTrigger;
garciay's avatar
garciay committed
959
      var UtCamTrigger v_utCamTrigger;
960
      var UtPkiTrigger v_utPkiTrigger;
garciay's avatar
garciay committed
961
962
963
964
965
966
      
        [] cfPort.receive(UtGnInitialize:?) -> value v_utGnInitialize {
          log("v_utGnInitialize = ", v_utGnInitialize);
          cfPort.send(UtGnResults: { utGnInitializeResult := true } );
          repeat;
        }
garciay's avatar
garciay committed
967
        [] cfPort.receive(UtGnTrigger:?) -> value v_utGnTrigger {
garciay's avatar
garciay committed
968
          cfPort.send(UtGnResults: { utGnTriggerResult := true } );
garciay's avatar
garciay committed
969
970
971
972
973
974
975
976
977
978
979
980
981
982
          log("v_utGnTrigger = ", v_utGnTrigger);
          if (ischosen(v_utGnTrigger.geoUnicast)) {
            var GnNonSecuredPacket v_geoNwUnicastPacket := valueof(
                                                                   m_geoNwUnicastPacket_with_payload(
                                                                                                     vc_longPosVectorRsu,
                                                                                                     f_getIutShortPosVector(),
                                                                                                     f_incLocalSeqNumber(),
                                                                                                     c_defaultHopLimit,
                                                                                                     v_utGnTrigger.geoUnicast.trafficClass,
                                                                                                     v_utGnTrigger.geoUnicast.payload
                                                                                                    ));
            var GeoNetworkingPdu v_geoNwPdu := valueof(
                                                       m_geoNwPdu(
                                                                  v_geoNwUnicastPacket,
983
                                                                  m_lifetimeBase1s(v_utGnTrigger.geoUnicast.lifetime),
garciay's avatar
garciay committed
984
985
986
                                                                  c_defaultHopLimit
                                                                 )
                                                      );
garciay's avatar
garciay committed
987
988
            v_geoNwPdu.gnPacket.packet.commonHeader.nextHeader := e_any;
            v_geoNwPdu.gnPacket.packet.extendedHeader.geoUnicastHeader.dstPosVector.gnAddr := v_utGnTrigger.geoUnicast.gnAddress;
garciay's avatar
garciay committed
989
            geoNetworkingPort.send(m_geoNwReq_linkLayerBroadcast(v_geoNwPdu));
garciay's avatar
garciay committed
990
991
992
993
994
995
996
997
998
999
1000
          } else if (ischosen(v_utGnTrigger.geoBroadcast)) {
            var GeoBroadcastArea v_broadcastArea;
            var GnNonSecuredPacket v_geoNwBroadcastPacket;
            var GeoNetworkingPdu v_geoNwPdu;

            if (v_utGnTrigger.geoBroadcast.shape == e_geoCircle) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastCircle;
            } else if (v_utGnTrigger.geoBroadcast.shape == e_geoRect) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastRect;
            } else if (v_utGnTrigger.geoBroadcast.shape == e_geoElip) {
              v_broadcastArea.geoBroadcastSubType := e_geoBroadcastElip;
For faster browsing, not all history is shown. View entire blame