@@ -31,7 +31,12 @@ namespace arduino
3131class CanMsg : public Printable
3232{
3333public:
34- static size_t constexpr MAX_DATA_LENGTH = 8 ;
34+ static size_t constexpr MAX_DATA_LENGTH = 8 ;
35+
36+ static uint32_t constexpr CAN_EFF_FLAG = 0x80000000U ;
37+ static uint32_t constexpr CAN_SFF_MASK = 0x000007FFU ; /* standard frame format (SFF) */
38+ static uint32_t constexpr CAN_EFF_MASK = 0x1FFFFFFFU ; /* extended frame format (EFF) */
39+
3540
3641 CanMsg (uint32_t const can_id, uint8_t const can_data_len, uint8_t const * can_data_ptr)
3742 : id{can_id}
@@ -68,7 +73,10 @@ class CanMsg : public Printable
6873 size_t len = 0 ;
6974
7075 /* Print the header. */
71- len = snprintf (buf, sizeof (buf), " [%08X] (%d) : " , id, data_length);
76+ if (isStandardId ())
77+ len = snprintf (buf, sizeof (buf), " [%03X] (%d) : " , id, data_length);
78+ else
79+ len = snprintf (buf, sizeof (buf), " [%08X] (%d) : " , id, data_length);
7280 size_t n = p.write (buf, len);
7381
7482 /* Print the data. */
@@ -82,11 +90,45 @@ class CanMsg : public Printable
8290 return n;
8391 }
8492
93+
94+ uint32_t getStandardId () const {
95+ return (id & CAN_SFF_MASK);
96+ }
97+ uint32_t getExtendedId () const {
98+ return (id & CAN_EFF_MASK);
99+ }
100+ bool isStandardId () const {
101+ return ((id & CAN_EFF_FLAG) == 0 );
102+ }
103+ bool isExtendedId () const {
104+ return ((id & CAN_EFF_FLAG) == CAN_EFF_FLAG);
105+ }
106+
107+
108+ /*
109+ * CAN ID semantics (mirroring definition by linux/can.h):
110+ * |- Bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
111+ * |- Bit 30 : reserved (future remote transmission request flag)
112+ * |- Bit 29 : reserved (future error frame flag)
113+ * |- Bit 0-28 : CAN identifier (11/29 bit)
114+ */
85115 uint32_t id;
86116 uint8_t data_length;
87117 uint8_t data[MAX_DATA_LENGTH];
88118};
89119
120+ /* *************************************************************************************
121+ * FREE FUNCTIONS
122+ **************************************************************************************/
123+
124+ static uint32_t CanStandardId (uint32_t const id) {
125+ return (id & CanMsg::CAN_SFF_MASK);
126+ }
127+
128+ static uint32_t CanExtendedId (uint32_t const id) {
129+ return (CanMsg::CAN_EFF_FLAG | (id & CanMsg::CAN_EFF_MASK));
130+ }
131+
90132/* *************************************************************************************
91133 * NAMESPACE
92134 **************************************************************************************/
0 commit comments