Mangue Baja team's code to rear ECU

Committer:
einsteingustavo
Date:
Wed Jul 24 20:04:55 2019 +0000
Revision:
0:80950b84a6c4
Mangue Baja team's code to rear ECU

Who changed what in which revision?

UserRevisionLine numberNew contents of line
einsteingustavo 0:80950b84a6c4 1 #ifndef CANMSG_H
einsteingustavo 0:80950b84a6c4 2 #define CANMSG_H
einsteingustavo 0:80950b84a6c4 3
einsteingustavo 0:80950b84a6c4 4 /* CAN message container.
einsteingustavo 0:80950b84a6c4 5 * Provides "<<" (append) and ">>" (extract) operators to simplyfy
einsteingustavo 0:80950b84a6c4 6 * adding/getting data items to/from a CAN message.
einsteingustavo 0:80950b84a6c4 7 * Usage is similar to the C++ io-stream operators.
einsteingustavo 0:80950b84a6c4 8 * Data length of CAN message is automatically updated when using "<<" or ">>" operators.
einsteingustavo 0:80950b84a6c4 9 *
einsteingustavo 0:80950b84a6c4 10 * See Wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Hello/> for demo.
einsteingustavo 0:80950b84a6c4 11 */
einsteingustavo 0:80950b84a6c4 12 #include "CAN.h"
einsteingustavo 0:80950b84a6c4 13
einsteingustavo 0:80950b84a6c4 14 class CANMsg : public CANMessage
einsteingustavo 0:80950b84a6c4 15 {
einsteingustavo 0:80950b84a6c4 16 public:
einsteingustavo 0:80950b84a6c4 17 /** Creates empty CAN message.
einsteingustavo 0:80950b84a6c4 18 */
einsteingustavo 0:80950b84a6c4 19 CANMsg() :
einsteingustavo 0:80950b84a6c4 20 CANMessage(){ }
einsteingustavo 0:80950b84a6c4 21
einsteingustavo 0:80950b84a6c4 22 /** Creates CAN message with specific content.
einsteingustavo 0:80950b84a6c4 23 */
einsteingustavo 0:80950b84a6c4 24 CANMsg(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) :
einsteingustavo 0:80950b84a6c4 25 CANMessage(_id, _data, _len, _type, _format){ }
einsteingustavo 0:80950b84a6c4 26
einsteingustavo 0:80950b84a6c4 27 /** Creates CAN remote message.
einsteingustavo 0:80950b84a6c4 28 */
einsteingustavo 0:80950b84a6c4 29 CANMsg(int _id, CANFormat _format = CANStandard) :
einsteingustavo 0:80950b84a6c4 30 CANMessage(_id, _format){ }
einsteingustavo 0:80950b84a6c4 31
einsteingustavo 0:80950b84a6c4 32 /** Clears CAN message content
einsteingustavo 0:80950b84a6c4 33 */
einsteingustavo 0:80950b84a6c4 34 void clear(int new_id) {
einsteingustavo 0:80950b84a6c4 35 len = 0;
einsteingustavo 0:80950b84a6c4 36 type = CANData;
einsteingustavo 0:80950b84a6c4 37 format = CANStandard;
einsteingustavo 0:80950b84a6c4 38 id = new_id;
einsteingustavo 0:80950b84a6c4 39 memset(data, 0, 8);
einsteingustavo 0:80950b84a6c4 40 };
einsteingustavo 0:80950b84a6c4 41
einsteingustavo 0:80950b84a6c4 42 /** Append operator: Appends data (value) to CAN message
einsteingustavo 0:80950b84a6c4 43 */
einsteingustavo 0:80950b84a6c4 44 template<class T>
einsteingustavo 0:80950b84a6c4 45 CANMsg &operator<<(const T val) {
einsteingustavo 0:80950b84a6c4 46 MBED_ASSERT(len + sizeof(T) <= 8);
einsteingustavo 0:80950b84a6c4 47 //*reinterpret_cast<T*>(&data[len]) = val; // This used to work but now it hangs at run time.
einsteingustavo 0:80950b84a6c4 48 memcpy(&data[len], &val, sizeof(T));
einsteingustavo 0:80950b84a6c4 49 len += sizeof(T);
einsteingustavo 0:80950b84a6c4 50 return *this;
einsteingustavo 0:80950b84a6c4 51 }
einsteingustavo 0:80950b84a6c4 52
einsteingustavo 0:80950b84a6c4 53 /** Extract operator: Extracts data (value) from CAN message
einsteingustavo 0:80950b84a6c4 54 */
einsteingustavo 0:80950b84a6c4 55 template<class T>
einsteingustavo 0:80950b84a6c4 56 CANMsg &operator>>(T& val) {
einsteingustavo 0:80950b84a6c4 57 MBED_ASSERT(sizeof(T) <= len);
einsteingustavo 0:80950b84a6c4 58 val = *reinterpret_cast<T*>(&data[0]);
einsteingustavo 0:80950b84a6c4 59 len -= sizeof(T);
einsteingustavo 0:80950b84a6c4 60 memcpy(data, data + sizeof(T), len);
einsteingustavo 0:80950b84a6c4 61 return *this;
einsteingustavo 0:80950b84a6c4 62 }
einsteingustavo 0:80950b84a6c4 63 };
einsteingustavo 0:80950b84a6c4 64
einsteingustavo 0:80950b84a6c4 65 #endif // CANMSG_H
einsteingustavo 0:80950b84a6c4 66
einsteingustavo 0:80950b84a6c4 67