xsens_imu
cmtmessage.h
Go to the documentation of this file.
1 #ifndef XSENS_MONOLITHIC
2 
20 #endif
21 #ifndef CMTMESSAGE_H
22 #define CMTMESSAGE_H
23 
24 #ifndef XSENS_MONOLITHIC
25 # include "cmtdef.h"
26 # include "cmt1.h"
27 #endif
28 
29 namespace xsens {
30 
32 
34 uint8_t computeChecksum(const uint8_t* buffer, uint32_t length);
35 
37 /* different alignment commands for gcc / MSVS, the structure needs to be 1-byte aligned.
38 */
39 #ifdef _MSC_VER
40  #pragma pack(push, 1)
41 #endif
42 
46 struct MessageHeader {
47  uint8_t m_preamble;
48  uint8_t m_busId;
49  uint8_t m_messageId;
50  uint8_t m_length;
51  union _mdl {
52  struct _mextd {
53  struct _mlen {
54  uint8_t m_high;
55  uint8_t m_low;
56  } m_length;
58  } m_extended;
59  uint8_t m_data[254];
60  } m_datlen;
61 }
62 // different alignment commands for gcc / MSVS
63 #ifdef _MSC_VER
64  ;
65  #pragma pack(pop)
66 #else
67  __attribute__((__packed__)) ;
68 #endif
69 
70 
71 #define swapEndian16(src) (((src) >> 8) | ((src) << 8))
72 #define swapEndian32(src) (((src) >> 24) | ((src) >> 8 & 0xFF00) | ((src) << 8 & 0xFF0000) | ((src) << 24))
73 
76 class Message {
77 protected:
78 
82  uint8_t* m_checksum;
84  uint32_t m_maxLength;
85 
87  uint8_t calcChecksum(void) const
88  { return computeChecksum(((uint8_t*)m_buffer) + 1, getTotalMessageSize()-2); }
90  uint8_t* getDataStart(void) const;
91 
92 public:
94 
104  Message(const uint8_t msgId = 0, const uint16_t length = 0, const uint16_t maxLength = CMT_MAXMSGLEN);
105 
116  Message(const uint8_t* source, const uint16_t size, const uint16_t maxLength = CMT_MAXMSGLEN);
117 
118  Message(const Message& src);
119 
121  ~Message();
122 
124  void clear(void);
125 
127  uint8_t getBusId(void) const { return m_buffer->m_busId; }
132  uint8_t* getDataBuffer(const uint16_t offset = 0)
133  { return &((getDataStart())[offset]); }
134  const uint8_t* getDataBuffer(const uint16_t offset = 0) const
135  { return &((getDataStart())[offset]); }
140  uint8_t getDataByte(const uint16_t offset = 0) const
141  { return (getDataStart()[offset]); }
146  double getDataDouble(const uint16_t offset=0) const;
151  float getDataFloat(const uint16_t offset=0) const;
156  double getDataF1220(const uint16_t offset=0) const;
161  double getDataFP1632(const uint16_t offset=0) const;
167  double getDataFPValue(const uint64_t outputSettings, const uint16_t offset = 0) const;
175  void getDataFPValue(double *dest, const uint64_t outputSettings, uint16_t offset, const int16_t numValues) const;
180  uint32_t getDataLong(const uint16_t offset=0) const;
185  uint16_t getDataShort(const uint16_t offset=0) const;
187  uint16_t getDataSize(void) const;
189  uint8_t getMessageId(void) const { return m_buffer->m_messageId; }
194  const uint8_t* getMessageStart(void) const
195  { return (uint8_t*) m_buffer; }
202  uint16_t getTotalMessageSize(void) const;
204  bool isChecksumOk(void) const;
212  XsensResultValue loadFromString(const uint8_t* source, const uint16_t size);
220  void resizeData(const uint16_t newSize);
222  void setBusId(const uint8_t busId);
231  void setDataBuffer(const uint8_t* data, const uint16_t offset = 0,
232  const uint16_t count = 0);
238  void setDataByte(const uint8_t data, const uint16_t offset = 0);
244  void setDataDouble(const double data, const uint16_t offset=0);
250  void setDataFloat(const float data, const uint16_t offset = 0);
256  void setDataF1220(const double data, const uint16_t offset = 0);
262  void setDataFP1632(const double data, const uint16_t offset = 0);
269  void setDataFPValue(const uint64_t outputSettings, const double data, const uint16_t offset = 0);
277  void setDataFPValue(const uint64_t outputSettings, const double *data, uint16_t offset, const uint16_t numValues);
283  void setDataLong(const uint32_t data, const uint16_t offset = 0);
289  void setDataShort(const uint16_t data, const uint16_t offset = 0);
291  void setMessageId(const uint8_t msgId);
292 
294  void operator = (const Message& src);
295 
297  void deleteData(uint16_t size, uint16_t offset = 0);
299  void insertData(uint16_t size, uint16_t offset = 0);
300 };
301 
302 }; // end of xsens namespace
303 
304 #endif // CMTMESSAGE_H
struct xsens::MessageHeader::_mdl::_mextd::_mlen m_length
void setDataFPValue(const uint64_t outputSettings, const double data, const uint16_t offset=0)
Write a floating/fixed point value into to the data buffer, conversion depends on outputSettings...
Definition: cmtmessage.cpp:588
uint16_t getDataShort(const uint16_t offset=0) const
Return the current value of the data as an uint16_t (16 bits).
Definition: cmtmessage.cpp:293
uint8_t m_busId
Definition: cmtmessage.h:48
struct xsens::MessageHeader::_mdl::_mextd m_extended
#define CMT_MAXDATALEN
Definition: cmtdef.h:96
void setDataFloat(const float data, const uint16_t offset=0)
Write a float (32 bits) into the data buffer.
Definition: cmtmessage.cpp:509
float getDataFloat(const uint16_t offset=0) const
Return the current value of the data as a float (32 bits).
Definition: cmtmessage.cpp:149
const uint8_t * getDataBuffer(const uint16_t offset=0) const
Definition: cmtmessage.h:134
void setDataLong(const uint32_t data, const uint16_t offset=0)
Write an uint32_t (32 bits) into the data buffer.
Definition: cmtmessage.cpp:635
void clear(void)
Clear all data in the message.
Definition: cmtmessage.cpp:125
bool m_autoUpdateChecksum
Definition: cmtmessage.h:93
void recomputeChecksum(void)
Compute the checksum field and fill it.
Definition: cmtmessage.h:218
bool isChecksumOk(void) const
Compute the checksum and compare it with the stored checksum. Equal is ok.
Definition: cmtmessage.cpp:337
#define CMT_MAXMSGLEN
Definition: cmtdef.h:98
double getDataFP1632(const uint16_t offset=0) const
Return the current value of the data as a double, converting it from FP 16.32.
Definition: cmtmessage.cpp:200
void setBusId(const uint8_t busId)
Set the new value of the m_busId field and update the checksum.
Definition: cmtmessage.cpp:450
uint8_t * getDataStart(void) const
Internal function to get the start of the data buffer.
Definition: cmtmessage.cpp:316
XsensResultValue
Xsens return values.
Definition: xsens_std.h:43
Message(const uint8_t msgId=0, const uint16_t length=0, const uint16_t maxLength=CMT_MAXMSGLEN)
Create a Message object with the given data length and message Id.
Definition: cmtmessage.cpp:36
XsensResultValue loadFromString(const uint8_t *source, const uint16_t size)
Read the entire message from the given source string.
Definition: cmtmessage.cpp:346
void setDataBuffer(const uint8_t *data, const uint16_t offset=0, const uint16_t count=0)
Write a string of bytes into the data buffer.
Definition: cmtmessage.cpp:459
uint8_t m_length
Definition: cmtmessage.h:50
uint16_t getTotalMessageSize(void) const
Return the length of the message buffer.
Definition: cmtmessage.cpp:328
uint32_t getDataLong(const uint16_t offset=0) const
Return the current value of the data as an uint32_t (32 bits).
Definition: cmtmessage.cpp:278
uint8_t m_data[254]
Definition: cmtmessage.h:59
uint8_t * m_checksum
The checksum in the m_data or m_extendedData buffer.
Definition: cmtmessage.h:82
void resizeData(const uint16_t newSize)
Resize the data area to the given size.
Definition: cmtmessage.cpp:385
uint8_t getDataByte(const uint16_t offset=0) const
Return the current value of the data as an unsigned byte (8 bits).
Definition: cmtmessage.h:140
uint8_t computeChecksum(const uint8_t *buffer, uint32_t length)
Compute the checksum of the given byte string.
Definition: cmtmessage.cpp:733
void setDataShort(const uint16_t data, const uint16_t offset=0)
Write an uint16_t (16 bits) into the data buffer.
Definition: cmtmessage.cpp:653
uint8_t m_low
Definition: cmtmessage.h:55
uint32_t m_maxLength
The maximum size of the message, including header and footer.
Definition: cmtmessage.h:84
Definition: cmtmessage.h:52
double getDataDouble(const uint16_t offset=0) const
Return the current value of the data as a double (64 bits).
Definition: cmtmessage.cpp:136
uint8_t m_data[CMT_MAXDATALEN]
Definition: cmtmessage.h:57
uint8_t m_preamble
Definition: cmtmessage.h:47
Definition: cmtmessage.h:51
void setMessageId(const uint8_t msgId)
Set the new value of the m_messageId field and update the checksum.
Definition: cmtmessage.cpp:669
Class for storing a single message.
Definition: cmtmessage.h:76
uint8_t m_messageId
Definition: cmtmessage.h:49
void insertData(uint16_t size, uint16_t offset=0)
Insert a number of bytes into the message (this will increase the message size)
Definition: cmtmessage.cpp:718
uint8_t calcChecksum(void) const
Internal checksum computation.
Definition: cmtmessage.h:87
A message header.
Definition: cmtmessage.h:46
void deleteData(uint16_t size, uint16_t offset=0)
Remove a number of bytes from the message (this will reduce the message size)
Definition: cmtmessage.cpp:693
union xsens::MessageHeader::_mdl m_datlen
const uint8_t * getMessageStart(void) const
Return the start of the message buffer.
Definition: cmtmessage.h:194
Macros and types for use in the Xsens communication protocol and CMT classes.
uint16_t getDataSize(void) const
Return the length of the data part of the message.
Definition: cmtmessage.cpp:306
MessageHeader * m_buffer
The message header is the data buffer with interpretation.
Definition: cmtmessage.h:80
void setDataFP1632(const double data, const uint16_t offset=0)
Write a double (64 bits) into the data buffer, after converting it to FP1632.
Definition: cmtmessage.cpp:536
~Message()
Destructor.
Definition: cmtmessage.cpp:117
void setDataDouble(const double data, const uint16_t offset=0)
Write a double (64 bits) into the data buffer.
Definition: cmtmessage.cpp:490
double getDataF1220(const uint16_t offset=0) const
Return the current value of the data as a double, converting it from FP 12.20.
Definition: cmtmessage.cpp:164
Contains the CMT Level 1 interface.
uint8_t getMessageId(void) const
Return the current value of the m_messageId field.
Definition: cmtmessage.h:189
uint8_t * getDataBuffer(const uint16_t offset=0)
Return a pointer to the data buffer.
Definition: cmtmessage.h:132
void setDataF1220(const double data, const uint16_t offset=0)
Write a double (64 bits) into the data buffer, after converting it to F1220.
Definition: cmtmessage.cpp:528
double getDataFPValue(const uint64_t outputSettings, const uint16_t offset=0) const
Return current data value as double, conversion depends on outputSettings.
Definition: cmtmessage.cpp:227
void setDataByte(const uint8_t data, const uint16_t offset=0)
Write an unsigned byte (8 bits) into the data buffer.
Definition: cmtmessage.cpp:478
void operator=(const Message &src)
Copy message src into this.
Definition: cmtmessage.cpp:678
uint8_t getBusId(void) const
Return the current value of the m_busId field.
Definition: cmtmessage.h:127
uint8_t m_high
Definition: cmtmessage.h:54