41 uint_least16_t crc, uint_least8_t
byte,
int off,
int bits);
45 uint_least16_t crc,
const unsigned char *bp,
size_t n);
74 bits += msg->
len * 10;
81 uint_least8_t data[16] = { 0 };
82 uint_least8_t *bp = data;
96 *bp++ = (
id >> 23) & 0x3f;
99 *bp++ = ((
id >> 15) & 0xf8)
101 | ((
id >> 17) & 0x01);
104 *bp++ = (
id >> 9) & 0xff;
107 *bp++ = (
id >> 1) & 0xff;
110 *bp++ = ((
id << 7) & 0x80)
123 *bp++ = (
id >> 9) & 0x03;
126 *bp++ = (
id >> 1) & 0xff;
129 *bp++ = ((
id << 7) & 0x80)
136 for (uint_least8_t i = 0; i < msg->
len; i++, bits += 8)
137 *bp++ = msg->
data[i] & 0xff;
140 uint_least16_t crc =
can_crc(0, data, off, bits);
141 assert(!((off + bits) % 8));
142 *bp++ = (crc >> 7) & 0xff;
143 *bp++ = (crc << 1) & 0xff;
148 uint_least8_t mask = 0x1f;
149 uint_least8_t same = mask;
150 for (
int i = off; i < off + bits;) {
152 same = same ? 0 : mask;
155 uint_least8_t five = (((uint_least16_t)data[i / 8] << 8)
156 | data[i / 8 + 1]) >> (16 - 5 - i % 8);
158 int n =
clz8((five & mask) ^ same) - 3;
194 uint_least8_t len = msg->
len;
213 r =
MIN((
size_t)r, n);
219 r = snprintf(s, n,
" [%02d] ", len);
222 r = snprintf(s, n,
" [%d] ", len);
226 r =
MIN((
size_t)r, n);
231 r = snprintf(s, n,
" remote request");
236 for (uint_least8_t i = 0; i < len; i++) {
237 int r = snprintf(s, n,
" %02X", msg->
data[i]);
241 r =
MIN((
size_t)r, n);
258 char *s = malloc(n + 1);
278 can_crc(uint_least16_t crc,
const void *ptr,
int off,
size_t bits)
280 assert(ptr || !bits);
282 const uint_least8_t *bp = ptr;
291 int n =
MIN((
size_t)(8 - off), bits);
307 static uint_least16_t
308 can_crc_bits(uint_least16_t crc, uint_least8_t
byte,
int off,
int bits)
312 assert(off + bits <= 8);
314 for (
byte <<= off; bits--;
byte <<= 1) {
315 if ((
byte ^ (crc >> 7)) & 0x80)
316 crc = (crc << 1) ^ 0x4599;
323 static uint_least16_t
344 static const uint_least16_t tab[] = {
345 0x0000, 0x4599, 0x4eab, 0x0b32, 0x58cf, 0x1d56, 0x1664, 0x53fd,
346 0x7407, 0x319e, 0x3aac, 0x7f35, 0x2cc8, 0x6951, 0x6263, 0x27fa,
347 0x2d97, 0x680e, 0x633c, 0x26a5, 0x7558, 0x30c1, 0x3bf3, 0x7e6a,
348 0x5990, 0x1c09, 0x173b, 0x52a2, 0x015f, 0x44c6, 0x4ff4, 0x0a6d,
349 0x5b2e, 0x1eb7, 0x1585, 0x501c, 0x03e1, 0x4678, 0x4d4a, 0x08d3,
350 0x2f29, 0x6ab0, 0x6182, 0x241b, 0x77e6, 0x327f, 0x394d, 0x7cd4,
351 0x76b9, 0x3320, 0x3812, 0x7d8b, 0x2e76, 0x6bef, 0x60dd, 0x2544,
352 0x02be, 0x4727, 0x4c15, 0x098c, 0x5a71, 0x1fe8, 0x14da, 0x5143,
353 0x73c5, 0x365c, 0x3d6e, 0x78f7, 0x2b0a, 0x6e93, 0x65a1, 0x2038,
354 0x07c2, 0x425b, 0x4969, 0x0cf0, 0x5f0d, 0x1a94, 0x11a6, 0x543f,
355 0x5e52, 0x1bcb, 0x10f9, 0x5560, 0x069d, 0x4304, 0x4836, 0x0daf,
356 0x2a55, 0x6fcc, 0x64fe, 0x2167, 0x729a, 0x3703, 0x3c31, 0x79a8,
357 0x28eb, 0x6d72, 0x6640, 0x23d9, 0x7024, 0x35bd, 0x3e8f, 0x7b16,
358 0x5cec, 0x1975, 0x1247, 0x57de, 0x0423, 0x41ba, 0x4a88, 0x0f11,
359 0x057c, 0x40e5, 0x4bd7, 0x0e4e, 0x5db3, 0x182a, 0x1318, 0x5681,
360 0x717b, 0x34e2, 0x3fd0, 0x7a49, 0x29b4, 0x6c2d, 0x671f, 0x2286,
361 0x2213, 0x678a, 0x6cb8, 0x2921, 0x7adc, 0x3f45, 0x3477, 0x71ee,
362 0x5614, 0x138d, 0x18bf, 0x5d26, 0x0edb, 0x4b42, 0x4070, 0x05e9,
363 0x0f84, 0x4a1d, 0x412f, 0x04b6, 0x574b, 0x12d2, 0x19e0, 0x5c79,
364 0x7b83, 0x3e1a, 0x3528, 0x70b1, 0x234c, 0x66d5, 0x6de7, 0x287e,
365 0x793d, 0x3ca4, 0x3796, 0x720f, 0x21f2, 0x646b, 0x6f59, 0x2ac0,
366 0x0d3a, 0x48a3, 0x4391, 0x0608, 0x55f5, 0x106c, 0x1b5e, 0x5ec7,
367 0x54aa, 0x1133, 0x1a01, 0x5f98, 0x0c65, 0x49fc, 0x42ce, 0x0757,
368 0x20ad, 0x6534, 0x6e06, 0x2b9f, 0x7862, 0x3dfb, 0x36c9, 0x7350,
369 0x51d6, 0x144f, 0x1f7d, 0x5ae4, 0x0919, 0x4c80, 0x47b2, 0x022b,
370 0x25d1, 0x6048, 0x6b7a, 0x2ee3, 0x7d1e, 0x3887, 0x33b5, 0x762c,
371 0x7c41, 0x39d8, 0x32ea, 0x7773, 0x248e, 0x6117, 0x6a25, 0x2fbc,
372 0x0846, 0x4ddf, 0x46ed, 0x0374, 0x5089, 0x1510, 0x1e22, 0x5bbb,
373 0x0af8, 0x4f61, 0x4453, 0x01ca, 0x5237, 0x17ae, 0x1c9c, 0x5905,
374 0x7eff, 0x3b66, 0x3054, 0x75cd, 0x2630, 0x63a9, 0x689b, 0x2d02,
375 0x276f, 0x62f6, 0x69c4, 0x2c5d, 0x7fa0, 0x3a39, 0x310b, 0x7492,
376 0x5368, 0x16f1, 0x1dc3, 0x585a, 0x0ba7, 0x4e3e, 0x450c, 0x0095
381 crc = (tab[(*bp++ ^ (crc >> 7)) & 0xff] ^ (crc << 8)) & 0x7fff;
This header file is part of the utilities library; it contains the bit function definitions.
int clz8(uint_least8_t x)
Counts the number of leading zero bits in the unsigned 8-bit integer x.
int snprintf_can_msg(char *s, size_t n, const struct can_msg *msg)
Prints the contents of a CAN or CAN FD format frame to a string buffer.
static uint_least16_t can_crc_bytes(uint_least16_t crc, const unsigned char *bp, size_t n)
Computes a CRC-15-CAN checksum.
int asprintf_can_msg(char **ps, const struct can_msg *msg)
Equivalent to snprintf_can_msg(), except that it allocates a string large enough to hold the output,...
int can_msg_bits(const struct can_msg *msg, enum can_msg_bits_mode mode)
Computes the size (in bits) of the specified CAN format frame on the CAN bus.
uint_least16_t can_crc(uint_least16_t crc, const void *ptr, int off, size_t bits)
Computes a bitwise CRC-15-CAN checksum, based on the 0x4599 generator polynomial.
static uint_least16_t can_crc_bits(uint_least16_t crc, uint_least8_t byte, int off, int bits)
Computes a bitwise CRC-15-CAN checksum of a single byte.
This header file is part of the CAN library; it contains the CAN frame declarations.
@ CAN_FLAG_IDE
The Identifier Extension (IDE) flag.
@ CAN_FLAG_RTR
The Remote Transmission Request (RTR) flag (unavailable in CAN FD format frames).
@ CAN_FLAG_FDF
The FD Format (FDF) flag, formerly known as Extended Data Length (EDL).
#define CAN_MASK_EID
The mask used to extract the 29-bit Extended Identifier from a CAN frame.
#define CAN_MAX_LEN
The maximum number of bytes in the payload of a CAN format frame.
#define CANFD_MAX_LEN
The maximum number of bytes in the payload of a CAN FD format frame.
#define CAN_MASK_BID
The mask used to extract the 11-bit Base Identifier from a CAN frame.
can_msg_bits_mode
The method used to compute te size (in bits) of a CAN frame.
@ CAN_MSG_BITS_MODE_WORST
Simple worst case estimate.
@ CAN_MSG_BITS_MODE_EXACT
Exact calculation based of frame content and CRC.
@ CAN_MSG_BITS_MODE_NO_STUFF
Simple calculation assuming no bit stuffing.
This header file is part of the utilities library; it contains the native and platform-independent er...
@ ERRNUM_INVAL
Invalid argument.
void set_errnum(errnum_t errnum)
Sets the current (thread-specific) platform-independent error number to errnum.
This is the public header file of the utilities library.
#define MIN(a, b)
Returns the minimum of a and b.
This is the internal header file of the CAN bus operation queue functions.
This header file is part of the C11 and POSIX compatibility library; it includes <stdio....
This header file is part of the C11 and POSIX compatibility library; it includes <stdlib....
A CAN or CAN FD format frame.
uint_least8_t data[CAN_MSG_MAX_LEN]
The frame payload (in case of a data frame).
uint_least32_t id
The identifier (11 or 29 bits, depending on the CAN_FLAG_IDE flag).
uint_least8_t flags
The flags (any combination of CAN_FLAG_IDE, CAN_FLAG_RTR, CAN_FLAG_FDF, CAN_FLAG_BRS and CAN_FLAG_ESI...
uint_least8_t len
The number of bytes in data (or the requested number of bytes in case of a remote frame).