nana
Diff: CANMsg.h
- Revision:
- 0:3d11ed680b6a
- Child:
- 1:34738eb16cf7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CANMsg.h Fri Mar 17 16:34:42 2017 +0000 @@ -0,0 +1,77 @@ +#ifndef CANMESSAGE_H +#define CANMESSAGE_H + +/* CAN message container. + * Provides "<<" (append) and ">>" (extract) operators to simplyfy + * adding/getting data items to/from a CAN message. + * Usage is similar to the C++ io-stream operators. + * Data length of CAN message is automatically updated when using "<<" or ">>" operators. + * + * See Wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Hello/> for demo. + */ + +#include "CAN.h" + +class CANMsg : public CANMessage +{ +public: + /** Creates empty CAN message. + */ + CANMsg() : + CANMessage(){ } + + /** Creates CAN message with specific content. + */ + CANMsg(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) : + CANMessage(_id, _data, _len, _type, _format){ } + + /** Creates CAN remote message. + */ + CANMsg(int _id, CANFormat _format = CANStandard) : + CANMessage(_id, _format){ } + + /** Clears CAN message content + */ + void clear(void) { + len = 0; + type = CANData; + format = CANStandard; + id = 0; + memset(data, 0, 8); + }; + + /** Append operator: Appends data (value) to CAN message + */ + template<class T> + CANMsg &operator<<(const T val) { + if(len + sizeof(T) <= 8) { + *reinterpret_cast < T * > (&data[len]) = val; + len += sizeof(T); + } +#if DEBUG + else { + printf("Error: Cannot append data - exceeding CAN data length!\r\n"); + } +#endif + return *this; + } + + /** Extract operator: Extracts data (value) from CAN message + */ + template<class T> + CANMsg &operator>>(T& val) { + if(sizeof(T) <= len) { + val = *reinterpret_cast < T * > (&data[0]); + len -= sizeof(T); + memcpy(data, data + sizeof(T), len); + } +#if DEBUG + else { + printf("Error: Cannot extract data - exceeding CAN data length!\r\n"); + } +#endif + return *this; + } +}; + +#endif // CANMESSAGE_H