ItsRSUsSimulator_Functions.ttcn 22.9 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
17
18
    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;
    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
19
    import from DSRC language "ASN.1:1997" all;
garciay's avatar
garciay committed
20
21
22
23
24
25
26
27
28
29
30
    
    // LibItsCommon
    import from LibItsCommon_Functions all;
    
    // LibItsBtp
    import from LibItsBtp_TypesAndValues all;
    import from LibItsBtp_Templates all;
    
    // LibItsDenm
    import from LibItsDenm_Templates all;
    
garciay's avatar
garciay committed
31
32
33
    // LibItsMapemSpatemm
    import from LibItsMapemSpatem_Templates all;
    
34
35
36
37
38
39
    // LibItsMapemSpatemm
    import from LibItsIvim_Templates all;
    
    // LibItsMapemSpatemm
    import from LibItsSremSsem_Templates all;
    
garciay's avatar
garciay committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    // 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;
    
    // AtsRSUsSimulator
    import from ItsRSUsSimulator_TypesAndValues all;
    import from ItsRSUsSimulator_TestSystem all;
    import from ItsRSUsSimulator_Templates all;
    import from ItsRSUsSimulator_Pics all;
    import from ItsRSUsSimulator_Pixits all;
    
54
    group rsuConfigurationFunctions {
garciay's avatar
garciay committed
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
        
        /**
         * @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);
70
            map(self:cfPort, system:cfPort);
garciay's avatar
garciay committed
71
72
73
74
75
76
77
78
79
            map(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Connect
            f_connect4SelfOrClientSync();
            activate(a_cf01Down());
            
            // Initialise secured mode
            f_initialiseSecuredMode();
            
80
81
            //Initialze the Config module
            cfPort.send(CfInitialize:{});
garciay's avatar
garciay committed
82
83
            
            // Initialisations
84
85
            f_setup_rsu(vc_rsu_id);
             
garciay's avatar
garciay committed
86
87
88
89
        } // End of function f_cf01Up
        
        function f_cf01Down() runs on ItsRSUsSimulator {
            
90
91
            vc_rsuMessagesValueList := {};
            
garciay's avatar
garciay committed
92
93
94
95
            f_uninitialiseSecuredMode();
            
            // Unmap
            unmap(self:acPort, system:acPort);
96
            unmap(self:cfPort, system:cfPort);
garciay's avatar
garciay committed
97
98
99
100
101
102
103
            unmap(self:geoNetworkingPort, system:geoNetworkingPort);
            
            // Disconnect
            f_disconnect4SelfOrClientSync();
            
        } // End of function f_cf01Down
        
104
105
106
107
108
109
110
111
    } // End of group rsuConfigurationFunctions
    
    function f_setup_rsu(
                         in integer p_rsu_id
    ) runs on ItsRSUsSimulator { 
        
        // Local variables
        var template (value) DenmParmContainers v_denmParmContainers;
112
        var template (omit) octetstring v_beacon := omit;
113
114
115
116
117
118
119
120
121
122
        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;
        var template (omit) SSEM v_ssem := omit;
        var integer v_counter;
        
        vc_longPosVectorRsu := PICS_RSU_PARAMS[p_rsu_id].longPosVector;
        // MAPEM
garciay's avatar
garciay committed
123
        if (PICS_GENERATE_MAPEM and ispresent(PICS_MAPEM_PARMS_RSUs[p_rsu_id].intersections)) {
124
125
126
            // Build the list of the MAPEM events
            v_mapem := 
                m_mapemParm(
127
                    PICS_RSU_PARAMS[vc_rsu_id].stationID,
128
129
130
131
132
133
134
135
136
137
                    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?
        }
        // SPATEM
garciay's avatar
garciay committed
138
        if (PICS_GENERATE_SPATEM and (lengthof(PICS_SPATEM_PARMS_RSUs[p_rsu_id]) != 0)) {
139
140
141
142
            // Reset counter
            vc_currentPhaseStartTime := 36001;
            vc_endPhaseStartTime := 0;
            vc_spatemStatesId := 0;
garciay's avatar
garciay committed
143
            // Build the list of the SPATEM events
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
            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
        }
        // IVIM
garciay's avatar
garciay committed
160
161
        if (PICS_GENERATE_IVIM and ispresent(PICS_IVIM_PARMS_RSUs[p_rsu_id].provider)) {
            // Build the list of the IVIM events
162
163
164
165
166
167
168
169
170
            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
171
                        PICS_IVIM_PARMS_RSUs[p_rsu_id].iviContainers
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
            ));
            // Update ivi status
            v_ivim.ivi.mandatory.validFrom := f_getCurrentTime();
        }
        // DENM
        if (PICS_GENERATE_DENM) {
            // 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,
189
190
191
192
                    v_denmEventsParmsPerZone[v_counter].traces,
                    -,
                    PICS_DENM_RELEVANCE_DISTANCE,
                    PICS_DENM_RELEVANCE_TRAFFIC_DIRECTION
193
194
                );
                v_denms[v_counter] := valueof(
195
196
                    m_denmPdu_rsu(
                        PICS_RSU_PARAMS[p_rsu_id].stationID,
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
                        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
        }
        // CAM
        if (PICS_GENERATE_CAM) {
            // Build the list of the CAM events
            v_cam := 
                m_camParm(
                    PICS_RSU_PARAMS[p_rsu_id].stationID,
                    m_rsuPosition(
                        vc_longPosVectorRsu.latitude,
                        vc_longPosVectorRsu.longitude
                    ), 
                    PICS_RSU_PARAMS[p_rsu_id].pathHistory
            );
        } 
220
221
222
223
        if (PICS_GENERATE_BEACON) {
            // Build the list of the BeACON events
            v_beacon := 'AAAAAAAA'O; // TODO Use a PICS
        } 
224
225
226
        // Build the messages value list for this RSU
        vc_rsuMessagesValueList[p_rsu_id] := 
            m_rsuProfile(
227
                v_beacon,
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
                v_cam, 
                v_denms,
                v_mapem,
                v_spatems,
                v_ivim,
                v_ssem
        );
        if (PICS_RSU_PARAMS[p_rsu_id].geoShape == e_geoCircle) {
            vc_geoArea := f_computeCircularArea(vc_longPosVectorRsu, PICS_RSU_PARAMS[p_rsu_id].geoParms.radius);
        } else {
            log("*** " & testcasename() & ": INCONC: Wrong PICS_RSU_GEOAREA_FORM event initialisation ***");
            setverdict(inconc);
            stop;
        }
        
    } // End of function f_setup_rsu
    
    function f_process_cf_event(
                                in CfEvent p_cfEvent
    ) runs on ItsRSUsSimulator return boolean {
        var template (value) CfResult v_result := true;
        
        // Terminate simulation
        if (p_cfEvent == "stop") {
252
253
254
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].beacon)) {
                tc_beacon.stop;
            }
255
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].cam)) {
256
257
                tc_cam.stop;
            }
258
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].denms)) {
259
260
                tc_denm.stop;
            }
261
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].mapem)) {
262
263
                tc_mapem.stop;
            }
264
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].spatems)) {
265
266
                tc_spatem.stop;
            }
267
            if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].ivim)) {
268
269
270
271
272
273
274
275
276
277
                tc_ivim.stop;
            }
        } else {
            v_result := false;
        }
        
        cfPort.send(v_result);
        
        return false;
    } // End of function f_process_cf_event
garciay's avatar
garciay committed
278
    
279
280
281
282
283
284
285
286
287
288
289
290
291
292
    function f_prepare_beacon(
                              out template (value) Payload p_payload
    ) runs on ItsRSUsSimulator {
        
        p_payload := valueof(
            f_adaptPayload(
                vc_rsuMessagesValueList[vc_rsu_id].beacon,
                0,
                -,
                e_any
            )
        );
    } // End of function f_prepare_cam
    
garciay's avatar
garciay committed
293
294
295
296
    function f_prepare_cam(
                           out template (value) Payload p_payload
    ) runs on ItsRSUsSimulator {
        
297
        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
298
299
300
301
302
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
303
                            vc_rsuMessagesValueList[vc_rsu_id].cam
garciay's avatar
garciay committed
304
305
306
307
308
                ))),
                PICS_CAM_BTP_DESTINATION_PORT,
                PICS_CAM_BTP_SOURCE_PORT
            )
        );
309
    } // End of function f_prepare_cam
garciay's avatar
garciay committed
310
311
312
313
314
    
    function f_prepare_denm(
                            out template (value) Payload p_payload
    ) runs on ItsRSUsSimulator {
        
315
        // Update dynamic parms
316
        vc_rsuMessagesValueList[vc_rsu_id].denms[vc_denmEventCounter].denm.management.referenceTime  := f_getCurrentTime();
garciay's avatar
garciay committed
317
318
319
320
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
321
                        valueof(vc_rsuMessagesValueList[vc_rsu_id].denms[vc_denmEventCounter]
garciay's avatar
garciay committed
322
323
324
325
326
                ))),
                PICS_DENM_BTP_DESTINATION_PORT,
                PICS_DENM_BTP_SOURCE_PORT
            )
        ); 
327
        vc_denmEventCounter := (vc_denmEventCounter + 1) mod lengthof(vc_rsuMessagesValueList[vc_rsu_id].denms);
328
    } // End of function f_prepare_denm
garciay's avatar
garciay committed
329
330
331
332
333
    
    function f_prepare_mapem(
                             out template (value) Payload p_payload
    ) runs on ItsRSUsSimulator {
        
garciay's avatar
garciay committed
334
335
336
337
338
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
339
                            vc_rsuMessagesValueList[vc_rsu_id].mapem
garciay's avatar
garciay committed
340
341
342
343
344
                ))),
                PICS_MAPEM_BTP_DESTINATION_PORT,
                PICS_MAPEM_BTP_SOURCE_PORT
            )
        );
345
    } // End of function f_prepare_mapem
garciay's avatar
garciay committed
346
    
347
348
349
350
351
352
353
354
    function f_computeEndPhaseStartTime(
                               in TimeMark p_timeMark,
                               in UInt32 p_inc
    ) return TimeMark {
        var UInt32 v_endPhaseStartTime := p_timeMark + p_inc;
        return v_endPhaseStartTime mod 36000;
    }
    
garciay's avatar
garciay committed
355
    function f_prepare_spatem(
356
                              in template (value) SPATEM p_spatem,
garciay's avatar
garciay committed
357
358
                              out template (value) Payload p_payload
    ) runs on ItsRSUsSimulator {
359
        var template (omit) SPATEM v_spatem := p_spatem; // Make a copy
360
        var TimeMark v_currentTimeMark := f_getCurrentTimeMark();
garciay's avatar
garciay committed
361
        
362
363
364
365
366
367
368
369
370
371
372
373
374
        if (vc_currentPhaseStartTime == 36001) {
		    vc_currentPhaseStartTime := v_currentTimeMark;
		    vc_endPhaseStartTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, vc_repitition_duration[vc_spatemStatesId]);
        }
        if (v_currentTimeMark >= vc_endPhaseStartTime) {
            vc_spatemStatesId := (vc_spatemStatesId + 1) mod vc_spatemStatesNum; // Change state
		    vc_currentPhaseStartTime := v_currentTimeMark;
		    vc_endPhaseStartTime := f_computeEndPhaseStartTime(vc_currentPhaseStartTime, vc_repitition_duration[vc_spatemStatesId]);
        }
        log("vc_currentPhaseStartTime = ", vc_currentPhaseStartTime);
        log("vc_endPhaseStartTime = ", vc_endPhaseStartTime);
        log("v_currentTimeMark = ", v_currentTimeMark);
        log("vc_spatemStatesId = ", vc_spatemStatesId);
375
376
        // Rebuild SPATEM message
        for (var integer v_intersection := 0; v_intersection < lengthof(v_spatem.spat.intersections); v_intersection := v_intersection + 1) {
377
            var template (omit) MovementList v_states := vc_states[vc_signalGroupParmId][v_intersection];
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
            select (vc_spatemStatesId) {
                case (0) {
                    v_spatem.spat.intersections[v_intersection].states[0] := v_states[0];
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[1];
                    v_spatem.spat.intersections[v_intersection].states[2] := v_states[2];
                }
                case (1) {
                    v_spatem.spat.intersections[v_intersection].states[0] := v_states[1];
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[2];
                    v_spatem.spat.intersections[v_intersection].states[2] := v_states[0];
                }
                case (2) {
                    v_spatem.spat.intersections[v_intersection].states[0] := v_states[2];
                    v_spatem.spat.intersections[v_intersection].states[1] := v_states[0];
                    v_spatem.spat.intersections[v_intersection].states[2] := v_states[1];
                }
                case else {
                }
            } // End of 'select' statement
397
398
399
400
            // Update 'minEndTime' field
            v_spatem.spat.intersections[v_intersection].states[0].state_time_speed[0].timing.minEndTime := vc_currentPhaseStartTime;
            v_spatem.spat.intersections[v_intersection].states[1].state_time_speed[0].timing.minEndTime := vc_currentPhaseStartTime + vc_repitition_duration[(vc_spatemStatesId + 1) mod vc_spatemStatesNum];
            v_spatem.spat.intersections[v_intersection].states[2].state_time_speed[0].timing.minEndTime := vc_currentPhaseStartTime + vc_repitition_duration[(vc_spatemStatesId + 2) mod vc_spatemStatesNum];
401
402
403
404
405
406
407
408
409
        } // End of 'for' statement
        
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
                            v_spatem
                ))),
410
411
                PICS_SPATEM_BTP_DESTINATION_PORT,
                PICS_SPATEM_BTP_SOURCE_PORT
412
413
            )
        );
garciay's avatar
garciay committed
414
        
415
    } // End of function f_prepare_spatem
garciay's avatar
garciay committed
416
417
    
    function f_prepare_ivim(
418
                            out template (value) Payload p_payload
garciay's avatar
garciay committed
419
420
    ) runs on ItsRSUsSimulator {
        
421
422
423
424
425
        p_payload := valueof(
            f_adaptPayload(
                bit2oct(
                    encvalue(
                        valueof(
426
                            vc_rsuMessagesValueList[vc_rsu_id].ivim
427
428
429
430
431
                ))),
                PICS_IVIM_BTP_DESTINATION_PORT,
                PICS_IVIM_BTP_SOURCE_PORT
            )
        );
432
    } // End of function f_prepare_ivim
garciay's avatar
garciay committed
433
434
435
436
    
    function f_adaptPayload(
                            in template (value) octetstring p_finalPayload,
                            in template (value) BtpPortId  p_destPort,
437
438
                            in template (value) BtpPortId  p_srcPort := 0,
                            in NextHeader p_nextHeader := PX_GN_UPPER_LAYER
garciay's avatar
garciay committed
439
440
441
    ) return template (value) Payload {
        var template (value) Payload v_payload;
        
442
        if(p_nextHeader == e_any) {
garciay's avatar
garciay committed
443
444
445
446
            v_payload := { decodedPayload := omit, rawPayload := p_finalPayload};
            return v_payload;
        }
        
447
        if(p_nextHeader == e_ipv6) {
garciay's avatar
garciay committed
448
449
450
451
452
            log("*** " & testcasename() & ": INCONC: Layer IPv6 not supported ***");
            setverdict(inconc);
            stop;
        }
        
453
        if(p_nextHeader == e_btpA) {
garciay's avatar
garciay committed
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
            v_payload := { 
                decodedPayload := { 
                    btpPacket := m_btpAWithPorts(
                        p_destPort,
                        p_srcPort,
                        { 
                            decodedPayload := omit, 
                            rawPayload := p_finalPayload 
                        }
                    )
                },
                rawPayload := ''O
            };
            return v_payload;
        }
        
470
        if(p_nextHeader == e_btpB) {
garciay's avatar
garciay committed
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
            v_payload := { 
                decodedPayload := { 
                    btpPacket := m_btpBWithPorts(
                        p_destPort,
                        p_srcPort,
                        { 
                            decodedPayload := omit, 
                            rawPayload := p_finalPayload 
                        }
                    )
                }, 
                rawPayload := ''O
            };
            return v_payload;
        }
        
        return v_payload;
488
    } // End of function f_adaptPayload
garciay's avatar
garciay committed
489
490
    
    function f_send(
491
492
                    in template (value) Payload p_payload,
                    in UInt32 p_its_aid
garciay's avatar
garciay committed
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
    ) runs on ItsRSUsSimulator {
        var GeoNetworkingPdu v_geoNetworkingPdu;
        
        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)
            ),
            m_defaultLifetime,
            c_defaultHopLimit
        ));
508
        f_sendGeoNetMessage(valueof(m_geoNwReq_linkLayerBroadcast(v_geoNetworkingPdu, p_its_aid)));
509
    } // End of function f_send
garciay's avatar
garciay committed
510
511
512
513
    
    function f_processSrem(
                           in GeoNetworkingPdu p_geoNetworkingPdu
    ) runs on ItsRSUsSimulator {
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
        log("SREM=", p_geoNetworkingPdu);
        if (ispresent(p_geoNetworkingPdu.gnPacket.packet.payload.decodedPayload)) {
            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;
                    var template (value) Payload v_payload;
                    
                    log(v_signalRequestMessage);
                    // Build response
                    // TODO v_ssem.ssm.status
                    v_payload := valueof(
                        f_adaptPayload(
                            bit2oct(
                                encvalue(
                                    valueof(
garciay's avatar
garciay committed
529
530
531
                                        m_ssem(
                                            v_signalRequestMessage
                            )))),
532
533
534
535
                            PICS_SSEM_BTP_DESTINATION_PORT,
                            PICS_SSEM_BTP_SOURCE_PORT
                        )
                    );
536
537
                    // Send SSEM 
                    f_send(v_payload, PICS_SSEM_ITS_AID);
538
539
540
                } // else, ignore message
            } // else, ignore message
        } // else, ignore message
541
    } // End of function f_processSrem
garciay's avatar
garciay committed
542
543
544
545
546
547
    
    function f_incLocalSeqNumber() runs on ItsRSUsSimulator return UInt16 {
        vc_localSeqNumber := (vc_localSeqNumber + 1) mod 65536;
        return vc_localSeqNumber;
    }
    
garciay's avatar
garciay committed
548
549
550
551
552
553
554
555
556
557
558
559
560
561
    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
562
    function f_getDenmSequenceNumber() runs on ItsRSUsSimulator return SequenceNumber {
garciay's avatar
garciay committed
563
        return vc_sequenceNumber;
garciay's avatar
garciay committed
564
565
566
    }
    
} // End of module ItsRSUsSimulator_Functions