Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 076d86f

Browse files
Extend CanMsg to allow to distinguish between standard and extended IDs following a <linux/can.h> inspired approach.
1 parent 84b98c7 commit 076d86f

File tree

1 file changed

+44
-2
lines changed

1 file changed

+44
-2
lines changed

‎api/CanMsg.h‎

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ namespace arduino
3131
class CanMsg : public Printable
3232
{
3333
public:
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /