xsmessage.c
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 #include "xsmessage.h"
66 #include <stdlib.h>
67 #include <memory.h> // memset
68 #include "xsbusid.h"
69 #include <stdio.h>
70 
72 // Field message indices
73 #define XS_IND_PREAMBLE 0
74 #define XS_IND_BID 1
75 #define XS_IND_MID 2
76 #define XS_IND_LEN 3
77 #define XS_IND_DATA0 4
78 #define XS_IND_LENEXTH 4
79 #define XS_IND_LENEXTL 5
80 #define XS_IND_DATAEXT0 6
81 
82 #define XS_SELFTEST_OK 0x1FF
83 
84 // message data lengths
85 #define XS_LEN_TRANSPORTMODE 1
86 #define XS_LEN_DEVICEID 4
87 #define XS_LEN_INITBUSRESULTS 4
88 #define XS_LEN_PERIOD 2
89 #define XS_LEN_BUSPWR 2
90 #define XS_LEN_DATALENGTH 2
91 #define XS_LEN_CONFIGURATION 118
92 #define XS_LEN_FIRMWAREREV 3
93 #define XS_LEN_BTDISABLE 1
94 #define XS_LEN_OPMODE 1
95 #define XS_LEN_BAUDRATE 1
96 #define XS_LEN_SYNCMODE 1
97 #define XS_LEN_PRODUCTCODE 20
98 #define XS_LEN_PROCESSINGFLAGS 2
99 #define XS_LEN_XMPWROFF 0
100 #define XS_LEN_OUTPUTMODE 2
101 #define XS_LEN_OUTPUTSETTINGS 4
102 #define XS_LEN_OUTPUTSKIPFACTOR 2
103 #define XS_LEN_SYNCINMODE 2
104 #define XS_LEN_SYNCINSKIPFACTOR 2
105 #define XS_LEN_SYNCINOFFSET 4
106 #define XS_LEN_SYNCOUTMODE 2
107 #define XS_LEN_SYNCOUTSKIPFACTOR 2
108 #define XS_LEN_SYNCOUTOFFSET 4
109 #define XS_LEN_SYNCOUTPULSEWIDTH 4
110 #define XS_LEN_ERRORMODE 2
111 #define XS_LEN_TRANSMITDELAY 2
112 #define XS_LEN_OBJECTALIGNMENT 36
113 #define XS_LEN_XMERRORMODE 2
114 #define XS_LEN_BUFFERSIZE 2
115 #define XS_LEN_HEADING 4
116 #define XS_LEN_MAGNETICFIELD 12
117 #define XS_LEN_LOCATIONID 2
118 #define XS_LEN_EXTOUTPUTMODE 2
119 #define XS_LEN_INITTRACKMODE 2
120 #define XS_LEN_STOREFILTERSTATE 0
121 #define XS_LEN_UTCTIME 12
122 #define XS_LEN_FILTERPROFILELABEL 20
123 #define XS_LEN_FILTERPROFILEFULL (1+1+XS_LEN_FILTERPROFILELABEL)
124 #define XS_LEN_AVAILABLEFILTERPROFILES (XS_MAX_FILTERPROFILES_IN_MT*XS_LEN_FILTERPROFILEFULL)
125 #define XS_LEN_REQFILTERPROFILEACK 2
126 #define XS_LEN_SETFILTERPROFILE 2
127 #define XS_LEN_GRAVITYMAGNITUDE 4
128 #define XS_LEN_GNSSLEVERARM 12
129 #define XS_LEN_LATLONALT 18
130 #define XS_LEN_SETNOROTATION 2
131 #define XS_LEN_FILTERSETTINGS 4
132 #define XS_LEN_AMD 2
133 #define XS_LEN_RESETORIENTATION 2
134 #define XS_LEN_GNSSSTATUS (1+5*16)
135 #define XS_LEN_CLIENTUSAGE 1
136 #define XS_LEN_CLIENTPRIORITY 1
137 #define XS_LEN_WIRELESSCONFIG 6
138 #define XS_LEN_INFOREQUEST 1
139 #define XS_LEN_SETOUTPUTTRIGGER 10
140 #define XS_LEN_SETINPUTTRIGGER 10
141 
142 // MTData defines
143 // Length of data blocks in bytes
144 #define XS_LEN_RAWDATA 20
145 #define XS_LEN_CALIBDATA 36
146 #define XS_LEN_CALIB_ACCDATA 12
147 #define XS_LEN_CALIB_GYRDATA 12
148 #define XS_LEN_CALIB_MAGDATA 12
149 #define XS_LEN_ORIENT_QUATDATA 16
150 #define XS_LEN_ORIENT_EULERDATA 12
151 #define XS_LEN_ORIENT_MATRIXSTA 36
152 #define XS_LEN_SAMPLECNT 2
153 #define XS_LEN_TEMPDATA 4
154 
155 // Length of data blocks in floats
156 #define XS_LEN_CALIBDATA_FLT 9
157 #define XS_LEN_TEMPDATA_FLT 1
158 #define XS_LEN_ORIENT_QUATDATA_FLT 4
159 #define XS_LEN_ORIENT_EULERDATA_FLT 3
160 #define XS_LEN_ORIENT_MATRIXSTA_FLT 9
161 
162 #pragma pack(push, 1)
163 // little endian
164 union Itypes
165 {
166  int64_t i64;
167  struct
168  {
170  } i32;
171  struct
172  {
173  int16_t s3, s2, s1, s0;
174  } i16;
175  struct
176  {
177  signed char b7, b6, b5, b4, b3, b2, b1, b0;
178  } i8;
179 
180  double d;
181  struct
182  {
183  float f1, f0;
184  } f32;
185 };
186 #pragma pack(pop)
187 
188 
193 typedef union Itypes Itypes;
194 
201 uint8_t byteSum(const uint8_t* buffer, XsSize count)
202 {
203  register uint8_t sum = 0;
204  for (; count; --count, sum += *(buffer++));
205  return sum;
206 }
207 
209 static inline uint8_t* XsMessage_dataAtOffset(XsMessage* thisPtr, XsSize offset)
210 {
211  XsMessageHeader* hdr;
212 
213  assert(thisPtr->m_message.m_data);
214  assert(offset < XsMessage_dataSize(thisPtr));
215 
216  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
217  if (hdr->m_length != 255)
218  return hdr->m_datlen.m_data + offset;
219  return hdr->m_datlen.m_extended.m_data + offset;
220 }
221 
223 static inline const uint8_t* XsMessage_cdataAtOffset(XsMessage const* thisPtr, XsSize offset)
224 {
225  return XsMessage_dataAtOffset((XsMessage*)thisPtr, offset);
226 }
227 
229 static inline void XsMessage_ensureDataSize(XsMessage* thisPtr, XsSize offset, XsSize sizeofValue)
230 {
231  if (XsMessage_dataSize(thisPtr) < offset + sizeofValue)
232  XsMessage_resizeData(thisPtr, offset + sizeofValue);
233 }
234 
236 static inline void XsMessage_updateChecksumWithValue(XsMessage* thisPtr, const void* value, XsSize sizeofValue, XsSize offset)
237 {
238  if (thisPtr->m_autoUpdateChecksum)
239  {
240  thisPtr->m_checksum[0] += byteSum(XsMessage_getDataBuffer(thisPtr, offset), sizeofValue);
241  thisPtr->m_checksum[0] -= byteSum(value, sizeofValue);
242  }
243 }
244 
246 static inline void swapEndian(void* data, const XsSize size)
247 {
248  switch (size)
249  {
250  case sizeof(char):
251  break;
252  case sizeof(uint16_t):
253  {
254  uint16_t i16;
255  memcpy((void*)&i16, data, sizeof(uint16_t));
256  i16 = swapEndian16(i16);
257  memcpy(data, (void*)&i16, sizeof(uint16_t));
258  break;
259  }
260  case sizeof(uint32_t):
261  {
262  uint32_t i32;
263  memcpy((void*)&i32, data, sizeof(uint32_t));
264  i32 = swapEndian32(i32);
265  memcpy(data, (void*)&i32, sizeof(uint32_t));
266  break;
267  }
268  case sizeof(uint64_t):
269  {
270  uint64_t i64;
271  memcpy((void*)&i64, data, sizeof(uint64_t));
272  i64 = swapEndian64(i64);
273  memcpy(data, (void*)&i64, sizeof(uint64_t));
274  break;
275  }
276  default:
277  assert(0);
278  }
279 }
280 
286 void XsMessage_getEndianCorrectData(XsMessage const* thisPtr, void* value, XsSize size, XsSize offset)
287 {
288  memcpy(value, (void const*) XsMessage_cdataAtOffset(thisPtr, offset), size);
289  swapEndian(value, size);
290 }
291 
297 void XsMessage_setEndianCorrectData(XsMessage* thisPtr, void const* value, XsSize size, XsSize offset)
298 {
299  void* dest;
300  XsMessage_ensureDataSize(thisPtr, offset, size);
301  XsMessage_updateChecksumWithValue(thisPtr, value, size, offset);
302  dest = XsMessage_dataAtOffset(thisPtr, offset);
303  memcpy(dest, value, size);
304  swapEndian(dest, size);
305 }
306 
311 void XsMessage_constructSized(XsMessage* thisPtr, XsSize dataSize)
312 {
313  XsSize msgSize;
314  XsMessageHeader* hdr;
315 
316  if (dataSize < 255)
317  msgSize = dataSize + 5;
318  else
319  msgSize = dataSize + 7;
320 
321  XsByteArray_construct(&thisPtr->m_message, msgSize, 0);
322  memset(thisPtr->m_message.m_data, 0, msgSize);
323  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
324  hdr->m_preamble = XS_PREAMBLE;
325  hdr->m_messageId = 0;
326  hdr->m_busId = XS_BID_MASTER;
327 
328  if (dataSize < XS_EXTLENCODE)
329  {
330  hdr->m_length = (uint8_t) dataSize;
331  *((uint8_t**) &thisPtr->m_checksum) = &hdr->m_datlen.m_data[dataSize];
332  thisPtr->m_checksum[0] = (uint8_t) - (int8_t)(uint8_t)dataSize;
333  }
334  else
335  {
336  hdr->m_length = XS_EXTLENCODE;
337  hdr->m_datlen.m_extended.m_length.m_high = (uint8_t)(dataSize >> 8);
338  hdr->m_datlen.m_extended.m_length.m_low = (uint8_t) dataSize;
339  *((uint8_t**) &thisPtr->m_checksum) = &hdr->m_datlen.m_extended.m_data[dataSize];
340  thisPtr->m_checksum[0] = (uint8_t) - (hdr->m_datlen.m_extended.m_length.m_high + hdr->m_datlen.m_extended.m_length.m_low + XS_EXTLENCODE);
341  }
342  thisPtr->m_checksum[0] -= hdr->m_busId;
343 }
344 
348 {
349  XsMessage_constructSized(thisPtr, 0);
350 }
351 
355 void XsMessage_copyConstruct(XsMessage* thisPtr, XsMessage const* src)
356 {
357  if (!src)
358  XsMessage_construct(thisPtr);
359  else
360  {
361  XsMessageHeader* hdr;
362  XsSize dataSize;
363  XsArray_copyConstruct(&thisPtr->m_message, &src->m_message);
365  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
366  dataSize = XsMessage_dataSize(thisPtr);
367  if (dataSize >= 255)
368  *((uint8_t**) &thisPtr->m_checksum) = &hdr->m_datlen.m_extended.m_data[dataSize];
369  else
370  *((uint8_t**) &thisPtr->m_checksum) = &hdr->m_datlen.m_data[dataSize];
371  }
372 }
373 
377 void XsMessage_assign(XsMessage* thisPtr, XsSize dataSize)
378 {
379  XsMessage_destruct(thisPtr);
380  XsMessage_constructSized(thisPtr, dataSize);
381 }
382 
388 void XsMessage_load(XsMessage* thisPtr, XsSize msgSize, unsigned char const* src)
389 {
390  XsByteArray_construct(&thisPtr->m_message, msgSize, src);
391  *((uint8_t**) &thisPtr->m_checksum) = &thisPtr->m_message.m_data[XsMessage_getTotalMessageSize(thisPtr) - 1];
392 }
393 
398 {
399  XsArray_destruct(&thisPtr->m_message);
400  *((uint8_t**) &thisPtr->m_checksum) = 0;
401 }
402 
406 void XsMessage_copy(XsMessage* copy, XsMessage const* thisPtr)
407 {
408  XsArray_copy(&copy->m_message, &thisPtr->m_message);
409  *((uint8_t**) &copy->m_checksum) = &copy->m_message.m_data[XsMessage_getTotalMessageSize(copy) - 1];
411 }
412 
417 {
418  XsMessageHeader const* hdr;
419 
420  if (!thisPtr->m_message.m_data)
421  return 0;
422 
423  hdr = (XsMessageHeader const*)(void const*) thisPtr->m_message.m_data;
424  if (hdr->m_length == 255)
425  return (((XsSize) hdr->m_datlen.m_extended.m_length.m_high) << 8) + hdr->m_datlen.m_extended.m_length.m_low;
426  else
427  return ((XsSize) hdr->m_length);
428 }
429 
436 const uint8_t* XsMessage_constData(XsMessage const* thisPtr, XsSize offset)
437 {
438  if (!thisPtr->m_message.m_data)
439  return 0;
440  return XsMessage_cdataAtOffset(thisPtr, offset);
441 }
442 
448 const uint8_t* XsMessage_getMessageStart(XsMessage const* thisPtr)
449 {
450  return thisPtr->m_message.m_data;
451 }
452 
462 {
463  XsMessageHeader* hdr;
464 
465  if (!thisPtr->m_message.m_data)
466  return 0;
467 
468  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
469  if (hdr->m_length == 255)
470  return (((XsSize) hdr->m_datlen.m_extended.m_length.m_high) << 8) + hdr->m_datlen.m_extended.m_length.m_low + 7;
471  else
472  return ((XsSize) hdr->m_length) + 5;
473 }
474 
481 uint8_t XsMessage_getDataByte(XsMessage const* thisPtr, XsSize offset)
482 {
483  return *XsMessage_cdataAtOffset(thisPtr, offset);
484 }
485 
492 uint16_t XsMessage_getDataShort(XsMessage const* thisPtr, XsSize offset)
493 {
494  uint16_t ret;
495  XsMessage_getEndianCorrectData(thisPtr, &ret, sizeof(ret), offset);
496  return ret;
497 }
498 
506 {
507  uint32_t ret;
508  XsMessage_getEndianCorrectData(thisPtr, &ret, sizeof(ret), offset);
509  return ret;
510 }
511 
518 uint64_t XsMessage_getDataLongLong(XsMessage const* thisPtr, XsSize offset)
519 {
520  uint64_t ret;
521  XsMessage_getEndianCorrectData(thisPtr, &ret, sizeof(ret), offset);
522  return ret;
523 }
524 
531 float XsMessage_getDataFloat(XsMessage const* thisPtr, XsSize offset)
532 {
533  float ret;
534  XsMessage_getEndianCorrectData(thisPtr, &ret, sizeof(ret), offset);
535  return ret;
536 }
537 
543 double XsMessage_getDataDouble(XsMessage const* thisPtr, XsSize offset)
544 {
545  double ret;
546  XsMessage_getEndianCorrectData(thisPtr, &ret, sizeof(ret), offset);
547  return ret;
548 }
549 
555 double XsMessage_getDataF1220(XsMessage const* thisPtr, XsSize offset)
556 {
557  int32_t tmp;
558  Itypes rv;
559  tmp = (int32_t) XsMessage_getDataLong(thisPtr, offset);
560 
561  rv.d = ((double) tmp) / 1048576.0;
562  rv.i64 = (rv.i64 & ~1LL) | (tmp & 1);
563  return rv.d;
564 }
565 
571 double XsMessage_getDataFP1632(XsMessage const* thisPtr, XsSize offset)
572 {
573  int16_t fpint;
574  int32_t fpfrac;
575  Itypes fp, rv;
576 
577  fpfrac = (int32_t) XsMessage_getDataLong(thisPtr, offset);
578  fpint = (int16_t) XsMessage_getDataShort(thisPtr, offset + 4);
579 
580  fp.i32.i0 = fpint;
581  fp.i32.i1 = fpfrac;
582 
583  rv.d = (double) fp.i64 / 4294967296.0;
584  rv.i64 = (rv.i64 & ~1LL) | (fpfrac & 1);
585  return rv.d;
586 }
587 
595 const uint8_t* XsMessage_getDataBuffer(XsMessage const* thisPtr, XsSize offset)
596 {
597  return XsMessage_constData(thisPtr, offset);
598 }
599 
605 void XsMessage_setDataByte(XsMessage* thisPtr, uint8_t value, XsSize offset)
606 {
607  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
608 }
609 
615 void XsMessage_setDataShort(XsMessage* thisPtr, uint16_t value, XsSize offset)
616 {
617  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
618 }
619 
625 void XsMessage_setDataLong(XsMessage* thisPtr, uint32_t value, XsSize offset)
626 {
627  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
628 }
629 
635 void XsMessage_setDataLongLong(XsMessage* thisPtr, uint64_t value, XsSize offset)
636 {
637  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
638 }
639 
640 
646 void XsMessage_setDataFloat(XsMessage* thisPtr, float value, XsSize offset)
647 {
648  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
649 }
650 
656 void XsMessage_setDataDouble(XsMessage* thisPtr, double value, XsSize offset)
657 {
658  XsMessage_setEndianCorrectData(thisPtr, &value, sizeof(value), offset);
659 }
660 
666 void XsMessage_setDataF1220(XsMessage* thisPtr, double value, XsSize offset)
667 {
668  Itypes fp;
669  uint32_t val;
670 
671  fp.d = value;
672  val = (uint32_t)(int32_t)(value * 1048576.0);
673 
674  XsMessage_setDataLong(thisPtr, (val & ~1UL) | (fp.i64 & 1), offset);
675 }
676 
682 void XsMessage_setDataFP1632(XsMessage* thisPtr, double value, XsSize offset)
683 {
684  Itypes fp;
685  int16_t fpint;
686  int32_t fpfrac;
687  int32_t dexp;
688  uint32_t b;
689 
690  fp.d = value;
691  b = (uint32_t)(fp.i64 & 1);
692  dexp = ((fp.i32.i0 & (0x7fffffffL)) >> 20) - 1023;
693 
694  if (dexp <= 14)
695  {
696  fp.i16.s0 = (fp.i16.s0 & 0x000F) | 0x0010;
697  if (value < 0)
698  fp.i64 = -fp.i64;
699  if (dexp > -32)
700  fp.i64 = fp.i64 >> (20 - dexp); // 52-32 - exponent
701  else
702  fp.i64 = fp.i64 >> 52; // this could be optimized?
703  fpint = fp.i16.s1;
704  fpfrac = fp.i32.i1;
705  }
706  else
707  {
708  if (value < 0)
709  {
710  fpint = ((int16_t)(uint16_t)(0x8000));
711  fpfrac = 0;
712  }
713  else
714  {
715  fpint = 0x7fff;
716  fpfrac = -1;
717  }
718  }
719 
720  XsMessage_setDataLong(thisPtr, (fpfrac & ~1L) | b, offset);
721  XsMessage_setDataShort(thisPtr, (uint16_t) fpint, offset + (XsSize)4);
722 }
723 
731 void XsMessage_setDataBuffer(XsMessage* thisPtr, const uint8_t* buffer, XsSize size, XsSize offset)
732 {
733  XsMessage_ensureDataSize(thisPtr, offset, size);
734  XsMessage_updateChecksumWithValue(thisPtr, buffer, size, offset);
735  memcpy(XsMessage_dataAtOffset(thisPtr, offset), buffer, size);
736 }
737 
745 {
746  switch (id & XDI_SubFormatMask)
747  {
748  case XDI_SubFormatFloat:
749  return 4;
750 
751  case XDI_SubFormatDouble:
752  return 8;
753 
754  case XDI_SubFormatFp1632:
755  return 6;
756 
757  case XDI_SubFormatFp1220:
758  return 4;
759 
760  default:
761  return 0;
762  }
763 }
764 
769 static double convertFromFloat(float f)
770 {
771  Itypes rv, tmp;
772  tmp.f32.f0 = f;
773  rv.d = (double) f;
774  rv.i64 = (rv.i64 & ~1LL) | (tmp.i32.i0 & 1);
775  return rv.d;
776 }
777 
782 static float convertToFloat(double d)
783 {
784  Itypes rv, tmp;
785  tmp.d = d;
786  rv.f32.f0 = (float) d;
787  rv.i32.i0 = (rv.i32.i0 & ~1L) | (tmp.i64 & 1);
788  return rv.f32.f0;
789 }
790 
798 void XsMessage_getDataFPValuesById(XsMessage const* thisPtr, XsDataIdentifier dataIdentifier, double* dest, XsSize offset, XsSize numValues)
799 {
800  XsSize i;
801  for (i = 0; i < numValues; i++)
802  {
803  switch (dataIdentifier & XDI_SubFormatMask)
804  {
805  case XDI_SubFormatFloat:
806  *dest++ = convertFromFloat(XsMessage_getDataFloat(thisPtr, offset));
807  offset += 4;
808  break;
809 
810  case XDI_SubFormatDouble:
811  *dest++ = XsMessage_getDataDouble(thisPtr, offset);
812  offset += 8;
813  break;
814 
815  case XDI_SubFormatFp1632:
816  *dest++ = XsMessage_getDataFP1632(thisPtr, offset);
817  offset += 6;
818  break;
819 
820  case XDI_SubFormatFp1220:
821  *dest++ = XsMessage_getDataF1220(thisPtr, offset);
822  offset += 4;
823  break;
824 
825  default:
826  *dest++ = 0;
827  break;
828  }
829  }
830 }
831 
839 void XsMessage_setDataFPValuesById(XsMessage* thisPtr, XsDataIdentifier dataIdentifier, double const* data, XsSize offset, XsSize numValues)
840 {
841  XsSize i;
842  for (i = 0; i < numValues; i++)
843  {
844  switch (dataIdentifier & XDI_SubFormatMask)
845  {
846  case XDI_SubFormatFloat:
847  XsMessage_setDataFloat(thisPtr, convertToFloat(data[i]), offset);
848  offset += 4;
849  break;
850 
851  case XDI_SubFormatDouble:
852  XsMessage_setDataDouble(thisPtr, data[i], offset);
853  offset += 8;
854  break;
855 
856  case XDI_SubFormatFp1632:
857  XsMessage_setDataFP1632(thisPtr, data[i], offset);
858  offset += 6;
859  break;
860 
861  case XDI_SubFormatFp1220:
862  XsMessage_setDataF1220(thisPtr, data[i], offset);
863  offset += 4;
864  break;
865 
866  default:
867  break;
868  }
869  }
870 }
871 
881 void XsMessage_getDataRealValuesById(XsMessage const* thisPtr, XsDataIdentifier dataIdentifier, XsReal* dest, XsSize offset, XsSize numValues)
882 {
883  XsSize i;
884  for (i = 0; i < numValues; i++)
885  {
886  switch (dataIdentifier & XDI_SubFormatMask)
887  {
888  case XDI_SubFormatFloat:
889 #ifdef XSENS_SINGLE_PRECISION
890  *dest++ = XsMessage_getDataFloat(thisPtr, offset);
891 #else
892  *dest++ = convertFromFloat(XsMessage_getDataFloat(thisPtr, offset));
893 #endif
894  offset += 4;
895  break;
896 
897  case XDI_SubFormatDouble:
898 #ifdef XSENS_SINGLE_PRECISION
899  *dest++ = convertToFloat(XsMessage_getDataDouble(thisPtr, offset));
900 #else
901  *dest++ = XsMessage_getDataDouble(thisPtr, offset);
902 #endif
903  offset += 8;
904  break;
905 
906  case XDI_SubFormatFp1632:
907 #ifdef XSENS_SINGLE_PRECISION
908  *dest++ = convertToFloat(XsMessage_getDataFP1632(thisPtr, offset));
909 #else
910  *dest++ = XsMessage_getDataFP1632(thisPtr, offset);
911 #endif
912  offset += 6;
913  break;
914 
915  case XDI_SubFormatFp1220:
916 #ifdef XSENS_SINGLE_PRECISION
917  *dest++ = convertToFloat(XsMessage_getDataF1220(thisPtr, offset));
918 #else
919  *dest++ = XsMessage_getDataF1220(thisPtr, offset);
920 #endif
921  offset += 4;
922  break;
923 
924  default:
925  *dest++ = 0;
926  break;
927  }
928  }
929 }
930 
938 void XsMessage_setDataRealValuesById(XsMessage* thisPtr, XsDataIdentifier dataIdentifier, XsReal const* data, XsSize offset, XsSize numValues)
939 {
940  XsSize i;
941  for (i = 0; i < numValues; i++)
942  {
943  switch (dataIdentifier & XDI_SubFormatMask)
944  {
945  case XDI_SubFormatFloat:
946  XsMessage_setDataFloat(thisPtr, convertToFloat(data[i]), offset);
947  offset += 4;
948  break;
949 
950  case XDI_SubFormatDouble:
951  XsMessage_setDataDouble(thisPtr, data[i], offset);
952  offset += 8;
953  break;
954 
955  case XDI_SubFormatFp1632:
956  XsMessage_setDataFP1632(thisPtr, data[i], offset);
957  offset += 6;
958  break;
959 
960  case XDI_SubFormatFp1220:
961  XsMessage_setDataF1220(thisPtr, data[i], offset);
962  offset += 4;
963  break;
964 
965  default:
966  break;
967  }
968  }
969 }
970 
974 uint8_t XsMessage_computeChecksum(XsMessage const* thisPtr)
975 {
976  XsSize i, msgSize;
977  uint8_t cs = 0;
978 
979  msgSize = XsMessage_getTotalMessageSize(thisPtr) - 1;
980  for (i = 1; i < msgSize; ++i)
981  cs -= thisPtr->m_message.m_data[i];
982 
983  return cs;
984 }
985 
989 {
990  assert(thisPtr->m_checksum);
991  thisPtr->m_checksum[0] = XsMessage_computeChecksum(thisPtr);
992 }
993 
998 {
999  assert(thisPtr->m_checksum);
1000  return thisPtr->m_checksum[0] == XsMessage_computeChecksum(thisPtr);
1001 }
1002 
1007 {
1008  return (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
1009 }
1010 
1013 {
1014  return (const XsMessageHeader*)(void*) thisPtr->m_message.m_data;
1015 }
1016 
1020 int XsMessage_empty(XsMessage const* thisPtr)
1021 {
1022  XsMessageHeader* hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
1023  if (!hdr)
1024  return 1;
1025  return (hdr->m_messageId == 0 && hdr->m_busId == XS_BID_MASTER);
1026 }
1027 
1032 void XsMessage_resizeData(XsMessage* thisPtr, XsSize newSize)
1033 {
1034  XsSize index, oldSize;
1036  XsMessageHeader* oldHdr, *newHdr;
1037  uint8_t* oldData, *newData;
1038 
1039  oldSize = XsMessage_dataSize(thisPtr);
1040  if (oldSize == newSize)
1041  return;
1042 
1043  XsArray_swap(&thisPtr->m_message, &old);
1044  XsMessage_constructSized(thisPtr, newSize);
1045 
1046  newHdr = (XsMessageHeader*) thisPtr->m_message.m_data;
1047  oldHdr = (XsMessageHeader*) old.m_data;
1048  if (!oldHdr) // our original message may have been empty / uninitialized
1049  return;
1050 
1051  if (thisPtr->m_autoUpdateChecksum)
1052  thisPtr->m_checksum[0] += newHdr->m_busId;
1053 
1054  newHdr->m_busId = oldHdr->m_busId;
1055  newHdr->m_preamble = oldHdr->m_preamble;
1056  newHdr->m_messageId = oldHdr->m_messageId;
1057 
1058  if (thisPtr->m_autoUpdateChecksum)
1059  thisPtr->m_checksum[0] -= newHdr->m_busId + newHdr->m_messageId;
1060 
1061  if (oldSize >= XS_EXTLENCODE)
1062  oldData = oldHdr->m_datlen.m_extended.m_data;
1063  else
1064  oldData = oldHdr->m_datlen.m_data;
1065 
1066  if (newSize >= XS_EXTLENCODE)
1067  newData = newHdr->m_datlen.m_extended.m_data;
1068  else
1069  newData = newHdr->m_datlen.m_data;
1070 
1071  if (oldSize > newSize)
1072  oldSize = newSize; // speed up the loop
1073  for (index = 0; index < oldSize; ++index)
1074  newData[index] = oldData[index];
1075 
1076  if (thisPtr->m_autoUpdateChecksum)
1077  thisPtr->m_checksum[0] -= byteSum(oldData, oldSize);
1078 
1079  XsArray_destruct(&old);
1080 }
1081 
1088 void XsMessage_setBusId(XsMessage* thisPtr, uint8_t busId)
1089 {
1090  XsMessageHeader* hdr;
1091  if (!thisPtr->m_message.m_data)
1092  XsMessage_construct(thisPtr);
1093 
1094  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
1095  if (thisPtr->m_autoUpdateChecksum)
1096  thisPtr->m_checksum[0] += hdr->m_busId;
1097  hdr->m_busId = busId;
1098  if (thisPtr->m_autoUpdateChecksum)
1099  thisPtr->m_checksum[0] -= hdr->m_busId;
1100 }
1101 
1107 {
1108  XsMessageHeader* hdr;
1109  if (!thisPtr->m_message.m_data)
1110  XsMessage_construct(thisPtr);
1111 
1112  hdr = (XsMessageHeader*)(void*) thisPtr->m_message.m_data;
1113  if (thisPtr->m_autoUpdateChecksum)
1114  thisPtr->m_checksum[0] += hdr->m_messageId;
1115  hdr->m_messageId = (uint8_t) msgId;
1116  if (thisPtr->m_autoUpdateChecksum)
1117  thisPtr->m_checksum[0] -= hdr->m_messageId;
1118 }
1119 
1125 void XsMessage_insertData(XsMessage* thisPtr, XsSize count, XsSize offset)
1126 {
1127  XsSize index, oldSize, newSize;
1129  XsMessageHeader* oldHdr, *newHdr;
1130  uint8_t* oldData, *newData;
1131 
1132  if (!count)
1133  return;
1134 
1135  oldSize = XsMessage_dataSize(thisPtr);
1136  newSize = oldSize + count;
1137 
1138  if (newSize < offset + count)
1139  newSize = offset + count;
1140 
1141  XsArray_swap(&thisPtr->m_message, &old);
1142  XsMessage_constructSized(thisPtr, newSize);
1143 
1144  newHdr = (XsMessageHeader*) thisPtr->m_message.m_data;
1145  oldHdr = (XsMessageHeader*) old.m_data;
1146  if (!oldHdr) // our original message may have been empty / uninitialized
1147  return;
1148 
1149  newHdr->m_busId = oldHdr->m_busId;
1150  newHdr->m_preamble = oldHdr->m_preamble;
1151  newHdr->m_messageId = oldHdr->m_messageId;
1152 
1153  if (oldSize >= XS_EXTLENCODE)
1154  oldData = &oldHdr->m_datlen.m_extended.m_data[0];
1155  else
1156  oldData = &oldHdr->m_datlen.m_data[0];
1157 
1158  if (newSize >= XS_EXTLENCODE)
1159  newData = &newHdr->m_datlen.m_extended.m_data[0];
1160  else
1161  newData = &newHdr->m_datlen.m_data[0];
1162 
1163  if (offset <= oldSize)
1164  {
1165  for (index = 0; index < offset; ++index)
1166  newData[index] = oldData[index];
1167  }
1168  else
1169  {
1170  for (index = 0; index < oldSize; ++index)
1171  newData[index] = oldData[index];
1172  for (; index < offset; ++index)
1173  newData[index] = 0;
1174  }
1175  for (; index < oldSize; ++index)
1176  newData[index + count] = oldData[index];
1177 
1178  if (thisPtr->m_autoUpdateChecksum)
1179  thisPtr->m_checksum[0] -= byteSum(oldData, oldSize);
1180 
1181  XsArray_destruct(&old);
1182 }
1183 
1189 void XsMessage_deleteData(XsMessage* thisPtr, XsSize count, XsSize offset)
1190 {
1191  XsSize index, oldSize, newSize;
1193  XsMessageHeader* oldHdr, *newHdr;
1194  uint8_t* oldData, *newData;
1195 
1196  oldSize = XsMessage_dataSize(thisPtr);
1197  if (!count || offset >= oldSize)
1198  return;
1199 
1200  if (offset + count >= oldSize)
1201  {
1202  XsMessage_resizeData(thisPtr, offset);
1203  return;
1204  }
1205  newSize = oldSize - count;
1206 
1207  XsArray_swap(&thisPtr->m_message, &old);
1208  XsMessage_constructSized(thisPtr, newSize);
1209 
1210  newHdr = (XsMessageHeader*) thisPtr->m_message.m_data;
1211  oldHdr = (XsMessageHeader*) old.m_data;
1212  if (!oldHdr) // our original message may have been empty / uninitialized
1213  return;
1214 
1215  newHdr->m_busId = oldHdr->m_busId;
1216  newHdr->m_preamble = oldHdr->m_preamble;
1217  newHdr->m_messageId = oldHdr->m_messageId;
1218 
1219  if (oldSize >= XS_EXTLENCODE)
1220  oldData = oldHdr->m_datlen.m_extended.m_data;
1221  else
1222  oldData = oldHdr->m_datlen.m_data;
1223 
1224  if (newSize >= XS_EXTLENCODE)
1225  newData = newHdr->m_datlen.m_extended.m_data;
1226  else
1227  newData = newHdr->m_datlen.m_data;
1228 
1229  for (index = 0; index < offset; ++index)
1230  newData[index] = oldData[index];
1231  for (; index < newSize; ++index)
1232  newData[index] = oldData[index + count];
1233 
1234  if (thisPtr->m_autoUpdateChecksum)
1235  thisPtr->m_checksum[0] -= byteSum(newData, newSize);
1236 
1237  XsArray_destruct(&old);
1238 }
1239 
1249 {
1250  XsMessage tmp;
1251 
1252  *((uint8_t**)&tmp.m_checksum) = a->m_checksum;
1254 
1255  *((uint8_t**)&a->m_checksum) = b->m_checksum;
1257 
1258  *((uint8_t**)&b->m_checksum) = tmp.m_checksum;
1260 
1261  XsArray_swap(&a->m_message, &b->m_message);
1262 }
1263 
1269 int XsMessage_compare(XsMessage const* a, XsMessage const* b)
1270 {
1271  return XsArray_compare(&a->m_message, &b->m_message);
1272 }
1273 
1278 void XsMessage_toHexString(XsMessage const* thisPtr, XsSize maxBytes, XsString* resultValue)
1279 {
1280  char* s;
1282  if (maxBytes == 0 || maxBytes > i)
1283  maxBytes = i;
1284 
1285  if (maxBytes)
1286  {
1287  XsString_resize(resultValue, maxBytes * 3 - 1);
1288  s = (char*) resultValue->m_data;
1289  for (i = 0; i < maxBytes - 1; ++i)
1290  sprintf(s + (i * 3), "%02X ", (unsigned int)((uint8_t const*) thisPtr->m_message.m_data)[i]);
1291  sprintf(s + ((maxBytes - 1) * 3), "%02X", (unsigned int)((uint8_t const*) thisPtr->m_message.m_data)[maxBytes - 1]);
1292  }
1293  else
1294  XsString_resize(resultValue, 0);
1295 }
1296 
XS_BID_MASTER
#define XS_BID_MASTER
The bus identifier of the master device.
Definition: xsbusid.h:73
XsMessage_deleteData
void XsMessage_deleteData(XsMessage *thisPtr, XsSize count, XsSize offset)
Remove count bytes of data from the message at offset.
Definition: xsmessage.c:1189
XsMessage_getDataFPValuesById
void XsMessage_getDataFPValuesById(XsMessage const *thisPtr, XsDataIdentifier dataIdentifier, double *dest, XsSize offset, XsSize numValues)
Return current data values as double, conversion depends on outputSetting.
Definition: xsmessage.c:798
Itypes::i32
struct Itypes::@9 i32
Itypes::s3
int16_t s3
Definition: xsmessage.c:173
XsMessage_getEndianCorrectData
void XsMessage_getEndianCorrectData(XsMessage const *thisPtr, void *value, XsSize size, XsSize offset)
Get data of size size at offset, and put it byteswapped into value.
Definition: xsmessage.c:286
XsMessage_setDataFPValuesById
void XsMessage_setDataFPValuesById(XsMessage *thisPtr, XsDataIdentifier dataIdentifier, double const *data, XsSize offset, XsSize numValues)
Write a number of floating/fixed point values into to the data buffer, conversion depends on outputSe...
Definition: xsmessage.c:839
XsMessage_assign
void XsMessage_assign(XsMessage *thisPtr, XsSize dataSize)
This function reinitializes the XsMessage object and reserves dataSize bytes for data.
Definition: xsmessage.c:377
Itypes::b6
signed char b6
Definition: xsmessage.c:177
XsMessage_setBusId
void XsMessage_setBusId(XsMessage *thisPtr, uint8_t busId)
Set the bus id for this message to busId.
Definition: xsmessage.c:1088
XsArray::XsArray_compare
int XsArray_compare(void const *a, void const *b)
Returns non-zero if the lists are different, 0 if they're equal.
Definition: xsarray.c:479
XsMessage_swap
void XsMessage_swap(XsMessage *a, XsMessage *b)
Swap the contents of a and b.
Definition: xsmessage.c:1248
XsMessageHeader
A message header.
Definition: xsmessage.h:169
XsByteArray
A list of uint8_t values.
XsMessage_getDataFP1632
double XsMessage_getDataFP1632(XsMessage const *thisPtr, XsSize offset)
Returns the F16.32 value at offset in the data of the message.
Definition: xsmessage.c:571
Itypes::f32
struct Itypes::@12 f32
XsMessageHeader::m_busId
uint8_t m_busId
The bus ID.
Definition: xsmessage.h:172
XsMessage_insertData
void XsMessage_insertData(XsMessage *thisPtr, XsSize count, XsSize offset)
Create count bytes of empty space at offset in this message.
Definition: xsmessage.c:1125
XsByteArray::XsByteArray_construct
void XsByteArray_construct(XsByteArray *thisPtr, XsSize count, uint8_t const *src)
Definition: xsbytearray.c:119
XsMessage_constructSized
void XsMessage_constructSized(XsMessage *thisPtr, XsSize dataSize)
This function initializes the XsMessage object and reserves dataSize bytes for data.
Definition: xsmessage.c:311
Itypes::i0
int32_t i0
Definition: xsmessage.c:169
s
XmlRpcServer s
XDI_SubFormatFp1632
@ XDI_SubFormatFp1632
Fixed point 16.32.
Definition: xsdataidentifier.h:96
XsMessage_setEndianCorrectData
void XsMessage_setEndianCorrectData(XsMessage *thisPtr, void const *value, XsSize size, XsSize offset)
Set value value of size size byteswapped at offset.
Definition: xsmessage.c:297
XsArray::XsArray_destruct
void XsArray_destruct(void *thisPtr)
Clears and frees memory allocated by the XsArray.
Definition: xsarray.c:157
XsMessageHeader::LengthData::m_extended
struct XsMessageHeader::LengthData::ExtendedLength m_extended
The extended length, only valid if normal length is 255.
swapEndian64
#define swapEndian64(src)
Definition: xsmessage.h:723
convertToFloat
static float convertToFloat(double d)
Definition: xsmessage.c:782
XsMessage_cdataAtOffset
static const uint8_t * XsMessage_cdataAtOffset(XsMessage const *thisPtr, XsSize offset)
return the const data at offset offset
Definition: xsmessage.c:223
XsMessage_updateChecksumWithValue
static void XsMessage_updateChecksumWithValue(XsMessage *thisPtr, const void *value, XsSize sizeofValue, XsSize offset)
Update the message checksum with the passed value.
Definition: xsmessage.c:236
convertFromFloat
static double convertFromFloat(float f)
Definition: xsmessage.c:769
Itypes::f0
float f0
Definition: xsmessage.c:183
XsMessage_dataAtOffset
static uint8_t * XsMessage_dataAtOffset(XsMessage *thisPtr, XsSize offset)
Get the buffer at offset offset.
Definition: xsmessage.c:209
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
XsMessage_recomputeChecksum
void XsMessage_recomputeChecksum(XsMessage *thisPtr)
Update the checksum for the message.
Definition: xsmessage.c:988
XsMessageHeader::m_length
uint8_t m_length
The length of the message.
Definition: xsmessage.h:174
Itypes::s0
int16_t s0
Definition: xsmessage.c:173
XsArray::XsArray_copy
void XsArray_copy(void *thisPtr, void const *src)
Copy the contents of src to thisArray.
Definition: xsarray.c:305
XsMessageHeader::LengthData::ExtendedLength::m_length
struct XsMessageHeader::LengthData::ExtendedLength::ExtendedParts m_length
Extended length, only valid if normal length is 255.
XsMessage_setDataFP1632
void XsMessage_setDataFP1632(XsMessage *thisPtr, double value, XsSize offset)
Sets the F16.32 at offset in the message to value.
Definition: xsmessage.c:682
XDI_SubFormatFp1220
@ XDI_SubFormatFp1220
Fixed point 12.20.
Definition: xsdataidentifier.h:95
XsMessage_computeChecksum
uint8_t XsMessage_computeChecksum(XsMessage const *thisPtr)
Computes the checksum for the message.
Definition: xsmessage.c:974
XsMessageHeader::m_preamble
uint8_t m_preamble
The message preamble (always 0xFA)
Definition: xsmessage.h:171
Itypes::b7
signed char b7
Definition: xsmessage.c:177
XsMessageHeader::LengthData::ExtendedLength::ExtendedParts::m_low
uint8_t m_low
Low byte of extended length.
Definition: xsmessage.h:186
XsMessageHeader::m_datlen
union XsMessageHeader::LengthData m_datlen
Data or length and data.
XsMessage_getTotalMessageSize
XsSize XsMessage_getTotalMessageSize(XsMessage const *thisPtr)
Return the length of the message buffer.
Definition: xsmessage.c:461
XsMessage_setMessageId
void XsMessage_setMessageId(XsMessage *thisPtr, enum XsXbusMessageId msgId)
Set the message id for this message to msgId.
Definition: xsmessage.c:1106
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
Itypes::i64
int64_t i64
Definition: xsmessage.c:166
byteSum
uint8_t byteSum(const uint8_t *buffer, XsSize count)
Calculate the sum of the values in the buffer.
Definition: xsmessage.c:201
XsMessage_resizeData
void XsMessage_resizeData(XsMessage *thisPtr, XsSize newSize)
Resize the buffer of message to newSize bytes.
Definition: xsmessage.c:1032
XSBYTEARRAY_INITIALIZER
#define XSBYTEARRAY_INITIALIZER
Definition: xsbytearray.h:79
data
data
f
f
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
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
XsMessage_isChecksumOk
int XsMessage_isChecksumOk(XsMessage const *thisPtr)
Returns non-zero if the checksum inside the message is correct for the message, zero otherwise.
Definition: xsmessage.c:997
XsMessage_toHexString
void XsMessage_toHexString(XsMessage const *thisPtr, XsSize maxBytes, XsString *resultValue)
Return a string containing the first maxBytes bytes of the message in hex format.
Definition: xsmessage.c:1278
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
Itypes::i8
struct Itypes::@11 i8
Itypes::b2
signed char b2
Definition: xsmessage.c:177
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
XsMessage::m_message
XsByteArray m_message
Definition: xsmessage.h:674
Itypes::b5
signed char b5
Definition: xsmessage.c:177
XsDataIdentifier
XsDataIdentifier
Defines the data identifiers.
Definition: xsdataidentifier.h:84
XsArray::XsArray_copyConstruct
void XsArray_copyConstruct(void *thisPtr, void const *src)
Initializes the XsArray with a copy of src.
Definition: xsarray.c:144
XsMessage_copyConstruct
void XsMessage_copyConstruct(XsMessage *thisPtr, XsMessage const *src)
Construct an XsMessage as a copy of XsMessage src.
Definition: xsmessage.c:355
uint32_t
unsigned int uint32_t
Definition: pstdint.h:485
XsMessage_load
void XsMessage_load(XsMessage *thisPtr, XsSize msgSize, unsigned char const *src)
This function initializes the XsMessage object and reserves msgSize bytes for data,...
Definition: xsmessage.c:388
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
XsMessage_dataSize
XsSize XsMessage_dataSize(XsMessage const *thisPtr)
This function returns the datasize of the message in thisptr.
Definition: xsmessage.c:416
XsMessage::m_checksum
uint8_t *const m_checksum
Points to the checksum to speed up automatic checksum updates.
Definition: xsmessage.h:676
XsReal
double XsReal
Defines the floating point type used by the Xsens libraries.
Definition: xstypedefs.h:73
XsMessage_getConstHeader
const XsMessageHeader * XsMessage_getConstHeader(XsMessage const *thisPtr)
Definition: xsmessage.c:1012
XsArray::XsArray_swap
void XsArray_swap(void *a, void *b)
Swap the contents of a with those of b.
Definition: xsarray.c:408
swapEndian32
#define swapEndian32(src)
Definition: xsmessage.h:722
xsbusid.h
XDI_SubFormatDouble
@ XDI_SubFormatDouble
Double format.
Definition: xsdataidentifier.h:97
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
XsMessage::XsMessage_getFPValueSize
uint8_t XsMessage_getFPValueSize(XsDataIdentifier id)
Returns the byte size of id if the format is a floating point format.
Definition: xsmessage.c:744
Itypes::f1
float f1
Definition: xsmessage.c:183
XsMessage_copy
void XsMessage_copy(XsMessage *copy, XsMessage const *thisPtr)
This function copies from thisPtr to copy.
Definition: xsmessage.c:406
XsSize
size_t XsSize
XsSize must be unsigned number!
Definition: xstypedefs.h:74
XsMessage_setDataF1220
void XsMessage_setDataF1220(XsMessage *thisPtr, double value, XsSize offset)
Sets the F12.20 at offset in the message to value.
Definition: xsmessage.c:666
XsXbusMessageId
XsXbusMessageId
Xsens Xbus Message Identifiers.
Definition: xsxbusmessageid.h:73
XsMessage_empty
int XsMessage_empty(XsMessage const *thisPtr)
Test if this message is empty.
Definition: xsmessage.c:1020
XsMessage_construct
void XsMessage_construct(XsMessage *thisPtr)
This function initializes the XsMessage object.
Definition: xsmessage.c:347
XsMessage
Structure for storing a single message.
Definition: xsmessage.h:202
XsMessage_getDataF1220
double XsMessage_getDataF1220(XsMessage const *thisPtr, XsSize offset)
Returns the F12.20 value at offset in the data of the message.
Definition: xsmessage.c:555
XsMessage_ensureDataSize
static void XsMessage_ensureDataSize(XsMessage *thisPtr, XsSize offset, XsSize sizeofValue)
Make sure the data buffer is large enough to hold a new data item of sizeofValue.
Definition: xsmessage.c:229
XDI_SubFormatFloat
@ XDI_SubFormatFloat
Floating point format.
Definition: xsdataidentifier.h:94
XDI_SubFormatMask
@ XDI_SubFormatMask
Determines, float, fp12.20, fp16.32, double output... (where applicable)
Definition: xsdataidentifier.h:93
XsMessage_setDataDouble
void XsMessage_setDataDouble(XsMessage *thisPtr, double value, XsSize offset)
Sets the double at offset in the message to value.
Definition: xsmessage.c:656
Itypes::i16
struct Itypes::@10 i16
XS_EXTLENCODE
#define XS_EXTLENCODE
Definition: xsmessage.h:145
XsString_resize
void XsString_resize(XsString *thisPtr, XsSize count)
This function resizes the contained string to the desired size, while retaining its contents.
Definition: xsstring.c:243
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
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
Itypes::b0
signed char b0
Definition: xsmessage.c:177
Itypes::d
double d
Definition: xsmessage.c:180
XsMessageHeader::LengthData::m_data
uint8_t m_data[1]
The first byte of the data buffer if length < 255, the data buffer is always at least 1 byte since it...
Definition: xsmessage.h:190
XsMessage_destruct
void XsMessage_destruct(XsMessage *thisPtr)
This function clears the data in the message.
Definition: xsmessage.c:397
XsMessage_compare
int XsMessage_compare(XsMessage const *a, XsMessage const *b)
Compare the contents of the messages a and b, returning non-0 if they are different.
Definition: xsmessage.c:1269
int32_t
signed int int32_t
Definition: pstdint.h:515
XsMessage_getMessageStart
const uint8_t * XsMessage_getMessageStart(XsMessage const *thisPtr)
This function returns a const pointer to the header of the message in thisptr.
Definition: xsmessage.c:448
Itypes::b3
signed char b3
Definition: xsmessage.c:177
Itypes::s1
int16_t s1
Definition: xsmessage.c:173
Itypes::i1
int32_t i1
Definition: xsmessage.c:169
XsMessageHeader::LengthData::ExtendedLength::ExtendedParts::m_high
uint8_t m_high
High byte of extended length.
Definition: xsmessage.h:185
XsMessage::m_autoUpdateChecksum
int m_autoUpdateChecksum
Definition: xsmessage.h:675
XsMessage_getHeader
XsMessageHeader * XsMessage_getHeader(XsMessage *thisPtr)
Returns a pointer to the message header for this message.
Definition: xsmessage.c:1006
XS_PREAMBLE
#define XS_PREAMBLE
Definition: xsmessage.h:144
Itypes
Definition: xsmessage.c:164
XsMessage_constData
const uint8_t * XsMessage_constData(XsMessage const *thisPtr, XsSize offset)
This function returns a const pointer to the offset in the data of the message in thisptr.
Definition: xsmessage.c:436
XsMessage_getDataFloat
float XsMessage_getDataFloat(XsMessage const *thisPtr, XsSize offset)
Returns the float value at offset in the data of the message.
Definition: xsmessage.c:531
Itypes::b1
signed char b1
Definition: xsmessage.c:177
XsMessageHeader::m_messageId
uint8_t m_messageId
The message ID.
Definition: xsmessage.h:173
swapEndian16
#define swapEndian16(src)
Definition: xsmessage.h:721
XsMessage_getDataDouble
double XsMessage_getDataDouble(XsMessage const *thisPtr, XsSize offset)
Returns the double at offset in the data of the message.
Definition: xsmessage.c:543
XsString
A 0-terminated managed string of characters.
XsMessageHeader::LengthData::ExtendedLength::m_data
uint8_t m_data[1]
The first byte of the data buffer, the data buffer is always at least 1 byte since it has to contain ...
Definition: xsmessage.h:188
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
Itypes::s2
int16_t s2
Definition: xsmessage.c:173
Itypes::b4
signed char b4
Definition: xsmessage.c:177
XsMessage_setDataFloat
void XsMessage_setDataFloat(XsMessage *thisPtr, float value, XsSize offset)
Sets the float at offset in the message to value.
Definition: xsmessage.c:646
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
swapEndian
static void swapEndian(void *data, const XsSize size)
Swap the endianness based on the data size.
Definition: xsmessage.c:246


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