nana
CANMsg.h
- Committer:
- hudakz
- Date:
- 2017-03-18
- Revision:
- 1:34738eb16cf7
- Parent:
- 0:3d11ed680b6a
- Child:
- 2:2b8425b12d05
File content as of revision 1:34738eb16cf7:
#ifndef CANMSG_H #define CANMSG_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 // CANMSG_H