datapacket_p.h
Go to the documentation of this file.
1 
2 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions, and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions, and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // 3. Neither the names of the copyright holders nor the names of their contributors
16 // may be used to endorse or promote products derived from this software without
17 // specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
26 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
28 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
29 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
30 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
31 //
32 
33 
34 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
35 // All rights reserved.
36 //
37 // Redistribution and use in source and binary forms, with or without modification,
38 // are permitted provided that the following conditions are met:
39 //
40 // 1. Redistributions of source code must retain the above copyright notice,
41 // this list of conditions, and the following disclaimer.
42 //
43 // 2. Redistributions in binary form must reproduce the above copyright notice,
44 // this list of conditions, and the following disclaimer in the documentation
45 // and/or other materials provided with the distribution.
46 //
47 // 3. Neither the names of the copyright holders nor the names of their contributors
48 // may be used to endorse or promote products derived from this software without
49 // specific prior written permission.
50 //
51 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
52 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
54 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
58 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
60 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
61 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
62 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
63 //
64 
65 #ifndef DATAPACKET_P_H
66 #define DATAPACKET_P_H
67 
68 #include "xsmessage.h"
69 #include "xsdeviceid.h"
70 #include "xstimestamp.h"
71 #include <map>
72 #include <atomic>
73 #include "xsquaternion.h"
74 #include "xsushortvector.h"
75 #include "xsvector3.h"
76 #include "xsscrdata.h"
78 #include "xseuler.h"
79 #include "xsmatrix3x3.h"
80 #include "xsrange.h"
81 #include "xstimeinfo.h"
82 #include "xsrawgnsspvtdata.h"
83 #include "xsrawgnsssatinfo.h"
84 #include "xsbytearray.h"
85 #include "xsglovesnapshot.h"
86 #include "xsglovedata.h"
87 
88 #include "xssnapshot.h"
89 
91 namespace XsDataPacket_Private
92 {
94 class Variant
95 {
96 public:
98  Variant(XsDataIdentifier id) : m_id(id) {}
99  virtual ~Variant() {}
101  virtual XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize dSize) = 0;
103  virtual void writeToMessage(XsMessage& msg, XsSize offset) const = 0;
105  virtual XsSize sizeInMsg() const = 0;
110  virtual Variant* clone() const = 0;
111 
113  void setDataId(XsDataIdentifier id)
114  {
115  assert((m_id & XDI_FullTypeMask) == (id & XDI_FullTypeMask));
116  m_id = id;
117  }
119  XsDataIdentifier dataId() const
120  {
121  return m_id;
122  }
123 
125  template <typename U>
126  U& toDerived()
127  {
128  U* ptr = dynamic_cast<U*>(this);
129  assert(ptr);
130  return *ptr;
131  }
132 
134  template <typename U>
135  U const& toDerived() const
136  {
137  U const* ptr = dynamic_cast<U const*>(this);
138  assert(ptr);
139  return *ptr;
140  }
141 
142 private:
143  XsDataIdentifier m_id;
144 };
145 
147 template <typename T, int C = 1>
148 class GenericVariant : public Variant
149 {
150 public:
152  GenericVariant(XsDataIdentifier id) : Variant(id) {}
153 
155  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
156  {
157  msg.getData<T>(data(), dataId(), offset, C);
158  return sz;
159  }
161  void writeToMessage(XsMessage& msg, XsSize offset) const override
162  {
163  msg.setData<T>(constData(), dataId(), offset, C);
164  }
166  virtual T* data() = 0;
168  virtual T const* constData() const = 0;
169 
171  XsSize sizeInMsg() const override
172  {
173  return (XsSize)(ptrdiff_t) XsMessage::sizeInMsg<T>(dataId(), C);
174  }
175 };
176 
178 template<>
179 inline XsSize GenericVariant<uint64_t, 1>::readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz)
180 {
181  *data() = 0;
182  *data() = ((uint64_t)XsMessage_getDataLong(&msg, offset)) << 32;
183  *data() += ((uint64_t)XsMessage_getDataLong(&msg, offset + 4));
184  return sz;
185 }
186 
188 template<>
189 inline void GenericVariant<uint64_t, 1>::writeToMessage(XsMessage& msg, XsSize offset) const
190 {
191  XsMessage_setDataLong(&msg, (uint32_t)((*constData()) >> 32), offset);
192  XsMessage_setDataLong(&msg, (uint32_t)((*constData()) & 0xFFFFFFFF), offset);
193 }
194 
196 template <typename T>
197 struct SimpleVariant : public GenericVariant<T, 1>
198 {
199  using GenericVariant<T, 1>::dataId;
200 
202  SimpleVariant(XsDataIdentifier id) : GenericVariant<T, 1>(id), m_data() {}
204  SimpleVariant(XsDataIdentifier id, T const& val) : GenericVariant<T, 1>(id), m_data(val) {}
205 
206  T m_data;
207 
208  T* data() override
209  {
210  return &m_data;
211  }
213  T const* constData() const override
214  {
215  return &m_data;
216  }
217 
222  Variant* clone() const override
223  {
224  return new SimpleVariant<T>(dataId(), m_data);
225  }
226 
228  XsSize sizeInMsg() const override
229  {
230  return XsMessage::sizeInMsg<T>(dataId(), 1);
231  }
232 };
233 
235 template <typename U, typename T, int C>
236 struct ComplexVariant : public GenericVariant<T, C>
237 {
238  using GenericVariant<T, C>::dataId;
240  ComplexVariant(XsDataIdentifier id) : GenericVariant<T, C>(id) {}
242  ComplexVariant(XsDataIdentifier id, U const& val) : GenericVariant<T, C>(id), m_data(val) {}
243 
244  U m_data;
245 
246  T* data() override
247  {
248  return const_cast<T*>(m_data.data());
249  }
251  T const* constData() const override
252  {
253  return m_data.data();
254  }
255 
260  Variant* clone() const override
261  {
262  return new ComplexVariant<U, T, C>(dataId(), m_data);
263  }
264 };
265 
267 struct XsQuaternionVariant : public ComplexVariant<XsQuaternion, XsReal, 4>
268 {
270  XsQuaternionVariant(XsDataIdentifier id) : ComplexVariant<XsQuaternion, XsReal, 4>(id) {}
272  XsQuaternionVariant(XsDataIdentifier id, XsQuaternion const& val) : ComplexVariant<XsQuaternion, XsReal, 4>(id, val) {}
273 
274  Variant* clone() const override
275  {
276  return new XsQuaternionVariant(dataId(), m_data);
277  }
278 };
279 
281 struct XsUShortVectorVariant : public ComplexVariant<XsUShortVector, uint16_t, 3>
282 {
284  XsUShortVectorVariant(XsDataIdentifier id) : ComplexVariant<XsUShortVector, unsigned short, 3>(id) {}
286  XsUShortVectorVariant(XsDataIdentifier id, XsUShortVector const& val) : ComplexVariant<XsUShortVector, unsigned short, 3>(id, val) {}
287  Variant* clone() const override
288  {
289  return new XsUShortVectorVariant(dataId(), m_data);
290  }
291 };
292 
294 struct XsVector3Variant : public ComplexVariant<XsVector3, XsReal, 3>
295 {
297  XsVector3Variant(XsDataIdentifier id) : ComplexVariant<XsVector3, XsReal, 3>(id) {}
299  XsVector3Variant(XsDataIdentifier id, XsVector const& val) : ComplexVariant<XsVector3, XsReal, 3>(id, val)
300  {
301  assert(val.size() == 3);
302  }
303  Variant* clone() const override
304  {
305  return new XsVector3Variant(dataId(), m_data);
306  }
307 };
308 
310 struct XsVector2Variant : public ComplexVariant<XsVector, XsReal, 2>
311 {
313  XsVector2Variant(XsDataIdentifier id) : ComplexVariant<XsVector, XsReal, 2>(id, XsVector(2, 0)) {}
315  XsVector2Variant(XsDataIdentifier id, XsVector const& val) : ComplexVariant<XsVector, XsReal, 2>(id, val)
316  {
317  assert(val.size() == 2);
318  }
319  Variant* clone() const override
320  {
321  return new XsVector2Variant(dataId(), m_data);
322  }
323 };
324 
326 struct XsScrDataVariant : public Variant
327 {
329  XsScrDataVariant(XsDataIdentifier id) : Variant(id) {}
331  XsScrDataVariant(XsDataIdentifier id, XsScrData const& val) : Variant(id), m_data(val) {}
332  Variant* clone() const override
333  {
334  return new XsScrDataVariant(dataId(), m_data);
335  }
336 
337  XsScrData m_data;
338  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
339  {
340  for (XsSize i = 0; i < 3; ++i, offset += 2)
341  m_data.m_acc[i] = msg.getDataShort(offset);
342  for (XsSize i = 0; i < 3; ++i, offset += 2)
343  m_data.m_gyr[i] = msg.getDataShort(offset);
344  for (XsSize i = 0; i < 3; ++i, offset += 2)
345  m_data.m_mag[i] = msg.getDataShort(offset);
346  m_data.m_temp = msg.getDataShort(offset);
347  return sz;
348  }
349  void writeToMessage(XsMessage& msg, XsSize offset) const override
350  {
351  for (XsSize i = 0; i < 3; ++i, offset += 2)
352  msg.setDataShort(m_data.m_acc[i], offset);
353  for (XsSize i = 0; i < 3; ++i, offset += 2)
354  msg.setDataShort(m_data.m_gyr[i], offset);
355  for (XsSize i = 0; i < 3; ++i, offset += 2)
356  msg.setDataShort(m_data.m_mag[i], offset);
357  msg.setDataShort(m_data.m_temp, offset);
358  }
359 
360  XsSize sizeInMsg() const override
361  {
362  return 10 * sizeof(uint16_t);
363  }
364 };
365 
367 struct XsTriggerIndicationDataVariant : public Variant
368 {
370  XsTriggerIndicationDataVariant(XsDataIdentifier id) : Variant(id) {}
372  XsTriggerIndicationDataVariant(XsDataIdentifier id, XsTriggerIndicationData const& val) : Variant(id), m_data(val) {}
373  Variant* clone() const override
374  {
375  return new XsTriggerIndicationDataVariant(dataId(), m_data);
376  }
377 
378  XsTriggerIndicationData m_data;
379  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
380  {
381  m_data.m_line = XsMessage_getDataByte(&msg, offset + 0);
382  m_data.m_polarity = XsMessage_getDataByte(&msg, offset + 1);
383  m_data.m_timestamp = XsMessage_getDataLong(&msg, offset + 2);
384  m_data.m_frameNumber = XsMessage_getDataShort(&msg, offset + 6);
385  return sz;
386  }
387  void writeToMessage(XsMessage& msg, XsSize offset) const override
388  {
389  XsMessage_setDataByte(&msg, m_data.m_line, offset + 0);
390  XsMessage_setDataByte(&msg, m_data.m_polarity, offset + 1);
391  XsMessage_setDataLong(&msg, m_data.m_timestamp, offset + 2);
392  XsMessage_setDataShort(&msg, m_data.m_frameNumber, offset + 6);
393  }
394 
395  XsSize sizeInMsg() const override
396  {
397  return 8;
398  }
399 };
400 
402 struct XsEulerVariant : public ComplexVariant<XsEuler, XsReal, 3>
403 {
405  XsEulerVariant(XsDataIdentifier id) : ComplexVariant<XsEuler, XsReal, 3>(id) {}
407  XsEulerVariant(XsDataIdentifier id, XsEuler const& val) : ComplexVariant<XsEuler, XsReal, 3>(id, val) {}
408  Variant* clone() const override
409  {
410  return new XsEulerVariant(dataId(), m_data);
411  }
412 };
413 
415 struct XsMatrixVariant : public ComplexVariant<XsMatrix3x3, XsReal, 9>
416 {
418  XsMatrixVariant(XsDataIdentifier id) : ComplexVariant<XsMatrix3x3, XsReal, 9>(id) {}
420  XsMatrixVariant(XsDataIdentifier id, XsMatrix const& val) : ComplexVariant<XsMatrix3x3, XsReal, 9>(id, val) {}
421  Variant* clone() const override
422  {
423  return new XsMatrixVariant(dataId(), m_data);
424  }
425 
426  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
427  {
428  XsSize ds = XsMessage_getFPValueSize(dataId());
429  XsSize k = 0;
430  for (int i = 0 ; i < 3 ; ++i)
431  for (XsSize j = 0 ; j < 3 ; ++j, k += ds)
432  XsMessage_getDataRealValuesById(&msg, dataId(), &m_data[j][i], offset + k, 1);
433  return sz;
434  }
435  void writeToMessage(XsMessage& msg, XsSize offset) const override
436  {
437  XsSize ds = XsMessage_getFPValueSize(dataId());
438  XsSize k = 0;
439  for (int i = 0 ; i < 3 ; ++i)
440  for (XsSize j = 0 ; j < 3 ; ++j, k += ds)
441  XsMessage_setDataRealValuesById(&msg, dataId(), &m_data[j][i], offset + k, 1);
442  }
443 };
444 
446 struct XsRangeVariant : public Variant
447 {
449  XsRangeVariant(XsDataIdentifier id) : Variant(id) {}
451  XsRangeVariant(XsDataIdentifier id, XsRange const& val) : Variant(id), m_data(val) {}
452  Variant* clone() const override
453  {
454  return new XsRangeVariant(dataId(), m_data);
455  }
456 
457  XsRange m_data;
458  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
459  {
460  // unwrap
461  uint16_t first = (uint16_t) XsMessage_getDataShort(&msg, offset + 0);
462  uint16_t last = (uint16_t) XsMessage_getDataShort(&msg, offset + 2);
463  m_data.setRange(first, (int)((uint16_t)(last - first)) + (int)first);
464  return sz;
465  }
466  void writeToMessage(XsMessage& msg, XsSize offset) const override
467  {
468  XsMessage_setDataShort(&msg, (uint16_t) m_data.first(), offset + 0);
469  XsMessage_setDataShort(&msg, (uint16_t) m_data.last(), offset + 2);
470  }
471 
472  XsSize sizeInMsg() const override
473  {
474  return 4;
475  }
476 };
477 
479 struct XsTimeInfoVariant : public Variant
480 {
482  XsTimeInfoVariant(XsDataIdentifier id) : Variant(id), m_data() {}
484  XsTimeInfoVariant(XsDataIdentifier id, XsTimeInfo const& val) : Variant(id), m_data(val) {}
485  Variant* clone() const override
486  {
487  return new XsTimeInfoVariant(dataId(), m_data);
488  }
489 
490  XsTimeInfo m_data;
491  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
492  {
493  m_data.m_nano = XsMessage_getDataLong(&msg, offset);
494  m_data.m_year = XsMessage_getDataShort(&msg, offset + 4);
495 
496  // month, day, hour, minute, second and valid
497  uint8_t* bareByte = (uint8_t*) &m_data.m_month;
498  for (XsSize i = 0; i < 6; ++i)
499  bareByte[i] = XsMessage_getDataByte(&msg, offset + 6 + i);
500 
501  m_data.m_utcOffset = 0;
502  return sz;
503  }
504  void writeToMessage(XsMessage& msg, XsSize offset) const override
505  {
506  // update
507  XsMessage_setDataLong(&msg, m_data.m_nano, offset);
508  XsMessage_setDataShort(&msg, m_data.m_year, offset + 4);
509 
510  // month, day, hour, minute, second and valid
511  uint8_t const* bareByte = (uint8_t const*) &m_data.m_month;
512  for (XsSize i = 0; i < 6; ++i)
513  XsMessage_setDataByte(&msg, bareByte[i], offset + 6 + i);
514 
515  // utcOffset is ignored and assumed to be 0, use makeUtc to ensure this if necessary
516  }
517 
518  XsSize sizeInMsg() const override
519  {
520  return 12;
521  }
522 };
523 
525 struct XsRawGnssPvtDataVariant : public Variant
526 {
528  XsRawGnssPvtDataVariant(XsDataIdentifier id) : Variant(id), m_data() {}
530  XsRawGnssPvtDataVariant(XsDataIdentifier id, XsRawGnssPvtData const& val) : Variant(id), m_data(val) {}
531  Variant* clone() const override
532  {
533  return new XsRawGnssPvtDataVariant(dataId(), m_data);
534  }
535 
536  XsRawGnssPvtData m_data;
537  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
538  {
539  m_data.m_itow = XsMessage_getDataLong(&msg, offset + 0);
540  m_data.m_year = XsMessage_getDataShort(&msg, offset + 4);
541  m_data.m_month = XsMessage_getDataByte(&msg, offset + 6);
542  m_data.m_day = XsMessage_getDataByte(&msg, offset + 7);
543  m_data.m_hour = XsMessage_getDataByte(&msg, offset + 8);
544  m_data.m_min = XsMessage_getDataByte(&msg, offset + 9);
545  m_data.m_sec = XsMessage_getDataByte(&msg, offset + 10);
546  m_data.m_valid = XsMessage_getDataByte(&msg, offset + 11);
547  m_data.m_tAcc = XsMessage_getDataLong(&msg, offset + 12);
548  m_data.m_nano = XsMessage_getDataLong(&msg, offset + 16);
549  m_data.m_fixType = XsMessage_getDataByte(&msg, offset + 20);
550  m_data.m_flags = XsMessage_getDataByte(&msg, offset + 21);
551  m_data.m_numSv = XsMessage_getDataByte(&msg, offset + 22);
552  m_data.m_res1 = XsMessage_getDataByte(&msg, offset + 23);
553  m_data.m_lon = XsMessage_getDataLong(&msg, offset + 24);
554  m_data.m_lat = XsMessage_getDataLong(&msg, offset + 28);
555  m_data.m_height = XsMessage_getDataLong(&msg, offset + 32);
556  m_data.m_hMsl = XsMessage_getDataLong(&msg, offset + 36);
557  m_data.m_hAcc = XsMessage_getDataLong(&msg, offset + 40);
558  m_data.m_vAcc = XsMessage_getDataLong(&msg, offset + 44);
559  m_data.m_velN = XsMessage_getDataLong(&msg, offset + 48);
560  m_data.m_velE = XsMessage_getDataLong(&msg, offset + 52);
561  m_data.m_velD = XsMessage_getDataLong(&msg, offset + 56);
562  m_data.m_gSpeed = XsMessage_getDataLong(&msg, offset + 60);
563  m_data.m_headMot = XsMessage_getDataLong(&msg, offset + 64);
564  m_data.m_sAcc = XsMessage_getDataLong(&msg, offset + 68);
565  m_data.m_headAcc = XsMessage_getDataLong(&msg, offset + 72);
566  m_data.m_headVeh = XsMessage_getDataLong(&msg, offset + 76);
567  m_data.m_gdop = XsMessage_getDataShort(&msg, offset + 80);
568  m_data.m_pdop = XsMessage_getDataShort(&msg, offset + 82);
569  m_data.m_tdop = XsMessage_getDataShort(&msg, offset + 84);
570  m_data.m_vdop = XsMessage_getDataShort(&msg, offset + 86);
571  m_data.m_hdop = XsMessage_getDataShort(&msg, offset + 88);
572  m_data.m_ndop = XsMessage_getDataShort(&msg, offset + 90);
573  m_data.m_edop = XsMessage_getDataShort(&msg, offset + 92);
574  return sz;
575  }
576  void writeToMessage(XsMessage& msg, XsSize offset) const override
577  {
578  XsMessage_setDataLong(&msg, m_data.m_itow, offset + 0);
579  XsMessage_setDataShort(&msg, m_data.m_year, offset + 4);
580  XsMessage_setDataByte(&msg, m_data.m_month, offset + 6);
581  XsMessage_setDataByte(&msg, m_data.m_day, offset + 7);
582  XsMessage_setDataByte(&msg, m_data.m_hour, offset + 8);
583  XsMessage_setDataByte(&msg, m_data.m_min, offset + 9);
584  XsMessage_setDataByte(&msg, m_data.m_sec, offset + 10);
585  XsMessage_setDataByte(&msg, m_data.m_valid, offset + 11);
586  XsMessage_setDataLong(&msg, m_data.m_tAcc, offset + 12);
587  XsMessage_setDataLong(&msg, m_data.m_nano, offset + 16);
588  XsMessage_setDataByte(&msg, m_data.m_fixType, offset + 20);
589  XsMessage_setDataByte(&msg, m_data.m_flags, offset + 21);
590  XsMessage_setDataByte(&msg, m_data.m_numSv, offset + 22);
591  XsMessage_setDataByte(&msg, m_data.m_res1, offset + 23);
592  XsMessage_setDataLong(&msg, m_data.m_lon, offset + 24);
593  XsMessage_setDataLong(&msg, m_data.m_lat, offset + 28);
594  XsMessage_setDataLong(&msg, m_data.m_height, offset + 32);
595  XsMessage_setDataLong(&msg, m_data.m_hMsl, offset + 36);
596  XsMessage_setDataLong(&msg, m_data.m_hAcc, offset + 40);
597  XsMessage_setDataLong(&msg, m_data.m_vAcc, offset + 44);
598  XsMessage_setDataLong(&msg, m_data.m_velN, offset + 48);
599  XsMessage_setDataLong(&msg, m_data.m_velE, offset + 52);
600  XsMessage_setDataLong(&msg, m_data.m_velD, offset + 56);
601  XsMessage_setDataLong(&msg, m_data.m_gSpeed, offset + 60);
602  XsMessage_setDataLong(&msg, m_data.m_headMot, offset + 64);
603  XsMessage_setDataLong(&msg, m_data.m_sAcc, offset + 68);
604  XsMessage_setDataLong(&msg, m_data.m_headAcc, offset + 72);
605  XsMessage_setDataLong(&msg, m_data.m_headVeh, offset + 76);
606  XsMessage_setDataShort(&msg, m_data.m_gdop, offset + 80);
607  XsMessage_setDataShort(&msg, m_data.m_pdop, offset + 82);
608  XsMessage_setDataShort(&msg, m_data.m_tdop, offset + 84);
609  XsMessage_setDataShort(&msg, m_data.m_vdop, offset + 86);
610  XsMessage_setDataShort(&msg, m_data.m_hdop, offset + 88);
611  XsMessage_setDataShort(&msg, m_data.m_ndop, offset + 90);
612  XsMessage_setDataShort(&msg, m_data.m_edop, offset + 92);
613  }
614 
615  XsSize sizeInMsg() const override
616  {
617  return 94;
618  }
619 };
620 
622 struct XsRawGnssSatInfoVariant : public Variant
623 {
625  XsRawGnssSatInfoVariant(XsDataIdentifier id) : Variant(id), m_data() {}
627  XsRawGnssSatInfoVariant(XsDataIdentifier id, XsRawGnssSatInfo const& val) : Variant(id), m_data(val) {}
628  Variant* clone() const override
629  {
630  return new XsRawGnssSatInfoVariant(dataId(), m_data);
631  }
632 
633  XsRawGnssSatInfo m_data;
634  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
635  {
636  m_data.m_itow = XsMessage_getDataLong(&msg, offset + 0);
637  m_data.m_numSvs = XsMessage_getDataByte(&msg, offset + 4);
638  m_data.m_res1 = XsMessage_getDataByte(&msg, offset + 5);
639  m_data.m_res2 = XsMessage_getDataByte(&msg, offset + 6);
640  m_data.m_res3 = XsMessage_getDataByte(&msg, offset + 7);
641 
642  offset = offset + 8;
643  for (uint8_t i = 0; i < m_data.m_numSvs; ++i)
644  {
645  m_data.m_satInfos[i].m_gnssId = XsMessage_getDataByte(&msg, offset + 0);
646  m_data.m_satInfos[i].m_svId = XsMessage_getDataByte(&msg, offset + 1);
647  m_data.m_satInfos[i].m_cno = XsMessage_getDataByte(&msg, offset + 2);
648  m_data.m_satInfos[i].m_flags = XsMessage_getDataByte(&msg, offset + 3);
649  offset += 4;
650  }
651  return sz;
652  }
653  void writeToMessage(XsMessage& msg, XsSize offset) const override
654  {
655  XsMessage_setDataLong(&msg, m_data.m_itow, offset + 0);
656  XsMessage_setDataByte(&msg, m_data.m_numSvs, offset + 4);
657  XsMessage_setDataByte(&msg, m_data.m_res1, offset + 5);
658  XsMessage_setDataByte(&msg, m_data.m_res2, offset + 6);
659  XsMessage_setDataByte(&msg, m_data.m_res3, offset + 7);
660 
661  offset = offset + 8;
662  for (uint8_t i = 0; i < m_data.m_numSvs; ++i)
663  {
664  XsMessage_setDataByte(&msg, m_data.m_satInfos[i].m_gnssId, offset + 0);
665  XsMessage_setDataByte(&msg, m_data.m_satInfos[i].m_svId, offset + 1);
666  XsMessage_setDataByte(&msg, m_data.m_satInfos[i].m_cno, offset + 2);
667  XsMessage_setDataByte(&msg, m_data.m_satInfos[i].m_flags, offset + 3);
668  offset += 4;
669  }
670  }
671 
672  XsSize sizeInMsg() const override
673  {
674  return 8 + 4 * m_data.m_numSvs;
675  }
676 };
677 
679 struct XsFullSnapshotVariant : public Variant
680 {
682  XsFullSnapshotVariant(XsDataIdentifier id) : Variant(id) {}
684  XsFullSnapshotVariant(XsDataIdentifier id, XsSnapshot const& val) : Variant(id), m_data(val) {}
685 
686  Variant* clone() const override
687  {
688  return new XsFullSnapshotVariant(dataId(), m_data);
689  }
690 
691  XsSnapshot m_data;
692  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
693  {
694  m_data.m_frameNumber = XsMessage_getDataShort(&msg, offset);
695  offset += 2;
696  m_data.m_timestamp = XsMessage_getDataLongLong(&msg, offset);
697  offset += 8;
698  for (int i = 0; i < 4; ++i, offset += 4)
699  m_data.m_iQ[i] = XsMessage_getDataLong(&msg, offset);
700  for (int i = 0; i < 3; ++i, offset += 8)
701  m_data.m_iV[i] = XsMessage_getDataLongLong(&msg, offset);
702  for (int i = 0; i < 3; ++i, offset += 4)
703  m_data.m_mag[i] = XsMessage_getDataLong(&msg, offset);
704 
705  m_data.m_baro = XsMessage_getDataLong(&msg, offset);
706  offset += 4;
707  m_data.m_accClippingCounter = XsMessage_getDataByte(&msg, offset);
708  offset += 1;
709  m_data.m_gyrClippingCounter = XsMessage_getDataByte(&msg, offset);
710  offset += 1;
711  m_data.m_status = XsMessage_getDataShort(&msg, offset);
712  m_data.m_type = ST_Full;
713  return sz;
714  }
715 
716  void writeToMessage(XsMessage& msg, XsSize offset) const override
717  {
718  assert(m_data.m_type == ST_Full);
719  XsMessage_setDataShort(&msg, (uint16_t) m_data.m_frameNumber, offset);
720  offset += 2;
721  XsMessage_setDataLongLong(&msg, m_data.m_timestamp, offset);
722  offset += 8;
723  for (int i = 0; i < 4; ++i, offset += 4)
724  XsMessage_setDataLong(&msg, m_data.m_iQ[i], offset);
725  for (int i = 0; i < 3; ++i, offset += 8)
726  XsMessage_setDataLongLong(&msg, m_data.m_iV[i], offset);
727  for (int i = 0; i < 3; ++i, offset += 4)
728  XsMessage_setDataLong(&msg, m_data.m_mag[i], offset);
729 
730  XsMessage_setDataLong(&msg, m_data.m_baro, offset);
731  offset += 4;
732  XsMessage_setDataByte(&msg, m_data.m_accClippingCounter, offset);
733  offset += 1;
734  XsMessage_setDataByte(&msg, m_data.m_gyrClippingCounter, offset);
735  offset += 1;
736  XsMessage_setDataShort(&msg, m_data.m_status, offset);
737  }
738 
739  XsSize sizeInMsg() const override
740  {
741  return 70;
742  }
743 };
744 
746 struct XsAwindaSnapshotVariant : public Variant
747 {
749  XsAwindaSnapshotVariant(XsDataIdentifier id) : Variant(id)
750  {
751  m_data.m_type = ST_Awinda;
752  }
754  XsAwindaSnapshotVariant(XsDataIdentifier id, XsSnapshot const& val) : Variant(id), m_data(val)
755  {
756  m_data.m_type = ST_Awinda;
757  }
758  Variant* clone() const override
759  {
760  return new XsAwindaSnapshotVariant(dataId(), m_data);
761  }
762 
763  XsSnapshot m_data;
764  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
765  {
766  m_data.m_deviceId = XsMessage_getDataLong(&msg, offset);
767  offset += 4;
768  m_data.m_frameNumber = XsMessage_getDataLong(&msg, offset);
769  offset += 4;
770  for (int i = 0; i < 3; ++i, offset += 4)
771  m_data.m_iQ[i] = XsMessage_getDataLong(&msg, offset);
772  for (int i = 0; i < 3; ++i, offset += 4)
773  m_data.m_iV[i] = (int64_t)(int32_t) XsMessage_getDataLong(&msg, offset);
774  for (int i = 0; i < 3; ++i, offset += 2)
775  m_data.m_mag[i] = (int32_t)(int16_t) XsMessage_getDataShort(&msg, offset);
776  m_data.m_baro = XsMessage_getDataLong(&msg, offset);
777  offset += 4;
778  m_data.m_status = XsMessage_getDataShort(&msg, offset);
779  offset += 2;
780  m_data.m_accClippingCounter = XsMessage_getDataByte(&msg, offset);
781  offset += 1;
782  m_data.m_gyrClippingCounter = XsMessage_getDataByte(&msg, offset);
783  m_data.m_type = ST_Awinda;
784  return sz;
785  }
786  void writeToMessage(XsMessage& msg, XsSize offset) const override
787  {
788  assert(m_data.m_type == ST_Awinda);
789  XsMessage_setDataLong(&msg, m_data.m_deviceId.legacyDeviceId(), offset);
790  offset += 4;
791  XsMessage_setDataLong(&msg, m_data.m_frameNumber, offset);
792  offset += 4;
793  for (int i = 0; i < 3; ++i, offset += 4)
794  XsMessage_setDataLong(&msg, m_data.m_iQ[i], offset);
795  for (int i = 0; i < 3; ++i, offset += 4)
796  XsMessage_setDataLong(&msg, (uint32_t)(int32_t) m_data.m_iV[i], offset);
797  for (int i = 0; i < 3; ++i, offset += 2)
798  XsMessage_setDataShort(&msg, (uint16_t)(int16_t) m_data.m_mag[i], offset);
799  XsMessage_setDataLong(&msg, m_data.m_baro, offset);
800  offset += 4;
801  XsMessage_setDataShort(&msg, m_data.m_status, offset);
802  offset += 2;
803  XsMessage_setDataByte(&msg, m_data.m_accClippingCounter, offset);
804  offset += 1;
805  XsMessage_setDataByte(&msg, m_data.m_gyrClippingCounter, offset);
806  }
807 
808  XsSize sizeInMsg() const override
809  {
810  return 46;
811  }
812 };
813 
815 struct XsByteArrayVariant : public Variant
816 {
818  XsByteArrayVariant(XsDataIdentifier id) : Variant(id)
819  {
820  }
822  XsByteArrayVariant(XsDataIdentifier id, XsByteArray const& val) : Variant(id), m_data(val)
823  {
824  }
825  Variant* clone() const override
826  {
827  return new XsByteArrayVariant(dataId(), m_data);
828  }
829 
830  XsByteArray m_data;
831  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize dSize) override
832  {
833  if (dSize)
834  {
835  if (dSize < 255)
836  {
837  m_data.assign(dSize, XsMessage_getDataBuffer(&msg, offset));
838  return dSize;
839  }
840  else
841  {
842  const uint16_t exactId = XsMessage_getDataShort(&msg, offset - 3);
843  XsSize msgSize = msg.getDataSize();
844  XsSize total = 0;
845 
846  // look ahead to get total size
847  XsSize sSize = dSize;
848  XsSize sOffset = offset;
849  XsSize tSize = 255;
850  while (sSize == 255)
851  {
852  sOffset += 255;
853  if (sOffset >= msgSize)
854  break;
855  uint16_t nextId = XsMessage_getDataShort(&msg, sOffset);
856  if (nextId != exactId)
857  break;
858  sSize = XsMessage_getDataByte(&msg, sOffset + 2);
859  sOffset += 3;
860  tSize += sSize;
861  }
862  m_data.setSize(tSize);
863 
864  sOffset = 0;
865  while (dSize == 255)
866  {
867  memcpy(m_data.data() + sOffset, XsMessage_getDataBuffer(&msg, offset), 255);
868  total += 258;
869  offset += 255;
870  sOffset += 255;
871  if (offset >= msgSize)
872  {
873  dSize = 0;
874  break;
875  }
876  uint16_t nextId = XsMessage_getDataShort(&msg, offset);
877  if (nextId != exactId)
878  {
879  dSize = 0;
880  break;
881  }
882  dSize = XsMessage_getDataByte(&msg, offset + 2);
883  offset += 3;
884  }
885  if (dSize)
886  {
887  memcpy(m_data.data() + sOffset, XsMessage_getDataBuffer(&msg, offset), dSize);
888  total += dSize;
889  }
890  return total;
891  }
892  }
893  else
894  {
895  m_data.clear();
896  return 0;
897  }
898  }
899  void writeToMessage(XsMessage& msg, XsSize offset) const override
900  {
901  if (m_data.size())
902  {
903  if (m_data.size() < 255)
904  XsMessage_setDataBuffer(&msg, m_data.data(), m_data.size(), offset);
905  else
906  {
907  XsSize dataOffset = 0;
908  XsSize remainingSize = m_data.size();
909  while (remainingSize >= 255)
910  {
911  XsMessage_setDataBuffer(&msg, m_data.data() + dataOffset, 255, offset);
912  offset += 258;
913  dataOffset += 255;
914  remainingSize -= 255;
915  }
916  if (remainingSize)
917  XsMessage_setDataBuffer(&msg, m_data.data() + dataOffset, remainingSize, offset);
918  }
919  }
920  }
921 
922  XsSize sizeInMsg() const override
923  {
924  return m_data.size();
925  }
926 };
927 
929 struct XsGloveSnapshotVariant : public Variant
930 {
932  XsGloveSnapshotVariant(XsDataIdentifier id) : Variant(id)
933  {
934  }
936  XsGloveSnapshotVariant(XsDataIdentifier id, XsGloveSnapshot const& val) : Variant(id), m_data(val)
937  {
938  }
939  Variant* clone() const override
940  {
941  return new XsGloveSnapshotVariant(dataId(), m_data);
942  }
943 
944  XsGloveSnapshot m_data;
945  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize dSize) override
946  {
947  const uint16_t exactId = XsMessage_getDataShort(&msg, offset - 3);
948  assert(dSize == 255);
949  if (dSize != 255)
950  return 0;
951  memcpy((uint8_t*)&m_data, XsMessage_getDataBuffer(&msg, offset), 255);
952  offset += 255;
953  uint16_t nextId = XsMessage_getDataShort(&msg, offset);
954  assert(nextId == exactId);
955  if (nextId != exactId)
956  return 0;
957  dSize = XsMessage_getDataByte(&msg, offset + 2);
958  assert(dSize == 124);
959  if (dSize != 124)
960  return 0;
961  offset += 3;
962  memcpy(((uint8_t*)&m_data) + 255, XsMessage_getDataBuffer(&msg, offset), 124);
963 
964  // loop over finger / struct and swap bytes
965  m_data.m_frameNumber = (uint32_t)swapEndian32(m_data.m_frameNumber);
966  m_data.m_validSampleFlags = (uint16_t)swapEndian16(m_data.m_validSampleFlags);
967 
968  for (int i = 0; i < 12; ++i)
969  {
970  for (int j = 0; j < 3; ++j)
971  {
972  {
973  auto tmp = m_data.m_fingers[i].m_iV[j];
974  m_data.m_fingers[i].m_iV[j] = (int32_t)swapEndian32(tmp);
975  }
976  {
977  auto tmp = m_data.m_fingers[i].m_mag[j];
978  m_data.m_fingers[i].m_mag[j] = (int16_t)swapEndian16(tmp);
979  }
980  }
981  {
982  auto tmp = m_data.m_fingers[i].m_flags;
983  m_data.m_fingers[i].m_flags = swapEndian16(tmp);
984  }
985  }
986 
987  return 255 + 124 + 3;
988  }
989  void writeToMessage(XsMessage& msg, XsSize offset) const override
990  {
991  assert(0); //not expected to be called
992  XsMessage_setDataLong(&msg, m_data.m_frameNumber, offset);
993  }
994 
995  XsSize sizeInMsg() const override
996  {
997  return sizeof(XsGloveSnapshot);
998  }
999 };
1000 
1002 struct XsGloveDataVariant : public Variant
1003 {
1005  XsGloveDataVariant(XsDataIdentifier id) : Variant(id), m_data() {}
1007  XsGloveDataVariant(XsDataIdentifier id, XsGloveData const& val) : Variant(id), m_data(val) {}
1008  Variant* clone() const override
1009  {
1010  return new XsGloveDataVariant(dataId(), m_data);
1011  }
1012 
1013  XsGloveData m_data;
1014  XsSize readFromMessage(XsMessage const& msg, XsSize offset, XsSize sz) override
1015  {
1016  assert(0); //not expected to be called
1017  XsMessage_getDataLong(&msg, offset);
1018  return sz;
1019  }
1020  void writeToMessage(XsMessage& msg, XsSize offset) const override
1021  {
1022  assert(0); //not expected to be called
1023  XsMessage_setDataLong(&msg, m_data.frameNumber(), offset);
1024  }
1025 
1026  XsSize sizeInMsg() const override
1027  {
1028  return sizeof(XsGloveData);
1029  }
1030 };
1031 }
1032 
1033 typedef std::map<XsDataIdentifier, XsDataPacket_Private::Variant*> MapType;
1034 
1035 struct DataPacketPrivate : private MapType
1036 {
1037  DataPacketPrivate() : m_refCount(1)
1038  {
1039  ++m_created;
1040  }
1042  ~DataPacketPrivate();
1043  DataPacketPrivate& operator = (const DataPacketPrivate& p);
1044  void erase(XsDataIdentifier id);
1045  void erase(MapType::const_iterator const& it);
1046  MapType::iterator insert(XsDataIdentifier id, XsDataPacket_Private::Variant* var);
1047 
1048  void clear();
1049  void merge(DataPacketPrivate const& other, bool overwrite);
1050 
1051  MapType::const_iterator find(XsDataIdentifier id) const;
1052 
1053  using MapType::begin;
1054  using MapType::end;
1055  using MapType::size;
1056  using MapType::empty;
1057  mutable volatile std::atomic_int m_refCount;
1058  static volatile std::atomic_int m_created;
1059  static volatile std::atomic_int m_destroyed;
1060 
1061  static int creationDiff();
1062 };
1063 
1066 #endif
XsRawGnssPvtData::m_velE
int32_t m_velE
NED east velocity (mm/s)
Definition: xsrawgnsspvtdata.h:178
ST_Awinda
@ ST_Awinda
Definition: xssnapshot.h:89
XsSnapshot::m_mag
int32_t m_mag[3]
The magnetic field.
Definition: xssnapshot.h:102
XsRawGnssSatInfo::m_res2
uint8_t m_res2
Reserved for future use (2)
Definition: xsrawgnsssatinfo.h:145
XsMatrix
A class that represents a matrix of real numbers.
Definition: xsmatrix.h:107
XsVector
A class that represents a vector of real numbers.
Definition: xsvector.h:113
msg
msg
XsScrData::m_mag
XsUShortVector m_mag
The raw magnetometer data.
Definition: xsscrdata.h:83
XsByteArray
A list of uint8_t values.
XsSnapshot::m_type
SnapshotType m_type
The type of the snapshot (Awinda, Full)
Definition: xssnapshot.h:107
XsSnapshot::m_iV
int64_t m_iV[3]
The integrated velocity.
Definition: xssnapshot.h:101
XsSatInfo::m_flags
uint8_t m_flags
Definition: xsrawgnsssatinfo.h:119
XsGloveSnapshot
A container for Glove Snapshot data.
Definition: xsglovesnapshot.h:133
xsrawgnsspvtdata.h
ST_Full
@ ST_Full
Definition: xssnapshot.h:90
XsSnapshot::m_gyrClippingCounter
uint8_t m_gyrClippingCounter
The clipping event counter for the Gyr.
Definition: xssnapshot.h:106
XsRawGnssPvtData::m_gSpeed
int32_t m_gSpeed
2D Ground Speed (mm/s)
Definition: xsrawgnsspvtdata.h:180
XsScrData::m_temp
uint16_t m_temp
The temperature data.
Definition: xsscrdata.h:84
xsquaternion.h
XsSnapshot::m_deviceId
XsDeviceId m_deviceId
The ID of the device that created the data.
Definition: xssnapshot.h:97
XsMessage_getFPValueSize
XSTYPES_DLL_API uint8_t XsMessage_getFPValueSize(XsDataIdentifier id)
XsRawGnssPvtData::m_tAcc
uint32_t m_tAcc
Time accuracy estimate (ns) (UTC)
Definition: xsrawgnsspvtdata.h:148
XsGloveData
A container for glove data.
Definition: xsglovedata.h:214
XsTimeInfo::m_utcOffset
int16_t m_utcOffset
Offset to UTC time in minutes. This value can be added to the stored time to get UTC time.
Definition: xstimeinfo.h:97
XsScrData::m_gyr
XsUShortVector m_gyr
The raw gyroscope data.
Definition: xsscrdata.h:82
XsRawGnssSatInfo::m_itow
uint32_t m_itow
GNSS time of week (ms)
Definition: xsrawgnsssatinfo.h:142
XsRawGnssPvtData::m_hdop
uint16_t m_hdop
Horizontal DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:191
xstimestamp.h
XsGloveSnapshot
struct XsGloveSnapshot XsGloveSnapshot
Definition: xsglovesnapshot.h:151
XsMessage_getDataLongLong
uint64_t XsMessage_getDataLongLong(XsMessage const *thisPtr, XsSize offset)
Returns the long value at offset in the data of the message.
Definition: xsmessage.c:518
XsRawGnssPvtData::m_headMot
int32_t m_headMot
2D Heading of motion (deg) (scaling 1e-5)
Definition: xsrawgnsspvtdata.h:181
XsRawGnssPvtData::m_sec
uint8_t m_sec
Seconds of minute 0..60 (UTC)
Definition: xsrawgnsspvtdata.h:142
xsrange.h
XsSnapshot::m_timestamp
uint64_t m_timestamp
The timestamp.
Definition: xssnapshot.h:99
XsScrData::m_acc
XsUShortVector m_acc
The raw accelerometer data.
Definition: xsscrdata.h:81
XsRawGnssPvtData::m_min
uint8_t m_min
Minute of hour 0..59 (UTC)
Definition: xsrawgnsspvtdata.h:141
XsQuaternion
A class that implements a quaternion.
Definition: xsquaternion.h:102
XsMessage_getDataRealValuesById
void XsMessage_getDataRealValuesById(XsMessage const *thisPtr, XsDataIdentifier dataIdentifier, XsReal *dest, XsSize offset, XsSize numValues)
Return current data values as XsReal, conversion is done automatically based on data identifier.
Definition: xsmessage.c:881
XsRawGnssPvtData::m_lat
int32_t m_lat
Latitude (deg) (scaling 1e-7)
Definition: xsrawgnsspvtdata.h:170
XsTriggerIndicationData::m_polarity
uint8_t m_polarity
The polarity.
Definition: xstriggerindicationdata.h:92
data
data
xssnapshot.h
XsMessage_getDataBuffer
const uint8_t * XsMessage_getDataBuffer(XsMessage const *thisPtr, XsSize offset)
Returns a const pointer to the data buffer of the message.
Definition: xsmessage.c:595
XsRawGnssPvtData
A container for GNSS Position Velocity and Time data.
Definition: xsrawgnsspvtdata.h:134
XsMessage_getDataByte
uint8_t XsMessage_getDataByte(XsMessage const *thisPtr, XsSize offset)
Returns the byte value at offset in the data of the message.
Definition: xsmessage.c:481
XsRawGnssPvtData::m_fixType
uint8_t m_fixType
Definition: xsrawgnsspvtdata.h:150
XsRange
A class whose objects can be used to store a range. It provides method to check whether a value is in...
Definition: xsrange.h:89
XDI_FullTypeMask
@ XDI_FullTypeMask
Mask to get the type of data, without the data format.
Definition: xsdataidentifier.h:88
XsTriggerIndicationData::m_timestamp
uint32_t m_timestamp
The timestamp.
Definition: xstriggerindicationdata.h:93
XsMessage_setDataLongLong
void XsMessage_setDataLongLong(XsMessage *thisPtr, uint64_t value, XsSize offset)
Sets the long at offset in the message to value.
Definition: xsmessage.c:635
XsTriggerIndicationData::m_line
uint8_t m_line
The line number.
Definition: xstriggerindicationdata.h:91
xsrawgnsssatinfo.h
XsMessage_setDataShort
void XsMessage_setDataShort(XsMessage *thisPtr, uint16_t value, XsSize offset)
Sets the short at offset in the message to value.
Definition: xsmessage.c:615
xstriggerindicationdata.h
XsRawGnssPvtData::m_gdop
uint16_t m_gdop
Geometric DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:187
XsRawGnssPvtData::m_pdop
uint16_t m_pdop
Position DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:188
XsRawGnssPvtData::m_velD
int32_t m_velD
NED down velocity (mm/s)
Definition: xsrawgnsspvtdata.h:179
XsRawGnssPvtData::m_vdop
uint16_t m_vdop
Vertical DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:190
xsglovesnapshot.h
XsDataIdentifier
XsDataIdentifier
Defines the data identifiers.
Definition: xsdataidentifier.h:84
XsRawGnssPvtData::m_headAcc
uint32_t m_headAcc
Heading accuracy estimate (both motion and vehicle) (deg) (scaling 1-e5)
Definition: xsrawgnsspvtdata.h:184
uint32_t
unsigned int uint32_t
Definition: pstdint.h:485
XsMessage_setDataBuffer
void XsMessage_setDataBuffer(XsMessage *thisPtr, const uint8_t *buffer, XsSize size, XsSize offset)
Puts size number of bytes from buffer into the message at offset.
Definition: xsmessage.c:731
XsRawGnssPvtData::m_hMsl
int32_t m_hMsl
Height above mean sea level (mm)
Definition: xsrawgnsspvtdata.h:172
XsTriggerIndicationData
Data for a trigger indication message.
Definition: xstriggerindicationdata.h:89
XsReal
double XsReal
Defines the floating point type used by the Xsens libraries.
Definition: xstypedefs.h:73
XsUShortVector
A vector containing 3 short values.
Definition: xsushortvector.h:77
XsRawGnssSatInfo
A container for GNSS Satellite Information.
Definition: xsrawgnsssatinfo.h:140
XsRawGnssPvtData::m_valid
uint8_t m_valid
Definition: xsrawgnsspvtdata.h:143
XsTimeInfo::m_nano
uint32_t m_nano
Nanosecond part of the time.
Definition: xstimeinfo.h:89
swapEndian32
#define swapEndian32(src)
Definition: xsmessage.h:722
DataPacketPrivate
struct XSNOEXPORT DataPacketPrivate
Definition: xsdatapacket.h:101
XsSnapshot::m_status
uint16_t m_status
The clipping flags of the latest interval
Definition: xssnapshot.h:104
XsMessage_setDataLong
void XsMessage_setDataLong(XsMessage *thisPtr, uint32_t value, XsSize offset)
Sets the long at offset in the message to value.
Definition: xsmessage.c:625
xsmatrix3x3.h
XsRawGnssPvtData::m_year
uint16_t m_year
Year (UTC)
Definition: xsrawgnsspvtdata.h:137
XsSize
size_t XsSize
XsSize must be unsigned number!
Definition: xstypedefs.h:74
XsMatrix3x3
A class that represents a fixed size (3x3) matrix.
Definition: xsmatrix3x3.h:95
XsRawGnssPvtData::m_itow
uint32_t m_itow
GNSS time of week (ms)
Definition: xsrawgnsspvtdata.h:136
XsRawGnssPvtData::m_numSv
uint8_t m_numSv
Number of satellites used in Nav Solution.
Definition: xsrawgnsspvtdata.h:167
XsRawGnssPvtData::m_res1
uint8_t m_res1
Reserved for future use (1)
Definition: xsrawgnsspvtdata.h:168
xsdeviceid.h
xstimeinfo.h
XsMessage
Structure for storing a single message.
Definition: xsmessage.h:202
xsscrdata.h
XsTimeInfo::m_month
uint8_t m_month
The month (if date is valid)
Definition: xstimeinfo.h:91
XsRawGnssPvtData::m_vAcc
uint32_t m_vAcc
Vertical accuracy estimate (mm)
Definition: xsrawgnsspvtdata.h:175
XsSatInfo::m_gnssId
uint8_t m_gnssId
GNSS identifier.
Definition: xsrawgnsssatinfo.h:116
XsRawGnssPvtData::m_edop
uint16_t m_edop
Easting DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:193
XsTimeInfo::m_year
uint16_t m_year
The year (if date is valid)
Definition: xstimeinfo.h:90
xsglovedata.h
XsRawGnssPvtData::m_flags
uint8_t m_flags
Definition: xsrawgnsspvtdata.h:159
XsRawGnssPvtData::m_headVeh
int32_t m_headVeh
2D Heading of vehicle (deg) (scaling 1e-5)
Definition: xsrawgnsspvtdata.h:185
XsRawGnssPvtData::m_hour
uint8_t m_hour
Hour of day 0..23 (UTC)
Definition: xsrawgnsspvtdata.h:140
XsMessage_setDataByte
void XsMessage_setDataByte(XsMessage *thisPtr, uint8_t value, XsSize offset)
Set the byte at offset in the message to value.
Definition: xsmessage.c:605
XsScrData
Container for raw sensor measurement data.
Definition: xsscrdata.h:79
XsMessage_getDataLong
uint32_t XsMessage_getDataLong(XsMessage const *thisPtr, XsSize offset)
Returns the long value at offset in the data of the message.
Definition: xsmessage.c:505
xsmessage.h
XsSnapshot
A container for Snapshot data.
Definition: xssnapshot.h:95
XsRawGnssPvtData::m_lon
int32_t m_lon
Longitude (deg) (scaling 1e-7)
Definition: xsrawgnsspvtdata.h:169
XsRawGnssPvtData::m_day
uint8_t m_day
Day of Month (UTC)
Definition: xsrawgnsspvtdata.h:139
XsSatInfo::m_cno
uint8_t m_cno
Carrier to noise ratio (signals strength)
Definition: xsrawgnsssatinfo.h:118
XsRawGnssPvtData::m_tdop
uint16_t m_tdop
Time DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:189
XsRawGnssSatInfo::m_numSvs
uint8_t m_numSvs
Number of satellites.
Definition: xsrawgnsssatinfo.h:143
XsRawGnssPvtData::m_height
int32_t m_height
Height above ellipsoid (mm)
Definition: xsrawgnsspvtdata.h:171
XsRawGnssPvtData::m_sAcc
uint32_t m_sAcc
Speed accuracy estimate (mm/s)
Definition: xsrawgnsspvtdata.h:183
int32_t
signed int int32_t
Definition: pstdint.h:515
XsSnapshot::m_iQ
int32_t m_iQ[4]
The integrated orientation.
Definition: xssnapshot.h:100
xseuler.h
XsRawGnssPvtData::m_velN
int32_t m_velN
NED north velocity (mm/s)
Definition: xsrawgnsspvtdata.h:177
XsEuler
Contains Euler Angle data and conversion from Quaternion.
Definition: xseuler.h:92
xsushortvector.h
XsRawGnssSatInfo::m_satInfos
XsSatInfo m_satInfos[60]
The information of all satellites, maximum 60.
Definition: xsrawgnsssatinfo.h:148
xsvector3.h
XsVector3
A class that represents a fixed size (3) vector.
Definition: xsvector3.h:95
xsbytearray.h
XsSnapshot::m_baro
int32_t m_baro
The barometric pressure.
Definition: xssnapshot.h:103
XsRawGnssSatInfo::m_res3
uint8_t m_res3
Reserved for future use (3)
Definition: xsrawgnsssatinfo.h:146
XsRawGnssPvtData::m_hAcc
uint32_t m_hAcc
Horizontal accuracy estimate (mm)
Definition: xsrawgnsspvtdata.h:174
swapEndian16
#define swapEndian16(src)
Definition: xsmessage.h:721
XsTriggerIndicationData::m_frameNumber
uint16_t m_frameNumber
The frame number.
Definition: xstriggerindicationdata.h:94
XsSatInfo::m_svId
uint8_t m_svId
Satellite identifier.
Definition: xsrawgnsssatinfo.h:117
XsMessage_setDataRealValuesById
void XsMessage_setDataRealValuesById(XsMessage *thisPtr, XsDataIdentifier dataIdentifier, XsReal const *data, XsSize offset, XsSize numValues)
Write a number of floating/fixed point values into to the data buffer, conversion depends on data ide...
Definition: xsmessage.c:938
XsSnapshot::m_accClippingCounter
uint8_t m_accClippingCounter
The clipping event counter for the Acc.
Definition: xssnapshot.h:105
XsRawGnssSatInfo::m_res1
uint8_t m_res1
Reserved for future use (1)
Definition: xsrawgnsssatinfo.h:144
XsRawGnssPvtData::m_month
uint8_t m_month
Month (UTC)
Definition: xsrawgnsspvtdata.h:138
XsRawGnssPvtData::m_nano
int32_t m_nano
Fraction of second (ns) -1e9..1e9 (UTC)
Definition: xsrawgnsspvtdata.h:149
XsGloveData
struct XsGloveData XsGloveData
Definition: xsglovedata.h:315
XsRawGnssPvtData::m_ndop
uint16_t m_ndop
Northing DOP (scaling 0.01)
Definition: xsrawgnsspvtdata.h:192
XsSnapshot::m_frameNumber
uint32_t m_frameNumber
The frame.
Definition: xssnapshot.h:98
XsMessage_getDataShort
uint16_t XsMessage_getDataShort(XsMessage const *thisPtr, XsSize offset)
Returns the short value at offset in the data of the message.
Definition: xsmessage.c:492
XsTimeInfo
A structure for storing Time values.
Definition: xstimeinfo.h:87


xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20