ITS
AppDenmUpdateData.cpp
Go to the documentation of this file.
1 #include "AppDenmUpdateData.h"
2 
3 #include <QDataStream>
4 
6 {
14  m_location = 0;
15  m_situation = 0;
16  m_alacarte = 0;
17  m_trafficClass = 0;
18  m_paramDENM = paramDENM;
19 }
20 
22 {
23  char *data = datagram.data();
24  int offset = 1;
25  quint16 options = extractUInt(data, 2, &offset);
26 
34  m_location = 0;
35  m_situation = 0;
36  m_alacarte = 0;
37  m_trafficClass = 0;
38 
39  if(options & (1 << (15 - AppDenmUpdateData_validityDuration)))
40  m_validityDuration = (quint32*)calloc(1, sizeof *m_validityDuration);
41  if(options & (1 << (15 - AppDenmUpdateData_repetitionDuration)))
42  m_repetitionDuration = (quint32*)calloc(1, sizeof *m_repetitionDuration);
43  if(options & (1 << (15 - AppDenmUpdateData_transmissionDuration)))
44  m_transmissionDuration = (quint16*)calloc(1, sizeof *m_transmissionDuration);
45  if(options & (1 << (15 - AppDenmUpdateData_transmissionInterval)))
46  m_transmissionInterval = (quint16*)calloc(1, sizeof *m_transmissionInterval);
47  if(options & (1 << (15 - AppDenmUpdateData_relevanceDistance)))
48  m_relevanceDistance = (quint8*)calloc(1, sizeof *m_relevanceDistance);
49  if(options & (1 << (15 - AppDenmUpdateData_relevanceTrafficDirection)))
50  m_relevanceTrafficDirection = (quint8*)calloc(1, sizeof *m_relevanceTrafficDirection);
51  if(options & (1 << (15 - AppDenmUpdateData_trafficClass)))
52  m_trafficClass = (TrafficClassData*)calloc(1, sizeof *m_trafficClass);
53 
54  m_actionID = ActionIDData(data, &offset);
55  m_eventUpdateDetectionTime = extractUInt(data, 8, &offset);
56  m_eventPosition = ReferencePositionData(data, &offset);
58  *m_validityDuration = extractUInt(data, 4, &offset);
59  else
60  passBytes(&offset, 4);
62  *m_repetitionDuration = extractUInt(data, 4, &offset);
63  else
64  passBytes(&offset, 4);
66  *m_transmissionDuration = extractUInt(data, 2, &offset);
67  else
68  passBytes(&offset, 2);
70  *m_transmissionInterval = extractUInt(data, 2, &offset);
71  else
72  passBytes(&offset, 2);
73  if(options & (1 << (15 - AppDenmUpdateData_situation)))
74  {
75  m_situation = new QByteArray(data + offset + 1, *(data + offset));
76  passBytes(&offset, *(data + offset) + 1);
77  }
78  else
79  passBytes(&offset, 1);
80  if(options & (1 << (15 - AppDenmUpdateData_location)))
81  {
82  m_location = new QByteArray(data + offset + 1, *(data + offset));
83  passBytes(&offset, *(data + offset) + 1);
84  }
85  else
86  passBytes(&offset, 1);
87  if(options & (1 << (15 - AppDenmUpdateData_alacarte)))
88  {
89  m_alacarte = new QByteArray(data + offset + 1, *(data + offset));
90  passBytes(&offset, *(data + offset) + 1);
91  }
92  else
93  passBytes(&offset, 1);
95  *m_relevanceDistance = extractUInt(data, 1, &offset);
96  else
97  passBytes(&offset, 1);
99  *m_relevanceTrafficDirection = extractUInt(data, 1, &offset);
100  else
101  passBytes(&offset, 1);
102  m_destinationArea = DestinationAreaData(data, &offset);
103  if(m_trafficClass)
104  m_trafficClass = new TrafficClassData(data, &offset);
105  else
106  passBytes(&offset, 1);
107 }
108 
110 {
111  quint16 options = 0;
112 
114  options |= 1 << (15 - AppDenmUpdateData_validityDuration);
116  options |= 1 << (15 - AppDenmUpdateData_repetitionDuration);
118  options |= 1 << (15 - AppDenmUpdateData_transmissionDuration);
120  options |= 1 << (15 - AppDenmUpdateData_transmissionInterval);
121  if(m_situation)
122  options |= 1 << (15 - AppDenmUpdateData_situation);
123  if(m_location)
124  options |= 1 << (15 - AppDenmUpdateData_location);
125  if(m_alacarte)
126  options |= 1 << (15 - AppDenmUpdateData_alacarte);
128  options |= 1 << (15 - AppDenmUpdateData_relevanceDistance);
130  options |= 1 << (15 - AppDenmUpdateData_relevanceTrafficDirection);
131 
132  return options;
133 }
134 
136 {
137  QByteArray bin;
138  QDataStream ds(&bin, QIODevice::WriteOnly);
139  quint8 messageType = m_paramDENM->mtAppDENMUpdate();
140  quint16 options = getOptions();
141  quint8 zero8 = 0;
142  quint16 zero16 = 0;
143  quint32 zero32 = 0;
144 
145  ds << messageType << options;
146  ds.writeRawData(m_actionID.toBin().data(), m_actionID.toBin().length());
148  ds.writeRawData(m_eventPosition.toBin().data(), m_eventPosition.toBin().length());
150  ds << *m_validityDuration;
151  else
152  ds << zero32;
154  ds << *m_repetitionDuration;
155  else
156  ds << zero32;
158  ds << *m_transmissionInterval;
159  else
160  ds << zero16;
162  ds << *m_transmissionDuration;
163  else
164  ds << zero16;
165  if(m_situation)
166  {
167  ds << (quint8)m_situation->length();
168  ds.writeRawData(m_situation->data(), m_situation->length());
169  }
170  if(m_location)
171  {
172  ds << (quint8)m_location->length();
173  ds.writeRawData(m_location->data(), m_location->length());
174  }
175  if(m_alacarte)
176  {
177  ds << (quint8)m_alacarte->length();
178  ds.writeRawData(m_alacarte->data(), m_alacarte->length());
179  }
181  ds << *m_relevanceDistance;
182  else
183  ds << zero8;
186  else
187  ds << zero8;
188  ds.writeRawData(m_destinationArea.toBin().data(), m_destinationArea.toBin().length());
189  if(m_trafficClass)
190  ds.writeRawData(m_trafficClass->toBin().data(), m_trafficClass->toBin().length());
191  else
192  ds << zero8;
193 
194  return bin;
195 }
DestinationAreaData m_destinationArea
QByteArray toBin()
toBin ReferencePositionData encoder.
quint32 * m_validityDuration
ParameterDENM * m_paramDENM
AppDenmUpdateData(ParameterDENM *paramDENM)
AppDenmUpdateData AppDenmUpdateData constructor.
quint16 * m_transmissionInterval
quint8 * m_relevanceTrafficDirection
QByteArray * m_situation
QByteArray toBin()
toBin Byte array encoder of the AppDenmUpdate.
quint32 * m_repetitionDuration
ActionIDData m_actionID
TrafficClassData * m_trafficClass
void passBytes(int *offset, int l)
passBytes Increase the offset.
Definition: apiData.cpp:41
quint64 m_eventUpdateDetectionTime
quint16 * m_transmissionDuration
quint64 extractUInt(char *data, int l, int *offset)
extractUInt Extract an unsigned integer from byte array.
Definition: apiData.cpp:3
AppDenmUpdate serializer.
quint8 mtAppDENMUpdate() const
mtAppDENMUpdate Message type for AppDENM_update getter.
Definition: ParameterDENM.h:43
QByteArray toBin()
toBin Byte array encoding.
quint16 getOptions()
getOptions Generate the options bytes.
QByteArray * m_location
QByteArray toBin()
toBin TrafficClassData encoder.
ReferencePositionData m_eventPosition
QByteArray * m_alacarte
QByteArray toBin()
toBin Byte array encoder of the destination area.