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.
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