ITS
AppDenmTriggerData.cpp
Go to the documentation of this file.
1 #include "AppDenmTriggerData.h"
2 
3 #include <QDataStream>
4 #include <QDebug>
5 
7 {
14  m_situation = 0;
15  m_location = 0;
16  m_alacarte = 0;
19  m_lifeTime = 0;
23  m_paramDENM = paramDENM;
24 }
25 
27 {
28  char *data = datagram.data();
29  int offset = 1;
30  quint16 options = extractUInt(data, 2, &offset);
31 
38  m_situation = 0;
39  m_location = 0;
40  m_alacarte = 0;
43  m_lifeTime = 0;
47 
48  if(options & (1 << (15 - AppDenmTriggerData_validityDuration)))
49  m_validityDuration = (quint32*)calloc(1, sizeof *m_validityDuration);
50  if(options & (1 << (15 - AppDenmTriggerData_repetitionDuration)))
51  m_repetitionDuration = (quint32*)calloc(1, sizeof *m_repetitionDuration);
52  if(options & (1 << (15 - AppDenmTriggerData_transmissionInterval)))
53  m_transmissionInterval = (quint16*)calloc(1, sizeof *m_transmissionInterval);
54  if(options & (1 << (15 - AppDenmTriggerData_repetitionInterval)))
55  m_repetitionInterval = (quint16*)calloc(1, sizeof *m_repetitionInterval);
56  if(options & (1 << (15 - AppDenmTriggerData_relevanceDistance)))
57  m_relevanceDistance = (quint8*)calloc(1, sizeof *m_relevanceDistance);
58  if(options & (1 << (15 - AppDenmTriggerData_relevanceTrafficDirection)))
59  m_relevanceTrafficDirection = (quint8*)calloc(1, sizeof *m_relevanceTrafficDirection);
60 
61  m_eventDetectionTime = extractUInt(data, 8, &offset);
62  m_eventPosition = ReferencePositionData(data, &offset);
64  *m_validityDuration = extractUInt(data, 4, &offset);
65  else
66  passBytes(&offset, 4);
68  *m_repetitionDuration = extractUInt(data, 4, &offset);
69  else
70  passBytes(&offset, 4);
72  *m_transmissionInterval = extractUInt(data, 2, &offset);
73  else
74  passBytes(&offset, 2);
76  *m_repetitionInterval = extractUInt(data, 2, &offset);
77  else
78  passBytes(&offset, 2);
79  if(options & (1 << (15 - AppDenmTriggerData_situation)))
80  {
81  m_situation = new QByteArray(data + offset + 1, *(data + offset));
82  passBytes(&offset, *(data + offset) + 1);
83  }
84  else
85  passBytes(&offset, 1);
86  if(options & (1 << (15 - AppDenmTriggerData_location)))
87  {
88  m_location = new QByteArray(data + offset + 1, *(data + offset));
89  passBytes(&offset, *(data + offset) + 1);
90  }
91  else
92  passBytes(&offset, 1);
93  if(options & (1 << (15 - AppDenmTriggerData_alacarte)))
94  {
95  m_alacarte = new QByteArray(data + offset + 1, *(data + offset));
96  passBytes(&offset, *(data + offset) + 1);
97  }
98  else
99  passBytes(&offset, 1);
101  *m_relevanceDistance = extractUInt(data, 1, &offset);
102  else
103  passBytes(&offset, 1);
105  *m_relevanceTrafficDirection = extractUInt(data, 1, &offset);
106  else
107  passBytes(&offset, 1);
108  m_destinationArea = DestinationAreaData(data, &offset);
109  m_trafficClass = TrafficClassData(data, &offset);
110 
111  qInfo() << "AppDENMTrigger created:\n" << this->toString();
112 }
113 
115 {
116  char tmp[MSG_LENGTH] = {'\0'};
117  asn_enc_rval_t rval;
118 
122  {
123  m_validityDuration = (quint32*)calloc(1, sizeof *m_validityDuration);
125  m_repetitionDuration = (quint32*)calloc(1, sizeof *m_repetitionDuration);
128  }
129  else
130  {
131  m_validityDuration = 0;
133  m_lifeTime = 0;
134  }
137  if(denm.denm.situation)
138  {
140  if(rval.encoded > 0)
141  m_situation = new QByteArray(tmp, (rval.encoded + 7) / 8);
142  else
143  m_situation = 0;
144  memset(tmp, '\0', MSG_LENGTH);
145  }
146  else
147  m_situation = 0;
148  if(denm.denm.location)
149  {
151  if(rval.encoded > 0)
152  m_location = new QByteArray(tmp, (rval.encoded + 7) / 8);
153  else
154  m_location = 0;
155  memset(tmp, '\0', MSG_LENGTH);
156  }
157  else
158  m_location = 0;
159  if(denm.denm.alacarte)
160  {
162  if(rval.encoded > 0)
163  m_alacarte = new QByteArray(tmp, (rval.encoded + 7) / 8);
164  else
165  m_alacarte = 0;
166  memset(tmp, '\0', MSG_LENGTH);
167  }
168  else
169  m_alacarte = 0;
171  {
172  m_relevanceDistance = (quint8*)calloc(1, sizeof *m_relevanceDistance);
174  }
175  else
178  {
179  m_relevanceTrafficDirection = (quint8*)calloc(1, sizeof *m_relevanceTrafficDirection);
181  }
182  else
184  m_maximumHopLimit = (quint8*)calloc(1, sizeof *m_maximumHopLimit);
185  *m_maximumHopLimit = 10;
186  m_destinationArea = destination;
188 }
189 
191 {
192  quint16 options = 0;
193 
195  options |= 1 << (15 - AppDenmTriggerData_validityDuration);
197  options |= 1 << (15 - AppDenmTriggerData_repetitionDuration);
199  options |= 1 << (15 - AppDenmTriggerData_transmissionInterval);
201  options |= 1 << (15 - AppDenmTriggerData_repetitionInterval);
202  if(m_situation)
203  options |= 1 << (15 - AppDenmTriggerData_situation);
204  if(m_location)
205  options |= 1 << (15 - AppDenmTriggerData_location);
206  if(m_alacarte)
207  options |= 1 << (15 - AppDenmTriggerData_alacarte);
209  options |= 1 << (15 - AppDenmTriggerData_relevanceDistance);
211  options |= 1 << (15 - AppDenmTriggerData_relevanceTrafficDirection);
212 
213  return options;
214 }
215 
217 {
218  QByteArray bin;
219  QDataStream ds(&bin, QIODevice::WriteOnly);
220  quint8 messageType = m_paramDENM->mtAppDENMTrigger();
221  quint16 options = getOptions();
222  quint32 zero32 = 0;
223  quint16 zero16 = 0;
224  quint8 zero8 = 0;
225 
226  ds << messageType << options << m_eventDetectionTime;
227 
228  ds.writeRawData(m_eventPosition.toBin().toStdString().c_str(), m_eventPosition.toBin().length());
230  ds << *m_validityDuration;
231  else
232  ds << zero32;
234  ds << *m_repetitionDuration;
235  else
236  ds << zero32;
238  ds << *m_transmissionInterval;
239  else
240  ds << zero16;
242  ds << *m_repetitionInterval;
243  else
244  ds << zero16;
245  if(m_situation)
246  {
247  ds << (quint8)m_situation->length();
248  ds.writeRawData(m_situation->toStdString().c_str(), m_situation->length());
249  }
250  else
251  ds << zero8;
252  if(m_location)
253  {
254  ds << (quint8)m_location->length();
255  ds.writeRawData(m_location->toStdString().c_str(), m_location->length());
256  }
257  else
258  ds << zero8;
259  if(m_alacarte)
260  {
261  ds << (quint8)m_alacarte->length();
262  ds.writeRawData(m_alacarte->toStdString().c_str(), m_alacarte->length());
263  }
264  else
265  ds << zero8;
267  ds << *m_relevanceDistance;
268  else
269  ds << zero8;
272  else
273  ds << zero8;
274  ds.writeRawData(m_destinationArea.toBin().toStdString().c_str(), m_destinationArea.toBin().length());
275  ds.writeRawData(m_trafficClass.toBin().toStdString().c_str(), m_trafficClass.toBin().length());
276 
277 
278  return bin;
279 }
280 
282 {
283  return QString("AppDenmTriggerData ::= {\n"
284  "\tEventDetectionTime ::= %1\n"
285  "\tEventPosition ::= {\n"
286  "\t%2\n"
287  "\t}\n"
288  "\tValidityDuration ::= %3\n"
289  "\tRepetitionDuration ::= %4\n"
290  "\tTransmissionInterval ::= %5\n"
291  "\tRepetitionInterval ::= %6\n"
292  "\tSituationLength ::= %7\n"
293  "\tSituation ::= %8\n"
294  "\tLocationLength ::= %9\n"
295  "\tLocation ::= %10\n"
296  "\tAlacarteLength ::= %11\n"
297  "\tAlacarte ::= %12\n"
298  "\tRelevanceDistance ::= %13\n"
299  "\tRelevanceTrafficDirection ::= %14\n"
300  "\tDestinationArea ::= {\n"
301  "\t%15\n"
302  "\t}\n"
303  "\tTrafficClass ::= {\n"
304  "\t%16\n"
305  "\t}\n"
306  "}\n")
308  .arg(m_eventPosition.toString())
309  .arg(m_validityDuration ? QString::number(*m_validityDuration) : QString("omit"))
310  .arg(m_repetitionDuration ? QString::number(*m_repetitionDuration) : QString("omit"))
311  .arg(m_transmissionInterval ? QString::number(*m_transmissionInterval) : QString("omit"))
312  .arg(m_repetitionInterval ? QString::number(*m_repetitionInterval) : QString("omit"))
313  .arg(m_situation ? m_situation->length() : 0)
314  .arg(m_situation ? m_situation->toHex() : QString("omit"))
315  .arg(m_location ? m_location->length() : 0)
316  .arg(m_location ? m_location->toHex() : QString("omit"))
317  .arg(m_alacarte ? m_alacarte->length() : 0)
318  .arg(m_alacarte ? m_alacarte->toHex() : QString("omit"))
319  .arg(m_relevanceDistance ? QString::number(*m_relevanceDistance) : QString("omit"))
320  .arg(m_relevanceTrafficDirection ? QString::number(*m_relevanceTrafficDirection) : QString("omit"))
322  .arg(m_trafficClass.toString());
323 }
QByteArray toBin()
toBin Encode the AppDenmTrigger in a byte array.
RelevanceTrafficDirection_t * relevanceTrafficDirection
QString toString()
toString Human readable encoder of the destination area.
DecentralizedEnvironmentalNotificationMessage_t denm
Definition: DENM.h:25
QByteArray toBin()
toBin ReferencePositionData encoder.
#define MSG_LENGTH
asn_TYPE_descriptor_t asn_DEF_LocationContainer
ReferencePositionData m_eventPosition
TrafficClassData m_trafficClass
quint8 * m_relevanceTrafficDirection
DestinationAreaData m_destinationArea
ssize_t encoded
Definition: asn_codecs.h:48
LifeTimeData * m_lifeTime
quint16 * m_transmissionInterval
asn_TYPE_descriptor_t asn_DEF_SituationContainer
AppDenmTrigger definition.
void passBytes(int *offset, int l)
passBytes Increase the offset.
Definition: apiData.cpp:41
ValidityDuration_t * validityDuration
int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l)
Definition: INTEGER.c:825
quint64 extractUInt(char *data, int l, int *offset)
extractUInt Extract an unsigned integer from byte array.
Definition: apiData.cpp:3
TimestampIts_t detectionTime
RelevanceDistance_t * relevanceDistance
asn_TYPE_descriptor_t asn_DEF_AlacarteContainer
QString toString()
toString Human readable ReferencePositionData encoder.
quint8 mtAppDENMTrigger()
mtAppDENMTrigger Message type for AppDENM_trigger getter.
Definition: ParameterDENM.h:38
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
QString toString()
toString Encode the AppDenmTrigger in a human readable.
ParameterDENM * m_paramDENM
ReferencePosition_t eventPosition
Definition: DENM.h:23
AppDenmTriggerData(ParameterDENM *paramDENM)
AppDenmTriggerData AppDenmTriggerData constructor.
quint16 getOptions()
getOptions Generate the bytes option.
QByteArray toBin()
toBin TrafficClassData encoder.
QString toString()
toString Human readable TrafficClassData encoder.
QByteArray toBin()
toBin Byte array encoder of the destination area.