ITS
apiDenBasicService.cpp
Go to the documentation of this file.
1 #include <apiDenBasicService.h>
2 
3 quint64 calculate_T_O_Validity(quint64 detectionTime, quint32 validityDuration)
4 {
5  return detectionTime + validityDuration * 1000;
6 }
7 
9 {
11 }
12 
13 quint64 calculate_T_O_Validity(AppDenmUpdateData data, quint32 *validityDuration)
14 {
15  if(data.validityDuration())
16  *validityDuration = *data.validityDuration();
17  else
18  *validityDuration = DefaultValidity;
19  return calculate_T_O_Validity(data.eventUpdateDetectionTime(), *validityDuration);
20 }
21 
23 {
25 }
26 
28 {
29  ActionID_t ret;
30 
31  ret.originatingStationID = appli->stationID();
32  ret.sequenceNumber = sequenceNumber;
33 
34  return ret;
35 }
36 
38 {
39  ActionID_t ret;
40 
41  ret.originatingStationID = appli->stationID();
42  ret.sequenceNumber = (currentActionID.sequenceNumber + 1) % 65536;
43 
44  return ret;
45 }
46 
48 {
49  ItsPduHeader_t ret;
50 
53  ret.stationID = stationID;
54 
55  return ret;
56 }
57 
59 {
61  management->termination = 0;
63 
64 
65  if(data.relevanceDistance())
66  {
67  management->relevanceDistance = (RelevanceDistance_t*)calloc(1, sizeof *management->relevanceDistance);
68  *management->relevanceDistance = *data.relevanceDistance();
69  }
70  else
71  management->relevanceDistance = 0;
72  if(data.relevanceTrafficDirection())
73  {
74  management->relevanceTrafficDirection = (RelevanceTrafficDirection_t*)calloc(1, sizeof *management->relevanceTrafficDirection);
76  }
77  else
78  management->relevanceTrafficDirection = 0;
79 
80  if(data.validityDuration() && *data.validityDuration() != DefaultValidity)
81  {
82  management->validityDuration = (ValidityDuration_t*)calloc(1, sizeof *management->validityDuration);
83  *management->validityDuration = *data.validityDuration();
84  }
85  else
86  management->validityDuration = 0;
87  management->stationType = appli->stationType();
88 
89  return true;
90 }
91 
93 {
95  management->termination = 0;
96  management->eventPosition = data.eventPosition().toASN();
97  management->actionID = actionID;
98 
99  if(data.relevanceDistance())
100  {
101  management->relevanceDistance = (RelevanceDistance_t*)calloc(1, sizeof *management->relevanceDistance);
102  *management->relevanceDistance = *data.relevanceDistance();
103  }
104  else if(origin.relevanceDistance)
105  {
106  management->relevanceDistance = (RelevanceDistance_t*)calloc(1, sizeof *management->relevanceDistance);
107  *management->relevanceDistance = *origin.relevanceDistance;
108  }
109  else
110  management->relevanceDistance = 0;
111  if(data.relevanceTrafficDirection())
112  {
113  management->relevanceTrafficDirection = (RelevanceTrafficDirection_t*)calloc(1, sizeof *management->relevanceTrafficDirection);
115  }
116  else if(origin.relevanceTrafficDirection)
117  {
118  management->relevanceTrafficDirection = (RelevanceTrafficDirection_t*)calloc(1, sizeof *management->relevanceTrafficDirection);
120  }
121  else
122  management->relevanceTrafficDirection = 0;
123 
124  if(data.validityDuration() && *data.validityDuration() != DefaultValidity)
125  {
126  management->validityDuration = (ValidityDuration_t*)calloc(1, sizeof *management->validityDuration);
127  *management->validityDuration = *data.validityDuration();
128  }
129  else if(origin.validityDuration)
130  {
131  management->validityDuration = (ValidityDuration_t*)calloc(1, sizeof *management->validityDuration);
132  *management->validityDuration = *origin.validityDuration;
133  }
134  else
135  management->validityDuration = 0;
136  management->stationType = appli->stationType();
137 
138  return true;
139 }
140 
141 bool fill_ManagementContainer(TimestampIts_t detectionTime, ManagementContainer_t *management, Termination_t termination,
143 {
144  management->detectionTime = setTimestampIts(detectionTime);
145  management->termination = (Termination_t*)calloc(1, sizeof *management->termination);
146  *management->termination = termination;
147  management->stationType = appli->stationType();
148  memset(&management->referenceTime, 0, sizeof management->referenceTime);
149  asn_ulong2INTEGER((INTEGER_t*)&management->referenceTime, gps->timestamp());
150  return true;
151 }
152 
153 bool fill_ManagementContainer(TimestampIts_t detectionTime, TimestampIts_t referenceTime, ManagementContainer_t *management, Termination_t termination,
155 {
156  Q_UNUSED(gps);
157  management->detectionTime = setTimestampIts(detectionTime);
158  management->termination = (Termination_t*)calloc(1, sizeof *management->termination);
159  *management->termination = termination;
160  management->stationType = appli->stationType();
161  //asn_ulong2INTEGER((INTEGER_t*)&management->referenceTime, gps->timestamp());
162  management->referenceTime = setTimestampIts(referenceTime);
163  return true;
164 }
165 
167 {
169 
170  memset(&ret, 0, sizeof ret);
172  ret.actionID = originatingActionID;
173  ret.eventPosition = gps->referencePosition();
174  ret.stationType = appli->stationType();
175 
176  return ret;
177 }
178 
180 {
181  asn_dec_rval_t rval;
182 
183  rval = uper_decode_complete(NULL, &asn_DEF_SituationContainer, (void**)&situation, data.situation()->data(), data.situation()->length());
184 
185  return rval.code == RC_OK;
186 }
187 
189 {
190  asn_dec_rval_t rval;
191  rval = uper_decode_complete(NULL, &asn_DEF_SituationContainer, (void**)&situation, data.situation()->data(), data.situation()->length());
192 
193  return rval.code == RC_OK;
194 }
195 
197 {
198  asn_dec_rval_t rval;
199 
200  rval = uper_decode_complete(NULL, &asn_DEF_LocationContainer, (void**)&location, data.location()->data(), data.location()->length());
201 
202  /* 6.1.3.2. A DENM shall include at least one trace. */
203  if(rval.code == RC_OK && location->traces.list.count < 1)
204  {
205  location->traces.list.array = (PathHistory_t**)calloc(1, sizeof *location->traces.list.array);
206  PathHistory_t *p = (PathHistory_t*)calloc(1, sizeof *p);
207  location->traces.list.array[0] = (PathHistory_t*)calloc(1, sizeof *location->traces.list.array[0]);
208  ASN_SEQUENCE_ADD(&location->traces, p);
209  }
210 
211  return rval.code == RC_OK;
212 }
213 
215 {
216  asn_dec_rval_t rval;
217 
218  rval = uper_decode_complete(NULL, &asn_DEF_LocationContainer, (void**)&location, data.location()->data(), data.location()->length());
219 
220  /* 6.1.3.2. A DENM shall include at least one trace. */
221  if(rval.code == RC_OK && location->traces.list.count < 1)
222  {
223  location->traces.list.array = (PathHistory_t**)calloc(1, sizeof *location->traces.list.array);
224  PathHistory_t *p = (PathHistory_t*)calloc(1, sizeof *p);
225  location->traces.list.array[0] = (PathHistory_t*)calloc(1, sizeof *location->traces.list.array[0]);
226  ASN_SEQUENCE_ADD(&location->traces, p);
227  }
228 
229  return rval.code == RC_OK;
230 }
231 
233 {
234  asn_dec_rval_t rval;
235 
236  rval = uper_decode_complete(NULL, &asn_DEF_AlacarteContainer, (void**)&alacarte, data.alacarte()->data(), data.alacarte()->length());
237 
238  return rval.code == RC_OK;
239 }
240 
242 {
243  asn_dec_rval_t rval;
244 
245  rval = uper_decode_complete(NULL, &asn_DEF_AlacarteContainer, (void**)&alacarte, data.alacarte()->data(), data.alacarte()->length());
246 
247  return rval.code == RC_OK;
248 }
249 
251 {
253 
254  memset(&ret, 0, sizeof ret);
255 
256  ret.impactReduction = (ImpactReductionContainer_t*)calloc(1, sizeof *ret.impactReduction);
261  ret.impactReduction->posCentMass = conf->posCentMass();
265  ret.impactReduction->posFrontAx = conf->posFrontAx();
267  ret.impactReduction->vehicleMass = conf->vehicleMass();
269  for(int i = 0 ; i < conf->positionOfPillars().list.count ; i++)
270  *ret.impactReduction->positionOfPillars.list.array[i] = *conf->positionOfPillars().list.array[i];
271 
272  return ret;
273 }
274 
275 int haveDENM(ActionID_t actionID, QVector<denMessageTableSource*> table)
276 {
277  int found = -1;
278  int i;
279 
280  for(i = 0 ; i < table.size() && found == -1 ; i++)
281  if(isEqual_ActionID(actionID, table[i]->actionID()))
282  found = i;
283 
284  return found;
285 }
286 
287 int haveDENM(ActionID_t actionID, QVector<denMessageTableReception*> table)
288 {
289  int found = -1;
290  int i;
291 
292  for(i = 0 ; i < table.size() && found == -1 ; i++)
293  if(isEqual_ActionID(actionID, table[i]->actionID()))
294  found = i;
295 
296  return found;
297 }
298 
299 int haveDENM(ActionID_t actionID, QVector<denMessageTableForwarding*> table)
300 {
301  int found = -1;
302  int i;
303 
304  for(i = 0 ; i < table.size() && found == -1 ; i++)
305  if(isEqual_ActionID(actionID, table[i]->actionID()))
306  found = i;
307 
308  return found;
309 }
310 
312 {
313  gnDataRequest_t dr;
314 
316  if(data.repetitionInterval())
317  {
318  dr.repetitionInterval = (quint16*)calloc(1, sizeof *dr.repetitionInterval);
320  }
321  else
322  dr.repetitionInterval = 0;
323  if(data.transmissionInterval())
324  {
325  dr.maximumRepetitionTime = (quint16*)calloc(1, sizeof *dr.maximumRepetitionTime);
327  }
328  else
329  dr.maximumRepetitionTime = 0;
330  dr.upperProtocolEntity = CommonHeader::e_upperProtocolEntity::nextHeaderType_BTP_B;
332  dr.destinationPortInfo = 0;
333  dr.packetTransportType = CommonHeader::e_headerType::headerType_geoBroadcast;
334  switch (data.destinationArea().shape()) {
336  dr.packetTransportSubType = CommonHeader::e_headerSubTypeGeoBroadcast::headerSubTypeGeoBroadcast_circle;
337  break;
339  dr.packetTransportSubType = CommonHeader::e_headerSubTypeGeoBroadcast::headerSubTypeGeoBroadcast_rectangle;
340  break;
342  dr.packetTransportSubType = CommonHeader::e_headerSubTypeGeoBroadcast::headerSubTypeGeoBroadcast_ellipse;
343  break;
344  default:
345  dr.packetTransportSubType = CommonHeader::e_headerSubTypeGeoBroadcast::headerSubTypeGeoBroadcast_circle;
346  break;
347  }
350  if(data.lifeTime())
351  {
352  dr.maximumPacketLifeTime = (LifeTime*)calloc(1, sizeof *dr.maximumPacketLifeTime);
354  }
355  else
356  dr.maximumPacketLifeTime = 0;
357  if(data.maximumHopLimit())
358  {
359  dr.maximumHopLimit = (quint8*)calloc(1, sizeof *dr.maximumHopLimit);
360  *dr.maximumHopLimit = *data.maximumHopLimit();
361  }
362  else
363  dr.maximumHopLimit = 0;
364 
365 
366  return dr;
367 }
368 
370 {
372 
378  dest.choice.destinationArea.angle = data.angle();
380 
381  if(!isDestinationAreaAvailable(data))
382  {
385  }
386 
387  return dest;
388 }
389 
391 {
392  return TrafficClass(data.storeCarryForward(), data.channelOffload(), data.trafficClassID());
393 }
394 
396 {
397  return LifeTime(data.multiplier(), (LifeTime::e_base)data.base());
398 }
399 
401 {
403 }
404 
406 {
408 }
DestinationAreaData destinationArea() const
destinationArea Destination area getter.
#define ASN_SEQUENCE_ADD(headptr, ptr)
int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l)
Definition: INTEGER.c:857
gnDataRequest_t structure is the GN data request definition.
Definition: GNDataRequest.h:46
LifeTime * maximumPacketLifeTime
Definition: GNDataRequest.h:55
quint16 * repetitionInterval
Definition: GNDataRequest.h:56
ReferencePositionData eventPosition() const
eventPosition Event position getter.
bool channelOffload() const
channelOffload Channel offload getter.
quint8 * maximumHopLimit() const
maximumHopLimit Maximum hop limit getter.
quint64 eventDetectionTime() const
eventDetectionTime Detection time getter.
quint32 * validityDuration() const
validityDuration Validity duration getter.
quint8 * relevanceTrafficDirection() const
relevanceTrafficDirection Relevance traffic direction getter.
long protocolVersion
Definition: ItsPduHeader.h:38
RelevanceTrafficDirection_t * relevanceTrafficDirection
bool isDestinationAreaAvailable(DestinationAreaData pos)
isDestinationAreaAvailable Check if the destination area is available.
TrafficClassData trafficClass() const
trafficClass Traffic class getter.
PosCentMass_t posCentMass() const
posCentMass Position of the center mass getter.
destinationAddress_t gnDataRequestFromDestinationArea(DestinationAreaData data, ParameterGPS gps)
gnDataRequestFromDestinationArea Generate a destination address from data.
sniff_destinationArea_t destinationArea
Definition: GNDataRequest.h:39
quint16 * maximumRepetitionTime
Definition: GNDataRequest.h:57
StationID_t originatingStationID
Definition: ActionID.h:24
quint16 * transmissionInterval() const
transmissionInterval Transmission interval getter.
unsigned long StationID_t
Definition: StationID.h:21
ReferencePositionData eventPosition() const
eventPosition Event position getter.
asn_TYPE_descriptor_t asn_DEF_LocationContainer
StationID_t stationID
Definition: ItsPduHeader.h:40
Termination_t * termination
long SequenceNumber_t
WheelBaseVehicle_t wheelBaseVehicle() const
wheelBaseVehicle Wheel base of the vehicle getter.
asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const void *buffer, size_t size)
Definition: per_decoder.c:11
TurningRadius_t turningRadius() const
turningRadius Vehicle turning radius getter.
PositionOfPillars_t positionOfPillars() const
positionOfPillars Position of the pillars getter.
QByteArray * location() const
location Location container getter.
struct ImpactReductionContainer * impactReduction
bool isEqual_ActionID(ActionID_t a, ActionID_t b)
isEqual_ActionID Check if two ActionID_t are the same.
Definition: apiCDD.cpp:1404
QByteArray * situation() const
situation Situation container getter.
quint64 timestamp()
timestamp Timestamp getter.
SequenceNumber_t sequenceNumber
Definition: ActionID.h:25
VehicleMass_t vehicleMass() const
vehicleMass Vehicle mass getter.
LifeTimeData * lifeTime() const
lifeTime Life time getter.
PosLonCarr_t posLonCarrLeft() const
posLonCarrLeft Position of the longitudinal carrier on the left side getter.
e_shape shape() const
shape Shape of the area getter.
int asn_long2INTEGER(INTEGER_t *i, long l)
Definition: INTEGER.c:882
quint32 * validityDuration() const
validityDuration Validity duration getter.
quint8 trafficClassID() const
trafficClassID Traffic class ID getter.
asn_TYPE_descriptor_t asn_DEF_SituationContainer
QByteArray * location() const
location Location container getter.
PositionOfOccupants_t positionOfOccupants
long Termination_t
Definition: Termination.h:27
TimestampIts_t referenceTime
LifeTime gnDataRequestFromLifeTime(LifeTimeData data)
gnDataRequestFromLifeTime Generate a life time from data.
PosFrontAx_t posFrontAx() const
posFrontAx Position of the front axis getter.
ValidityDuration_t * validityDuration
CommonHeader::e_upperProtocolEntity upperProtocolEntity
Definition: GNDataRequest.h:48
TrafficClass gnDataRequestFromTrafficClass(TrafficClassData data)
gnDataRequestFromTrafficClass Generate a traffic class from data.
bool fill_SituationContainer(AppDenmTriggerData data, SituationContainer_t *situation)
fill_SituationContainer Fills the SituationContainer.
qint32 geoAreaPosLongitude() const
geoAreaPosLongitude Geo area position longitude getter.
ActionID_t assignUnusedActionID(ParameterApplication *appli, ActionID_t currentActionID)
assignUnusedActionID Assign an unused ActionID.
ItsPduHeader_t fill_ItsPduHeader(StationID_t stationID)
fill_ItsPduHeader Fills the ItsPduHeader.
quint8 * relevanceTrafficDirection() const
relevanceTrafficDirection Relevance traffic direction getter.
TimestampIts_t detectionTime
quint16 distanceB() const
distanceB Semi major axis of the area getter.
long ValidityDuration_t
#define DefaultValidity
RelevanceDistance_t * relevanceDistance
asn_TYPE_descriptor_t asn_DEF_AlacarteContainer
bool fill_ManagementContainer(AppDenmTriggerData data, ManagementContainer_t *management, ParameterApplication *appli, ParameterGPS gps)
fill_ManagementContainer Fills the ManagementContainer.
destinationAddress_t destinationAddress
Definition: GNDataRequest.h:53
quint8 packetTransportSubType
Definition: GNDataRequest.h:50
bool isReferencePositionAvailable(ReferencePosition_t pos)
isReferencePositionAvailable Check if the reference position is available.
StationType_t stationType() const
stationType Station type getter.
quint8 * maximumHopLimit
Definition: GNDataRequest.h:58
quint64 timestamp() const
timestamp Timestamp since 01/01/2004 getter.
Definition: ParameterGPS.h:91
PositionOfPillars_t positionOfPillars
long RelevanceDistance_t
quint64 calculate_T_O_Validity(quint64 detectionTime, quint32 validityDuration)
calculate_T_O_Validity Compute the T_O_Validity timer.
QByteArray * alacarte() const
alacarte Alacarte container getter.
quint64 eventUpdateDetectionTime() const
eventUpdateDetectionTime Detection time getter.
quint8 multiplier() const
multiplier Multiplier getter.
Definition: LifeTimeData.h:36
long RelevanceTrafficDirection_t
quint32 * validityDuration() const
validityDuration Validity duration getter.
bool storeCarryForward() const
storeCarryForward Store-carry-forward getter.
quint16 destinationPort
Definition: GNDataRequest.h:51
HeightLonCarr_t heightLonCarrRight() const
heightLonCarrRight Height of the longitudinal carrier on the right side getter.
ReferencePosition_t referencePosition() const
referencePosition ITS-S position getter.
Definition: ParameterGPS.h:81
enum asn_dec_rval_code_e code
Definition: asn_codecs.h:88
quint64 eventTerminationDetectionTime() const
eventTerminationDetectionTime Detection time getter.
int haveDENM(ActionID_t actionID, QVector< denMessageTableSource *> table)
haveDENM Check if the DENM exists in the denMessageTableSource
destinationAddress_t structure is the destination address definition.
Definition: GNDataRequest.h:30
quint8 base() const
base Base getter.
Definition: LifeTimeData.h:41
QByteArray * alacarte() const
alacarte Alacarte container getter.
ReferencePosition_t eventPosition
RequestResponseIndication_t requestResponseIndication
StationID_t stationID() const
stationID Station ID getter.
gnDataRequest_t gnDataRequestFromAppDenmTriggerData(AppDenmTriggerData data, ParameterGPS gps)
gnDataRequestFromAppDenmTriggerData Generate a GN Data Request from an AppDenmTriggerData.
CommonHeader::e_headerType packetTransportType
Definition: GNDataRequest.h:49
quint16 angle() const
angle Heading to the North of the area getter.
e_destinationAddress_PR_present present
Definition: GNDataRequest.h:32
quint16 distanceA() const
distanceA Semi minor axis of the area getter.
ReferencePosition_t toASN()
toASN C style of the ReferencePositionData encoder.
quint16 destinationPortInfo
Definition: GNDataRequest.h:52
quint8 * relevanceDistance() const
relevanceDistance Relevance distance getter.
QByteArray * situation() const
situation Situation container getter.
union destinationAddress_s::@2 choice
The choice union is composed by a GN_ADDR or a destination area.
quint16 * repetitionInterval() const
repetitionInterval Repetition interval getter.
qint32 geoAreaPosLatitude() const
geoAreaPosLatitude Geo area position latitude getter.
API used by the DEN Basic Service.
TimestampIts_t setTimestampIts(TimestampIts_t t)
setTimestampIts TimestampIts copy.
bool fill_LocationContainer(AppDenmTriggerData data, LocationContainer_t *location)
fill_LocationContainer Fills the LocationContainer.
e_gnCommunicationProfile gnCommunicationProfile
Definition: GNDataRequest.h:54
e_base
The e_base enum is the base encoding.
Definition: LifeTime.h:36
PosLonCarr_t posLonCarrRight() const
posLonCarrRight Position of the longitudinal carrier on the right side getter.
ActionID_t defaultActionID(ParameterApplication *appli, SequenceNumber_t sequenceNumber)
defaultActionID Generate a default ActionID.
HeightLonCarr_t heightLonCarrLeft() const
heightLonCarrLeft Height of the longitudinal carrier on the left side getter.
bool fill_AlacarteContainer(AppDenmTriggerData data, AlacarteContainer_t *alacarte)
fill_AlacarteContainer Fills the AlacarteContainer.
quint8 * relevanceDistance() const
relevanceDistance Relevance distance getter.
PositionOfOccupants_t positionOfOccupants() const
positionOfOccupants Position of occupants getter.
Definition: ParameterCAN.h:138
TrafficClass trafficClass
Definition: GNDataRequest.h:59