ITS
CBFPacketEntry.cpp
Go to the documentation of this file.
1 #include "CBFPacketEntry.h"
2 
4 {
5  m_mutex = new QMutex;
6  m_paramNetwork = 0;
7  m_paramGPS = 0;
8  m_timer = 0;
9  m_send = true;
10 }
11 
12 CBFPacketEntry::CBFPacketEntry(BasicHeader bh, CommonHeader ch, GBCPacket packet, QByteArray payload, int timerToLive, ParameterNetwork* paramNetwork, GnAddr* gnAddr, FakeGPSProvider* paramGPS, HistoryPacketBuffer* HPB, quint16* SN)
13 {
14  m_mutex = new QMutex;
15  m_bh = bh;
16  m_ch = ch;
18  m_gbc = packet;
19  m_paramNetwork = paramNetwork;
20  m_paramGPS = paramGPS;
21  m_timer = timerToLive;
22  m_gnAddr = gnAddr;
23  m_HPB = HPB;
24  sequenceNumber = SN;
25  m_send = true;
26 }
27 
28 CBFPacketEntry::CBFPacketEntry(BasicHeader bh, CommonHeader ch, GUCPacket packet, QByteArray payload, int timerToLive, ParameterNetwork* paramNetwork, GnAddr* gnAddr, FakeGPSProvider* paramGPS, HistoryPacketBuffer* HPB, quint16* SN)
29 {
30  m_mutex = new QMutex;
31  m_bh = bh;
32  m_ch = ch;
34  m_guc = packet;
35  m_paramNetwork = paramNetwork;
36  m_paramGPS = paramGPS;
37  m_timer = timerToLive;
38  m_gnAddr = gnAddr;
39  m_HPB = HPB;
40  sequenceNumber = SN;
41  m_send = true;
42 }
43 
44 CBFPacketEntry::CBFPacketEntry(BasicHeader bh, CommonHeader ch, LSReplyPacket packet, QByteArray payload, int timerToLive, ParameterNetwork* paramNetwork, GnAddr* gnAddr, FakeGPSProvider* paramGPS, HistoryPacketBuffer* HPB, quint16* SN)
45 {
46  m_mutex = new QMutex;
47  m_bh = bh;
48  m_ch = ch;
50  m_lsReply = packet;
51  m_paramNetwork = paramNetwork;
52  m_paramGPS = paramGPS;
53  m_timer = timerToLive;
54  m_gnAddr = gnAddr;
55  m_HPB = HPB;
56  sequenceNumber = SN;
57  m_send = true;
58 }
59 
61 {
62  m_mutex = other.m_mutex;
63  m_bh = other.m_bh;
64  m_ch = other.m_ch;
65  m_payload = other.m_payload;
66  switch(other.m_ch.headerType())
67  {
69  m_beac = other.m_beac;
70  break;
72  m_gac = other.m_gac;
73  m_gbc = other.m_gbc;
74  break;
76  m_gbc = other.m_gbc;
77  break;
79  m_guc = other.m_guc;
80  break;
82  switch(other.m_ch.headerSubType())
83  {
85  m_shb = other.m_shb;
86  break;
88  m_tsb= other.m_tsb;
89  break;
90  default:
91  break;
92  }
93  break;
95  switch(other.m_ch.headerSubType())
96  {
98  m_lsRequest = other.m_lsRequest;
99  break;
101  m_lsReply = other.m_lsReply;
102  break;
103  }
104  break;
106  default:
107  break;
108  }
109  this->m_paramNetwork = other.m_paramNetwork;
110  m_paramGPS = other.m_paramGPS;
111  this->m_timer = other.m_timer;
112  this->m_gnAddr= other.m_gnAddr;
113  this->m_send = other.m_send;
114  this->m_miniTimer = other.m_miniTimer;
115 }
116 
118 {
119  m_mutex = other.m_mutex;
120  m_bh = other.m_bh;
121  m_ch = other.m_ch;
122  m_payload = other.m_payload;
123  switch(other.m_ch.headerType())
124  {
126  m_beac = other.m_beac;
127  break;
129  m_gac = other.m_gac;
130  m_gbc = other.m_gbc;
131  break;
133  m_gbc = other.m_gbc;
134  break;
136  m_guc = other.m_guc;
137  break;
139  switch(other.m_ch.headerSubType())
140  {
142  m_shb = other.m_shb;
143  break;
145  m_tsb= other.m_tsb;
146  break;
147  default:
148  break;
149  }
150  break;
152  switch(other.m_ch.headerSubType())
153  {
155  m_lsRequest = other.m_lsRequest;
156  break;
158  m_lsReply = other.m_lsReply;
159  break;
160  }
161  break;
163  default:
164  break;
165  }
166  this->m_paramNetwork = other.m_paramNetwork;
167  this->m_paramGPS = other.m_paramGPS;
168  this->m_timer = other.m_timer;
169  this->m_gnAddr = other.m_gnAddr;
170  this->m_send = other.m_send;
171  this->m_miniTimer = other.m_miniTimer;
172  return *this;
173 }
174 
175 //bool CBFPacketEntry::operator==(const CBFPacketEntry& other)
176 //{
177 // if(other.m_ch.headerType() == CommonHeader::headerType_geoBroadcast)
178 // return isDuplicatePacketDetectionTimestampSN(m_gbc.soPv().timestamp(), other.m_gbc.soPv().timestamp(), m_gbc.sequenceNumber(), other.m_gbc.sequenceNumber());
179 // else if(other.m_ch.headerType() == CommonHeader::headerType_geoUnicast)
180 // return isDuplicatePacketDetectionTimestampSN(m_guc.soPv().timestamp(), other.m_guc.soPv().timestamp(), m_guc.sequenceNumber(), other.m_guc.sequenceNumber());
181 // else
182 // return false;
183 //}
184 
186 {
187  m_send = false;
188  this->deleteLater();
189 }
190 
192 {
193  m_elapsed.start();
194  m_miniTimer.start();
195  printf("Timer : %d\n", m_timer);
196  //m_timeCompt.start(m_timer);
197 
198  //QThread::msleep(m_timer);
199 
200  //while(m_timeCompt.remainingTime() > 0)
201  while(m_miniTimer.elapsed() < m_timer)
202  ;
203  printf("End Elapsed : %lld\n", m_elapsed.elapsed());
204  if(basicHeader().lifeTime().lifeTime() - m_elapsed.elapsed() < 50 || basicHeader().rhl() < 1)
205  {
207  emit killMe(m_gbc);
209  emit killMe(m_guc);
211  emit killMe(m_lsReply);
212  kill();
213  }
214 
215  if(m_send)
216  sendPacket();
217 }
218 
220 {
221  quint32 tmpstmp = m_paramGPS->timestamp() % 0x100000000;
224 
226  {
227  if(m_gbc.soPv().gnAddr() == *m_gnAddr)
228  m_gbc.setSoPv(lpv);
229  }
230  else if(commonHeader().headerType() == CommonHeader::headerType_geoUnicast)
231  {
232  if(m_guc.soPv().gnAddr() == *m_gnAddr)
233  m_guc.setSoPv(lpv);
234  }
236  {
237  if(m_lsReply.soPv().gnAddr() == *m_gnAddr)
238  m_lsReply.setSoPv(lpv);
239  }
240 
241  quint64 lt = basicHeader().lifeTime().lifeTime() - m_elapsed.elapsed();
242  if(lt % 50 != 0)
243  lt = (lt/50)*50;
245 
246 
247  if(m_paramNetwork == NULL)
248  return;
249 
250  size_t tx_len = sizeof(struct ether_header);
251 
252  for(int i = 0 ; i < 6 ; i++)
253  m_paramNetwork->eh.ether_dhost[i] = 0xFF;
254 
255  /* Construct the Ethernet header : my mac addr */
256  for(int i = 0 ; i < 6 ; i++)
257  m_paramNetwork->eh.ether_shost[i] = m_gnAddr->mid(i);
258 
259  int extendedHeaderSize = 0;
260  /* Construct the packet */
261  QByteArray packetToSend;
262  QDataStream ds(&packetToSend, QIODevice::WriteOnly);
263 
264  ds.writeRawData(basicHeader().toHex().data(), basicHeader().toHex().length());
265  ds.writeRawData(commonHeader().toHex().data(), commonHeader().toHex().length());
267  {
268  extendedHeaderSize = m_gbc.toHex().length();
269  ds.writeRawData(m_gbc.toHex().data(), extendedHeaderSize);
270  qDebug() << "GBCDATA:" << m_gbc.toHex().toHex();
271  }
273  {
274  extendedHeaderSize = m_guc.toHex().length();
275  ds.writeRawData(m_guc.toHex().data(), extendedHeaderSize);
276  }
278  {
279  extendedHeaderSize = m_lsReply.toHex().length();
280  ds.writeRawData(m_lsReply.toHex().data(), extendedHeaderSize);
281  }
282  ds.writeRawData(payload().data(), payload().length());
283 
284  memcpy(m_paramNetwork->sendbuf, &m_paramNetwork->eh, sizeof(struct ether_header));
285  for(int i = 0 ; i < BasicHeader::helper_size + CommonHeader::helper_size + extendedHeaderSize + payload().length(); i++)
286  m_paramNetwork->sendbuf[tx_len++] = packetToSend.data()[i];
287 
288  /* Send packet */
289  if(sendto(m_paramNetwork->rawSocket, m_paramNetwork->sendbuf, tx_len, 0, (struct sockaddr*)(&(m_paramNetwork->socket_address)), sizeof(struct sockaddr_ll)) < 0)
290  {
291  qDebug() << "sendto" << strerror(errno);
292  }
293  else
294  {
296  (*sequenceNumber)++;
298  {
299  printf("GAC/GBC PACKET sent from CBF\n");
301  emit packetSent(m_gbc);
302  }
303  else if(commonHeader().headerType() == CommonHeader::headerType_geoUnicast)
304  {
305  printf("GUC PACKET sent from CBF\n");
307  emit packetSent(m_guc);
308  }
310  {
311  printf("LSREPLY PACKET sent from CBF\n");
313  emit packetSent(m_lsReply);
314  }
315  }
316 }
bool m_send
void sendPacket()
sendPacket Send packet.
void killMe(GBCPacket packet)
killMe Kill entry from buffer (GBC case).
QByteArray m_payload
struct ether_header eh
int m_timer
SpeedValue_t speedValue
Definition: Speed.h:24
CommonHeader commonHeader() const
basicHeader Entry Common Header getter.
char sendbuf[BUF_SIZ]
BeaconPacket m_beac
LongPositionVector soPv() const
soPv SO PV getter.
Definition: GBCPacket.h:95
BasicHeader basicHeader() const
basicHeader Entry Basic Header getter.
ParameterNetwork * m_paramNetwork
quint64 timestamp()
timestamp Timestamp getter.
Entry of the CBFPacketBuffer.
BasicHeader m_bh
HistoryPacketBuffer * m_HPB
QElapsedTimer m_elapsed
GBCPacket m_gbc
void setSoPv(LongPositionVector lpv)
setSoPv SO PV setter.
Definition: GBCPacket.h:106
GnAddr gnAddr() const
gnAddr GnAddr field getter
#define itsGnPaiInterval
Definition: constantes.h:94
GUCPacket m_guc
void execute()
execute Slot used to start the timers.
HeadingValue_t headingValue
Definition: Heading.h:24
SemiAxisLength_t semiMajorConfidence
CBFPacketEntry()
CBFPacketEntry CBFPacketEntry constructor.
QByteArray payload() const
basicHeader Entry payload getter.
quint32 lifeTime() const
lifeTime Life time value computation.
Definition: LifeTime.h:120
PosConfidenceEllipse_t positionConfidenceEllipse
ParameterGPS & data()
data GPS data getter.
QElapsedTimer m_miniTimer
LSReplyPacket m_lsReply
quint8 * mid()
mid MID field getter.
Definition: GnAddr.h:121
QMutex * m_mutex
FakeGPSProvider * m_paramGPS
quint8 headerType() const
headerType Header field getter.
Definition: CommonHeader.h:193
quint8 rhl() const
rhl Router hop limit field getter.
Definition: BasicHeader.h:110
quint16 * sequenceNumber
CBFPacketEntry & operator=(const CBFPacketEntry &other)
operator= CBFPacketEntry affectation operator.
Speed_t speed() const
speed ITS-S speed getter.
Definition: ParameterGPS.h:86
GACPacket m_gac
LifeTime lifeTime() const
lifeTime Life time field getter.
Definition: BasicHeader.h:105
ReferencePosition_t referencePosition() const
referencePosition ITS-S position getter.
Definition: ParameterGPS.h:81
CommonHeader m_ch
quint8 headerSubType() const
headerSubType Header sub-type field getter.
Definition: CommonHeader.h:198
void packetSent(GBCPacket packet)
packetSent Signal used to send GBC.
Definition: GnAddr.h:28
SHBPacket m_shb
QByteArray toHex()
toHex Create a QByteArray containing the hexadecimal format of the GBCPacket.
Definition: GUCPacket.cpp:41
struct sockaddr_ll socket_address
void setLifeTime(LifeTime l)
setLifeTime Life time field setter.
Definition: BasicHeader.h:132
Heading_t heading() const
heading ITS-S heading getter.
Definition: ParameterGPS.h:71
void setSoPv(LongPositionVector lpv)
setSoPv GUC SO PV setter.
Definition: GUCPacket.h:87
GnAddr * m_gnAddr
LSRequestPacket m_lsRequest
TSBPacket m_tsb
void kill()
kill Slot used to kill an entry.
void addPacket(BeaconPacket packet)
addPacket Add packet to the buffer.
LongPositionVector soPv() const
soPv GUC SO PV getter.
Definition: GUCPacket.h:77
QByteArray toHex()
toHex Create a QByteArray containing the hexadecimal format of the GBCPacket.
Definition: GBCPacket.cpp:55