65 #ifndef DATAPACKET_P_H
66 #define DATAPACKET_P_H
91 namespace XsDataPacket_Private
105 virtual XsSize sizeInMsg()
const = 0;
110 virtual Variant* clone()
const = 0;
125 template <
typename U>
128 U* ptr =
dynamic_cast<U*
>(
this);
134 template <
typename U>
135 U
const& toDerived()
const
137 U
const* ptr =
dynamic_cast<U const*
>(
this);
147 template <
typename T,
int C = 1>
148 class GenericVariant :
public Variant
157 msg.getData<T>(
data(), dataId(), offset, C);
163 msg.setData<T>(constData(), dataId(), offset, C);
166 virtual T*
data() = 0;
168 virtual T
const* constData()
const = 0;
171 XsSize sizeInMsg()
const override
173 return (
XsSize)(ptrdiff_t) XsMessage::sizeInMsg<T>(dataId(), C);
189 inline void GenericVariant<uint64_t, 1>::writeToMessage(
XsMessage& msg,
XsSize offset)
const
196 template <
typename T>
197 struct SimpleVariant :
public GenericVariant<T, 1>
199 using GenericVariant<T, 1>::dataId;
204 SimpleVariant(
XsDataIdentifier id, T
const& val) : GenericVariant<T, 1>(id), m_data(val) {}
213 T
const* constData()
const override
222 Variant* clone()
const override
224 return new SimpleVariant<T>(dataId(), m_data);
228 XsSize sizeInMsg()
const override
230 return XsMessage::sizeInMsg<T>(dataId(), 1);
235 template <
typename U,
typename T,
int C>
236 struct ComplexVariant :
public GenericVariant<T, C>
238 using GenericVariant<T, C>::dataId;
242 ComplexVariant(
XsDataIdentifier id, U
const& val) : GenericVariant<T, C>(id), m_data(val) {}
248 return const_cast<T*
>(m_data.data());
251 T
const* constData()
const override
253 return m_data.data();
260 Variant* clone()
const override
262 return new ComplexVariant<U, T, C>(dataId(), m_data);
267 struct XsQuaternionVariant :
public ComplexVariant<XsQuaternion, XsReal, 4>
274 Variant* clone()
const override
276 return new XsQuaternionVariant(dataId(), m_data);
281 struct XsUShortVectorVariant :
public ComplexVariant<XsUShortVector, uint16_t, 3>
287 Variant* clone()
const override
289 return new XsUShortVectorVariant(dataId(), m_data);
294 struct XsVector3Variant :
public ComplexVariant<XsVector3, XsReal, 3>
301 assert(val.size() == 3);
303 Variant* clone()
const override
305 return new XsVector3Variant(dataId(), m_data);
310 struct XsVector2Variant :
public ComplexVariant<XsVector, XsReal, 2>
317 assert(val.size() == 2);
319 Variant* clone()
const override
321 return new XsVector2Variant(dataId(), m_data);
326 struct XsScrDataVariant :
public Variant
332 Variant* clone()
const override
334 return new XsScrDataVariant(dataId(), m_data);
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);
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);
360 XsSize sizeInMsg()
const override
362 return 10 *
sizeof(uint16_t);
367 struct XsTriggerIndicationDataVariant :
public Variant
373 Variant* clone()
const override
375 return new XsTriggerIndicationDataVariant(dataId(), m_data);
395 XsSize sizeInMsg()
const override
402 struct XsEulerVariant :
public ComplexVariant<XsEuler, XsReal, 3>
408 Variant* clone()
const override
410 return new XsEulerVariant(dataId(), m_data);
415 struct XsMatrixVariant :
public ComplexVariant<XsMatrix3x3, XsReal, 9>
421 Variant* clone()
const override
423 return new XsMatrixVariant(dataId(), m_data);
430 for (
int i = 0 ; i < 3 ; ++i)
431 for (
XsSize j = 0 ; j < 3 ; ++j, k += ds)
439 for (
int i = 0 ; i < 3 ; ++i)
440 for (
XsSize j = 0 ; j < 3 ; ++j, k += ds)
446 struct XsRangeVariant :
public Variant
452 Variant* clone()
const override
454 return new XsRangeVariant(dataId(), m_data);
463 m_data.setRange(first, (
int)((uint16_t)(last - first)) + (
int)first);
472 XsSize sizeInMsg()
const override
479 struct XsTimeInfoVariant :
public Variant
485 Variant* clone()
const override
487 return new XsTimeInfoVariant(dataId(), m_data);
497 uint8_t* bareByte = (uint8_t*) &m_data.
m_month;
498 for (
XsSize i = 0; i < 6; ++i)
511 uint8_t
const* bareByte = (uint8_t
const*) &m_data.
m_month;
512 for (
XsSize i = 0; i < 6; ++i)
518 XsSize sizeInMsg()
const override
525 struct XsRawGnssPvtDataVariant :
public Variant
531 Variant* clone()
const override
533 return new XsRawGnssPvtDataVariant(dataId(), m_data);
615 XsSize sizeInMsg()
const override
622 struct XsRawGnssSatInfoVariant :
public Variant
628 Variant* clone()
const override
630 return new XsRawGnssSatInfoVariant(dataId(), m_data);
643 for (uint8_t i = 0; i < m_data.
m_numSvs; ++i)
662 for (uint8_t i = 0; i < m_data.
m_numSvs; ++i)
672 XsSize sizeInMsg()
const override
679 struct XsFullSnapshotVariant :
public Variant
686 Variant* clone()
const override
688 return new XsFullSnapshotVariant(dataId(), m_data);
698 for (
int i = 0; i < 4; ++i, offset += 4)
700 for (
int i = 0; i < 3; ++i, offset += 8)
702 for (
int i = 0; i < 3; ++i, offset += 4)
723 for (
int i = 0; i < 4; ++i, offset += 4)
725 for (
int i = 0; i < 3; ++i, offset += 8)
727 for (
int i = 0; i < 3; ++i, offset += 4)
739 XsSize sizeInMsg()
const override
746 struct XsAwindaSnapshotVariant :
public Variant
758 Variant* clone()
const override
760 return new XsAwindaSnapshotVariant(dataId(), m_data);
770 for (
int i = 0; i < 3; ++i, offset += 4)
772 for (
int i = 0; i < 3; ++i, offset += 4)
774 for (
int i = 0; i < 3; ++i, offset += 2)
793 for (
int i = 0; i < 3; ++i, offset += 4)
795 for (
int i = 0; i < 3; ++i, offset += 4)
797 for (
int i = 0; i < 3; ++i, offset += 2)
808 XsSize sizeInMsg()
const override
815 struct XsByteArrayVariant :
public Variant
825 Variant* clone()
const override
827 return new XsByteArrayVariant(dataId(), m_data);
853 if (sOffset >= msgSize)
856 if (nextId != exactId)
862 m_data.setSize(tSize);
871 if (offset >= msgSize)
877 if (nextId != exactId)
903 if (m_data.size() < 255)
908 XsSize remainingSize = m_data.size();
909 while (remainingSize >= 255)
914 remainingSize -= 255;
922 XsSize sizeInMsg()
const override
924 return m_data.size();
929 struct XsGloveSnapshotVariant :
public Variant
939 Variant* clone()
const override
941 return new XsGloveSnapshotVariant(dataId(), m_data);
948 assert(dSize == 255);
954 assert(nextId == exactId);
955 if (nextId != exactId)
958 assert(dSize == 124);
966 m_data.m_validSampleFlags = (uint16_t)
swapEndian16(m_data.m_validSampleFlags);
968 for (
int i = 0; i < 12; ++i)
970 for (
int j = 0; j < 3; ++j)
973 auto tmp = m_data.m_fingers[i].m_iV[j];
977 auto tmp = m_data.m_fingers[i].m_mag[j];
978 m_data.m_fingers[i].m_mag[j] = (int16_t)
swapEndian16(tmp);
982 auto tmp = m_data.m_fingers[i].m_flags;
987 return 255 + 124 + 3;
995 XsSize sizeInMsg()
const override
1002 struct XsGloveDataVariant :
public Variant
1008 Variant* clone()
const override
1010 return new XsGloveDataVariant(dataId(), m_data);
1026 XsSize sizeInMsg()
const override
1033 typedef std::map<XsDataIdentifier, XsDataPacket_Private::Variant*> MapType;
1045 void erase(MapType::const_iterator
const& it);
1046 MapType::iterator insert(
XsDataIdentifier id, XsDataPacket_Private::Variant* var);
1053 using MapType::begin;
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;
1061 static int creationDiff();