Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
CANMsg.h
- Committer:
- hudakz
- Date:
- 2017-03-17
- Revision:
- 0:3d11ed680b6a
- Child:
- 1:34738eb16cf7
File content as of revision 0:3d11ed680b6a:
#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