ITS
denTriggeringManagement.cpp
Go to the documentation of this file.
2 
5 {
6  m_paramGPS = gps;
7  m_paramAppli = appli;
8  m_paramDENM = denm;
9  m_geonet = gn;
10  m_paramConf = conf;
11  m_paramCan = can;
12 
13  m_sequenceNumber = 0;
14 
15  m_mutexTriggering = new QMutex;
16 
17  m_appPort = network->internalPort("Application");
18 }
19 
21 {
22  printf("UtInitialize trigger %d\n", m_triggeredDENM.count());
23  QMutexLocker locker(m_mutexTriggering);
25  m_triggeredDENM.clear();
26  m_sequenceNumber = 0;
27  qDebug() << "endOfUtInitialize";
28 }
29 
31 {
32  for(int i = 0 ; i < m_triggeredDENM.size() ; i++)
33  {
34  if(m_triggeredDENM[i]->m_validity)
35  {
36  m_triggeredDENM[i]->m_validity->setTimer(-1);
37  delete m_triggeredDENM[i]->m_validity;
38  qDebug() << "m_validity deleted";
39  }
40 
41  if(m_triggeredDENM[i]->T_RepetitionDuration())
42  {
43  if(m_triggeredDENM[i]->m_repetitionDuration)
44  {
45  m_triggeredDENM[i]->m_repetitionDuration->setTimer(-1);
46  delete m_triggeredDENM[i]->m_repetitionDuration;
47  }
48  }
49 
50  if(m_triggeredDENM[i]->T_Repetition())
51  {
52  if(m_triggeredDENM[i]->m_repetition)
53  {
54  m_triggeredDENM[i]->m_repetition->setTimer(-1);
55  delete m_triggeredDENM[i]->m_repetition;
56  }
57  }
58  m_triggeredDENM[i]->m_thread->terminate();
59  m_triggeredDENM[i]->m_thread->wait();
60  }
61 }
62 
64 {
65  m_sequenceNumber = sequenceNumber;
66 }
67 
69 {
70  QMutexLocker locker(m_mutexTriggering);
71  m_triggeredDENM.append(entry);
72 }
73 
75 {
76  QByteArray msg;
77  AppDenmResultData result(actionID, success, failureNotification, denm, m_paramDENM);
78 
79  msg = result.toBin();
80  emit appDenmResult(msg);
81 }
82 
84 {
85  quint64 expirationTime;
86  quint32 validityDuration = 600;
87  asn_enc_rval_t rval;
88  char msg[MSG_LENGTH] = {'\0'};
90  ActionID_t actionID;
91  AppDenmTriggerData data(datagram);
92  quint16 repetitionDuration, repetitionInterval;
93  DENM_t d;
94 
96  memset(&d, 0, sizeof d);
97 
98  /* 1) Calculate expiration time of timer T_O_Validity */
99  expirationTime = calculate_T_O_Validity(data);
100 
101  /* 1) a. If expiration time of T_O_Validity is in the past, send a failure notification and omit
102  * the execution of firther steps. */
103  if(expirationTime < m_paramGPS->timestamp())
104  {
105  qDebug() << "DENM expired:" << expirationTime << "for" << m_paramGPS->timestamp();
106  return AppDENM_result(actionID, false, AppDenmResultData::eventIsInThePast, NULL);
107  }
108 
109  /* 1) b. Otherwise, continue the operation. */
110 
111  /* 2) Assign unused ActionID value. */
112  actionID = assignUnusedActionID(&m_paramAppli->data(), actionID);
113  d.denm.management.actionID = actionID;
114  qDebug() << "New ActionID" << actionID.originatingStationID << ":" << actionID.sequenceNumber;
115 
116  /* 3) If transmisionInterval is provided by the application request: */
117  if(data.transmissionInterval())
118  {
119  /* 3) a. Set transmissionInterval. */
122  qDebug() << "Transmission interval set to" << *d.denm.management.transmissionInterval;
123  }
124 
125  /* 3) b. Otherwise continue the operation. */
126 
127  /* 4) Set other fields of DENM management container… */
130  {
131  qDebug() << "Unable to collect required data to fill management container";
133  }
134 
135  /* 4) … situation container … */
136  if(data.situation())
137  {
138  d.denm.situation = (SituationContainer_t*)calloc(1, sizeof *d.denm.situation);
140  {
141  qDebug() << "Unable to collect data to fill situation container";
143  }
144  }
145 
146  /* 4) … location container … */
147  if(data.location())
148  {
149  d.denm.location = (LocationContainer_t*)calloc(1, sizeof *d.denm.location);
150  if(!fill_LocationContainer(data, d.denm.location))
151  {
152  qDebug() << "Unable to collect data to fill location container";
154  }
155  }
156  /* 6.1.3.2. A DENM shall include at least one trace. */
157  else
158  {
159  d.denm.location = (LocationContainer_t*)calloc(1, sizeof *d.denm.location);
160  d.denm.location->traces.list.array = (PathHistory_t**)calloc(1, sizeof *d.denm.location->traces.list.array);
161  PathHistory_t *p = (PathHistory_t*)calloc(1, sizeof *p);
162  d.denm.location->traces.list.array[0] = (PathHistory_t*)calloc(1, sizeof *d.denm.location->traces.list.array[0]);
164  }
165 
166  /* 4) … à la carte container. */
167  if(data.alacarte())
168  {
169  d.denm.alacarte = (AlacarteContainer_t*)calloc(1, sizeof *d.denm.alacarte);
170  if(!fill_AlacarteContainer(data, d.denm.alacarte))
171  {
172  qDebug() << "Unable to collect data to fill alacarte container";
174  }
175  }
176 
177  /* 5) Set referenceTime to the current time. */
178  memset(&d.denm.management.referenceTime, 0, sizeof d.denm.management.referenceTime);
180 
181  /* 6) Construct DENM. */
182  //asn_fprint(NULL, &asn_DEF_DENM, &d);
183  rval = uper_encode_to_buffer(&asn_DEF_DENM, &d, msg, MSG_LENGTH);
184  if(rval.encoded < 1)
185  {
186  qDebug() << "Unable to encode" << rval.failed_type->name;
188  }
189 
190  /* 7) Pass the DENM to the ITS networking & transport layer. */
191  print_hexa((unsigned char*)msg, (rval.encoded + 7) / 8);
192  if(!PassDenmToNetworkAndTransportLayerTrigger(data, msg, (rval.encoded + 7) / 8))
193  {
194  qDebug() << "Unable to pass DENM to N&T";
195  return AppDENM_result(actionID, false, AppDenmResultData::cannotSendDENM, NULL);
196  }
197 
198  /* 8) Create an entry in the originating ITS-S message table and set the state to ACTIVE. */
199  entry->setDENM(d);
201  entry->setTrafficClass(data.trafficClass().toInt());
203  entry->setDestinationArea(data.destinationArea());
204 
205  /* 9) Start/restart timer T_O_Validity. */
206  entry->setT_O_Validity(expirationTime - m_paramGPS->timestamp());
207 
208  /* 10) If repetitionDuration and repetitionInterval > 0: */
209  if(data.repetitionDuration() && data.repetitionInterval())
210  if(*data.repetitionDuration() > 0 && *data.repetitionInterval() > 0)
211  {
212  repetitionDuration = *data.repetitionDuration();
213  repetitionInterval = *data.repetitionInterval();
214  if(repetitionDuration < validityDuration * 1000 && repetitionInterval < validityDuration * 1000)
215  {
216  /* 10) a. Calculate and start timer T_Repetitionduration and T_Repetition. */
217  entry->setT_RepetitionDuration(repetitionDuration * 1000);
218  entry->setT_Repetition(repetitionInterval);
219  }
220  qDebug() << "repetitionDuration =" << *data.repetitionDuration() << "repetitionInterval =" << *data.repetitionInterval();
221  }
222  else
223  qDebug() << "repetitionDuration =" << *data.repetitionDuration() << "repetitionInterval =" << *data.repetitionInterval();
224  else
225  qDebug() << "No repetitionDuration or repetitionInterval";
226 
227  /* 10) b. Otherwise, continue the operation. */
228 
229  /* 11) Send actionID to the requesting ITS-S application. */
230  AppDENM_result(actionID, true, AppDenmResultData::success, &d);
231 
232  /* 12) End. */
233  QObject::connect(entry, SIGNAL(T_O_ValiditySignal(ActionID_t)), this, SLOT(discardDENMFromTriggeredTable(ActionID_t)));
234  QObject::connect(entry, SIGNAL(T_RepetitionSignal(ActionID_t)), this, SLOT(repeatDENMFromTriggeredTable(ActionID_t)));
235  entry->moveToThread(entry->m_thread);
236  entry->m_thread->start();
237  qDebug() << "entry->m_thread->start()";
238  m_triggeredDENM.append(entry);
240 }
241 
243 {
244  DENM_t d;
245  quint64 expirationTime;
246  quint32 validityDuration = DefaultValidity * 1000;
247  asn_enc_rval_t rval;
248  char msg[MSG_LENGTH] = {'\0'};
249  AppDenmUpdateData data(datagram);
250 
251  ActionIDData actionID = data.actionID();
252 
253  memset(&d, 0, sizeof d);
254 
255  /* 1) Calculate expiration time for timer T_O_Validity */
256  if(data.validityDuration())
257  validityDuration = *data.validityDuration();
258  expirationTime = data.eventUpdateDetectionTime() + validityDuration;
259 
260  /* 1) a. If expiration time of timer T_O_Validity is in the past, send a failure notification to the ITS-S application
261  * and omit the execution of further steps. */
262  if(expirationTime < m_paramGPS->timestamp())
263  {
264  qDebug() << "DENM expired:" << expirationTime << "for" << m_paramGPS->timestamp();
265  return AppDENM_result(actionID.toASN(), false, AppDenmResultData::eventIsInThePast, NULL);
266  }
267 
268  /* 1) b. Otherwise, continue the operation. */
269 
270  /* 2) Compare actionID in the application requiest with entries in the originating ITS-S message table */
271  QMutexLocker locker(m_mutexTriggering);
272  int found = haveDENM(actionID.toASN(), m_triggeredDENM);
273 
274  /* 2) a. If actionID provided by the ITS-S application request does not exist in the originating ITS-S message
275  * table, send a failure notification to the ITS-S application and omit the execution of furether steps. */
276  if(found == -1)
277  {
278  qDebug() << "DENM" << actionID.originatingStationID() << ":" << actionID.sequenceNumber() <<
279  "not found in the triggered message table";
280  return AppDENM_result(actionID.toASN(), false, AppDenmResultData::eventDoesNotExist, NULL);
281  }
282 
283  /* 2) b. Otherwise, continue the operation. */
284  DENM_t triggeredDENM = m_triggeredDENM.at(found)->denm();
285  qint64 repetitionDuration = 0, repetitionInterval = 0;
286 
287  /* 3) Stop T_O_Validity, T_RepetitionDuration and T_Repetition if applicable. */
288  repetitionDuration = m_triggeredDENM.at(found)->T_RepetitionDuration();
289  repetitionInterval = m_triggeredDENM.at(found)->T_Repetition();
290  m_triggeredDENM[found]->setT_O_Validity(-1);
291  m_triggeredDENM.at(found)->setT_RepetitionDuration(-1);
292  m_triggeredDENM.at(found)->setT_Repetition(-1);
293 
294  /* 4) If transmissionInterval is provided by the application */
295  if(data.transmissionInterval())
296  {
297  /* 4) a. Set transmissionInterval. */
300  }
301  else if(triggeredDENM.denm.management.transmissionInterval)
302  {
305  }
306 
307  /* 4) b. Otherwise, continue the operation. */
308 
309  /* 5) Set other fields of DENM management container… */
311  if(!fill_ManagementContainer(data, &d.denm.management, triggeredDENM.denm.management, actionID.toASN(), &m_paramAppli->data()))
312  {
313  qDebug() << "Unable to collect required data to fill management container";
315  }
316 
317  /* 5) … situation container … */
318  if(data.situation())
319  {
320  d.denm.situation = (SituationContainer_t*)calloc(1, sizeof *d.denm.situation);
322  {
323  qDebug() << "Unable to collect data to fill situation container";
325  }
326  }
327  else if(triggeredDENM.denm.situation)
328  {
329  d.denm.situation = (SituationContainer_t*)calloc(1, sizeof *d.denm.situation);
330  *d.denm.situation = setSituationContainer(*triggeredDENM.denm.situation);
331  }
332 
333  /* 5) … location container … */
334  if(data.location())
335  {
336  if(!fill_LocationContainer(data, d.denm.location))
337  {
338  qDebug() << "Unable to collect data to fill location container";
340  }
341  }
342  /* 6.1.3.2. A DENM shall include at least one trace. */
343  else
344  {
345  d.denm.location = (LocationContainer_t*)calloc(1, sizeof *d.denm.location);
346  d.denm.location->traces.list.array = (PathHistory_t**)calloc(1, sizeof *d.denm.location->traces.list.array);
347  PathHistory_t *p = (PathHistory_t*)calloc(1, sizeof *p);
348  d.denm.location->traces.list.array[0] = (PathHistory_t*)calloc(1, sizeof *d.denm.location->traces.list.array[0]);
350  }
351 
352  /* 5) … à la carte container. */
353  if(data.alacarte())
354  {
355  d.denm.alacarte = (AlacarteContainer_t*)calloc(1, sizeof *d.denm.alacarte);
356  if(!fill_AlacarteContainer(data, d.denm.alacarte))
357  {
358  qDebug() << "Unable to collect data to fill alacarte container";
360  }
361  }
362 
363  /* 6) Set referenceTime to the current time. */
365 
366  /* 7) Construct the DENM. */
367  rval = uper_encode_to_buffer(&asn_DEF_DENM, &d, msg, MSG_LENGTH);
368  if(rval.encoded < 1)
369  {
370  qDebug() << "Unable to encode" << rval.failed_type->name;
372  }
373 
374  /* 8) Pass the DENM to the ITS networking & transport layer. */
375  AppDenmTriggerData trigger(d, data.destinationArea());
376 
377  if(!PassDenmToNetworkAndTransportLayerTrigger(trigger, msg, (rval.encoded + 7) / 8))
378  {
379  qDebug() << "Unable to pass DENM to N&T";
380  return AppDENM_result(actionID.toASN(), false, AppDenmResultData::cannotSendDENM, NULL);
381  }
382 
383  /* 9) Update the entry in the originating ITS-S message table. */
384  m_triggeredDENM[found]->setDENM(d);
386  if(data.trafficClass())
387  m_triggeredDENM[found]->setTrafficClass(data.trafficClass()->toInt());
388  else
389  m_triggeredDENM[found]->setTrafficClass(itsGnDefaultTrafficClass);
390  m_triggeredDENM[found]->setActionID(d.denm.management.actionID);
391 
392  /* 10) Start/restart timer T_O_Validity. */
393  m_triggeredDENM[found]->setT_O_Validity(expirationTime - m_paramGPS->timestamp());
394  m_triggeredDENM[found]->m_validity->m_T_O_Validity_timer.start();
395 
396  /* 11) If repetitionDuration > 0 and repetitionInterval > 0 */
397  qDebug() << "repetitionDuration" << repetitionDuration << "repetitionInterval" << repetitionInterval;
398  if(data.repetitionDuration() && data.transmissionInterval())
399  {
400  if(*data.repetitionDuration() > 0 && *data.transmissionInterval() > 0)
401  {
402  qDebug() << "data.repetitionDuration" << *data.repetitionDuration() << "data.transmissionInterval" << *data.transmissionInterval();
403  /* 11) a. Calculating and restart timer T_RepetitionDuration and T_Repetition. */
404  m_triggeredDENM[found]->setT_RepetitionDuration(*data.repetitionDuration() * 1000);
405  m_triggeredDENM[found]->setT_Repetition(*data.transmissionInterval());
406  m_triggeredDENM[found]->m_repetitionDuration = new denMessageTableSourceThread(m_triggeredDENM[found]->T_RepetitionDuration());
407  m_triggeredDENM[found]->m_repetition = new denMessageTableSourceThread(m_triggeredDENM[found]->T_Repetition());
408  m_triggeredDENM[found]->m_repetitionDuration->m_T_RepetitionDuration_timer.start();
409  m_triggeredDENM[found]->m_repetition->m_T_Repetition_timer.start();
410  QTimer::singleShot(m_triggeredDENM[found]->T_RepetitionDuration(), m_triggeredDENM[found]->m_repetitionDuration, SLOT(endOfT_RepetitionDuration()));
411  QTimer::singleShot(m_triggeredDENM[found]->T_Repetition(), m_triggeredDENM[found]->m_repetition, SLOT(endOfT_Repetition()));
412  }
413  }
414  else if(repetitionDuration > 0 && repetitionInterval > 0)
415  {
416  m_triggeredDENM[found]->setT_RepetitionDuration(repetitionDuration * 1000);
417  m_triggeredDENM[found]->setT_Repetition(repetitionInterval);
418  m_triggeredDENM[found]->m_repetitionDuration->m_T_RepetitionDuration_timer.start();
419  m_triggeredDENM[found]->m_repetition->m_T_Repetition_timer.start();
420  }
421 
422  /* 11) b. Otherwise, continue the operation. */
423 
424  /* 12) Send actionID to the requesting ITS-S applpication. */
425 
426  qDebug() << "END of Update";
427  QObject::connect(m_triggeredDENM[found], SIGNAL(T_O_ValiditySignal(ActionID_t)), this, SLOT(discardDENMFromTriggeredTable(ActionID_t)));
428  QObject::connect(m_triggeredDENM[found], SIGNAL(T_RepetitionSignal(ActionID_t)), this, SLOT(repeatDENMFromTriggeredTable(ActionID_t)));
429 
431 
432  /* 13) End. */
433 }
434 
436 {
437  qDebug() << "\n\n\n\n\nCancel\n\n\n\n\n";
438  QMutexLocker locker(m_mutexTriggering);
439  int found = haveDENM(actionID, m_triggeredDENM);
440 
441  qInfo() << "There are" << m_triggeredDENM.size() << "DENM in the triggeredDENM:";
442  qInfo() << m_triggeredDENM;
443  if(found < 0)
444  {
445  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber <<
446  "not found in the triggered message table";
447  return AppDENM_result(actionID, false, AppDenmResultData::eventDoesNotExist, NULL);
448  }
449  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber <<
450  "found in the triggered message table";
452  {
453  qDebug() << "DENM not active";
454  return AppDENM_result(actionID, false, AppDenmResultData::eventNotActive, NULL);
455  }
456 
457  DENM_t denm = m_triggeredDENM.at(found)->denm();
458  DENM_t denmToSend;
459 
460  m_triggeredDENM[found]->setT_O_Validity(-1);
461  m_triggeredDENM[found]->setT_RepetitionDuration(-1);
462  m_triggeredDENM[found]->setT_Repetition(-1);
463  if(m_triggeredDENM[found]->m_validity)
464  {
465  m_triggeredDENM[found]->m_validity->setTimer(-1);
466  m_triggeredDENM[found]->m_validity->stopTimer();
467  }
468  if(m_triggeredDENM[found]->m_repetitionDuration)
469  {
470  m_triggeredDENM[found]->m_repetitionDuration->setTimer(-1);
471  m_triggeredDENM[found]->m_repetitionDuration->stopTimer();
472  }
473  if(m_triggeredDENM[found]->m_repetition)
474  {
475  m_triggeredDENM[found]->m_repetition->setTimer(-1);
476  m_triggeredDENM[found]->m_repetition->stopTimer();
477  }
478 
479  qInfo() << "Creating Canceled DENM";
480  memset(&denmToSend, 0, sizeof denmToSend);
481  denmToSend.header = denm.header;
482  denmToSend.denm.management = denm.denm.management;
483 
487 
488  char msg[MSG_LENGTH] = {'\0'};
489  asn_enc_rval_t rval;
490 
491  asn_fprint(NULL, &asn_DEF_DENM, &denmToSend);
492  qInfo() << "Encoding Canceled DENM";
493  rval = uper_encode_to_buffer(&asn_DEF_DENM, &denmToSend, msg, MSG_LENGTH);
494  if(rval.encoded < 1)
495  {
496  qDebug() << "Unable to encode" << rval.failed_type->name;
498  }
499 
500  print_hexa((unsigned char*)msg, (rval.encoded + 7) / 8);
501  AppDenmTriggerData data(denm, termination.destinationArea());
502 
503  qInfo() << "Passing DENM to N&T";
504  if(!PassDenmToNetworkAndTransportLayerTrigger(data, msg, (rval.encoded + 7) / 8))
505  {
506  qDebug() << "Unable to pass DENM to N&T";
507  return AppDENM_result(actionID, false, AppDenmResultData::cannotSendDENM, &denm);
508  }
509  qInfo() << "Discarding DENM" << denm.denm.management.actionID.originatingStationID << denm.denm.management.actionID.sequenceNumber;
511  qDebug() << "DENM cancelled";
512 
513  AppDENM_result(actionID, true, AppDenmResultData::success, &denm);
514 }
515 
517 {
519 
520  dr.payload = QByteArray(msg, denmLength);
521 
522  int foo;
523  if((foo = m_geonet->send(dr)) != GeoNet::geonetError_success)
524  {
525  qDebug() << "error " << foo;
526  return false;
527  }
528  return true;
529 }
530 
532 {
533  int found = haveDENM(actionID, m_triggeredDENM);
534  qDebug() << "Discarding DENM" << found;
535 
536  if(found < 0)
537  {
538  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber <<
539  "not found in the triggered message table";
540  return;
541  }
542  qInfo() << "Setting state CANCELED";
544  qInfo() << "Removing DENM";
545  m_triggeredDENM.removeAt(found);
546  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber << "discarded from triggered table";
547 
549 }
550 
552 {
553  AppDenmTerminationIndication termination(actionID);
554  QUdpSocket socket;
555  QNetworkDatagram datagram;
556 
557  datagram.setDestination(QHostAddress::LocalHost, m_appPort);
558  datagram.setData(termination.toBin());
559  qInfo() << "Sending termination indication to" << m_appPort;
560  socket.writeDatagram(datagram);
561  qInfo() << "Termination indication sent";
562 }
563 
565 {
566  qDebug() << "locking repeatDENMFromTriggeredTable";
567  QMutexLocker locker(m_mutexTriggering);
568  int found = haveDENM(actionID, m_triggeredDENM);
569  qDebug() << "Repeating DENM" << found;
570 
571  if(found < 0)
572  {
573  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber <<
574  "not found in the triggered message table";
575  return;
576  }
577 
578  DENM_t denm = m_triggeredDENM[found]->denm();
579  qDebug() << "Pseudo =" << m_paramAppli->data().stationID();
580  if(actionID.originatingStationID != m_paramAppli->data().stationID())
581  {
582  ActionID_t current;
585  m_triggeredDENM[found]->setDENM(denm);
587  current.sequenceNumber = actionID.sequenceNumber;
588  m_triggeredDENM[found]->setActionID(current);
589  found = haveDENM(current, m_triggeredDENM);
590  }
591  AppDenmTriggerData data(m_triggeredDENM[found]->denm(), m_triggeredDENM[found]->destinationArea());
592  char msg[MSG_LENGTH] = {'\0'};
594 
595  if(rval.encoded < 1)
596  {
597  qDebug() << "Unable to encode" << rval.failed_type->name;
598  return;
599  }
600 
601  if(!PassDenmToNetworkAndTransportLayerTrigger(data, msg, (rval.encoded + 7) / 8))
602  {
603  qDebug() << "Unable to pass DENM to N&T";
604  return;
605  }
606  qDebug() << "DENM" << actionID.originatingStationID << ":" << actionID.sequenceNumber << "repeated";
607 }
DestinationAreaData destinationArea() const
destinationArea Destination area getter.
#define ASN_SEQUENCE_ADD(headptr, ptr)
ParameterConfiguration * m_paramConf
TrafficClassData * trafficClass() const
trafficClass Traffic class getter.
gnDataRequest_t structure is the GN data request definition.
Definition: GNDataRequest.h:46
denTriggeringManagement(FakeGPSProvider *gps, FakeApplicationProvider *appli, ParameterDENM *denm, GeoNet *gn, ParameterConfiguration *conf, FakeCANProvider *can, ParameterNetwork *network)
denTriggeringManagement denTriggeringManagement constructor.
#define itsGnDefaultTrafficClass
Definition: constantes.h:128
void setDestinationArea(DestinationAreaData d)
setDestinationArea DENM&#39;s destination area setter.
quint32 * validityDuration() const
validityDuration Validity duration getter.
ActionID_t toASN()
toASN C style encoding.
TrafficClassData trafficClass() const
trafficClass Traffic class getter.
struct asn_TYPE_descriptor_s * failed_type
Definition: asn_codecs.h:55
DecentralizedEnvironmentalNotificationMessage_t denm
Definition: DENM.h:25
#define MSG_LENGTH
void appDenmResult(QByteArray)
appDenmResult Signal used to send result to the Application layer.
void setSequenceNumberSignal(quint16)
setSequenceNumberSignal Signal used when local sequenceNumber changes.
void AppDENM_cancellation(AppDenmTerminationData termination, ActionID_t actionID)
AppDENM_cancellation Cancels a DENM.
quint16 * transmissionInterval() const
transmissionInterval Transmission interval getter.
bool fill_AlacarteContainer(AppDenmTriggerData data, AlacarteContainer_t *alacarte)
fill_AlacarteContainer Fills the AlacarteContainer.
StationID_t originatingStationID
Definition: ActionID.h:24
quint16 * transmissionInterval() const
transmissionInterval Transmission interval getter.
void setT_Repetition(qint32 t)
setT_Repetition T_Repetition setter.
StationID_t stationID
Definition: ItsPduHeader.h:40
ItsPduHeader_t header
Definition: DENM.h:24
void discardDENMFromTriggeredTable(ActionID_t)
discardDENMFromTriggeredTable Slot used to discard DENM from message table.
bool fill_LocationContainer(AppDenmTriggerData data, LocationContainer_t *location)
fill_LocationContainer Fills the LocationContainer.
void print_hexa(const unsigned char *msg, int l, FILE *stream=stdout)
print_hexa Print a byte array.
Definition: api.cpp:89
void setT_RepetitionDuration(qint32 t)
setT_RepetitionDuration T_RepetitionDuration setter.
void utInitialize()
utInitialize Initializes the DEN Triggering Management.
QByteArray * location() const
location Location container getter.
gnDataRequest_t gnDataRequestFromAppDenmTriggerData(AppDenmTriggerData data, ParameterGPS gps)
gnDataRequestFromAppDenmTriggerData Generate a GN Data Request from an AppDenmTriggerData.
void setActionID(ActionID_t a)
setActionID DENM&#39;s ActionID setter.
QByteArray * situation() const
situation Situation container getter.
ActionIDData actionID() const
actionID ActionID getter.
quint32 * repetitionDuration() const
repetitionDuration Repetition duration getter.
quint64 timestamp()
timestamp Timestamp getter.
SequenceNumber_t sequenceNumber
Definition: ActionID.h:25
void AppDENM_trigger(QByteArray datagram)
AppDENM_trigger Triggers a DENM.
ssize_t encoded
Definition: asn_codecs.h:48
QByteArray toBin()
toBin Encode an AppDenmTerminationIndication into a byte array.
QVector< denMessageTableSource * > m_triggeredDENM
bool fill_SituationContainer(AppDenmTriggerData data, SituationContainer_t *situation)
fill_SituationContainer Fills the SituationContainer.
ActionID_t defaultActionID(ParameterApplication *appli, SequenceNumber_t sequenceNumber)
defaultActionID Generate a default ActionID.
int asn_long2INTEGER(INTEGER_t *i, long l)
Definition: INTEGER.c:882
quint8 toInt()
toInt TrafficClassData encoder in a byte.
void setStatus(int s)
setStatus DENM&#39;s status setter.
QByteArray * location() const
location Location container getter.
quint16 sequenceNumber() const
sequenceNumber Sequence number getter.
Definition: ActionIDData.h:43
TimestampIts_t referenceTime
QByteArray toBin()
toBin Encode the AppDenmResultData into a byte array.
DestinationAreaData destinationArea() const
destinationArea Destination area getter.
quint16 internalPort(QString service)
internalPort Get the internal BTP port from service name.
void setT_O_Validity(qint64 t)
setT_O_Validity T_O_Validity setter.
ParameterGPS & data()
data GPS data getter.
DEN Triggering Management.
ActionID_t assignUnusedActionID(ParameterApplication *appli, ActionID_t currentActionID)
assignUnusedActionID Assign an unused ActionID.
quint64 calculate_T_O_Validity(quint64 detectionTime, quint32 validityDuration)
calculate_T_O_Validity Compute the T_O_Validity timer.
bool fill_ManagementContainer(AppDenmTriggerData data, ManagementContainer_t *management, ParameterApplication *appli, ParameterGPS gps)
fill_ManagementContainer Fills the ManagementContainer.
TimestampIts_t detectionTime
void killTriggeredThreads()
killTriggeredThreads Kills the triggered threads.
FakeApplicationProvider * m_paramAppli
#define DefaultValidity
enum AppDenmResultData::failureNotification_enum e_failureNotification
The e_failureNotification enum defines the success or failure code.
DestinationAreaData destinationArea() const
destinationArea Destination area getter.
void repeatDENMFromTriggeredTable(ActionID_t)
repeatDENMFromTriggeredTable Slot used to repeat a DENM.
void setSequenceNumberSlot(quint16)
setSequenceNumberSlot Slot used to change local sequenceNumber.
TransmissionInterval_t * transmissionInterval
QByteArray * alacarte() const
alacarte Alacarte container getter.
quint64 eventUpdateDetectionTime() const
eventUpdateDetectionTime Detection time getter.
asn_enc_rval_t uper_encode_to_buffer(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, void *buffer, size_t buffer_size)
Definition: per_encoder.c:33
int asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr)
Definition: constr_TYPE.c:36
QByteArray * alacarte() const
alacarte Alacarte container getter.
StationID_t stationID() const
stationID Station ID getter.
Definition: DENM.h:23
ParameterApplication & data()
data Returns the vehicle status.
void AppDENM_update(QByteArray datagram)
AppDENM_update Updates a DENM.
void appendTriggeredDenm(denMessageTableSource *)
appendTriggeredDenm Slot used when a DENM is appended to the message table.
quint32 originatingStationID() const
originatingStationID Originating station ID getter.
Definition: ActionIDData.h:38
QByteArray * situation() const
situation Situation container getter.
int send(gnDataRequest_t gnDR)
send Creates the BTP and then select the correct packet send option.
Definition: Geonet.cpp:497
asn_TYPE_descriptor_t asn_DEF_DENM
Definition: DENM.c:45
quint16 * repetitionInterval() const
repetitionInterval Repetition interval getter.
void AppDENM_terminationIndication(ActionID actionID)
AppDENM_terminationIndication Indication of the termination of a DENM.
ItsPduHeader_t fill_ItsPduHeader(StationID_t stationID)
fill_ItsPduHeader Fills the ItsPduHeader.
QByteArray payload
Definition: GNDataRequest.h:60
quint32 * repetitionDuration() const
repetitionDuration Repetition duration getter.
void AppDENM_result(ActionID_t actionID, bool success, AppDenmResultData::e_failureNotification failureNotification, DENM_t *denm)
AppDENM_result Result of request.
bool PassDenmToNetworkAndTransportLayerTrigger(AppDenmTriggerData data, char *msg, int denmLength)
PassDenmToNetworkAndTransportLayerTrigger Pass DENM to the N&T layer.
Definition: Geonet.h:42
long TransmissionInterval_t
void setDENM(DENM_t d)
setDENM DENM setter.
int haveDENM(ActionID_t actionID, QVector< denMessageTableSource *> table)
haveDENM Check if the DENM exists in the denMessageTableSource
void setTrafficClass(quint8 t)
setTrafficClass DENM&#39;s traffic class setter.
SituationContainer_t setSituationContainer(SituationContainer_t s)
setSituationContainer SituationContainer copy.