16uint16_t pc_nema_ts2_crc(
const uint8_t *bytes,
size_t len)
23size_t pc_nema_ts2_build(uint8_t address, uint8_t control, uint8_t frame_type,
const uint8_t *data,
size_t data_len,
24 uint8_t *out,
size_t cap)
26 if (!out || (data_len && !data))
30 size_t n = 3 + data_len + 2;
40 memcpy(out + 3, data, data_len);
42 uint16_t crc = pc_nema_ts2_crc(out, 3 + data_len);
43 out[3 + data_len] = (uint8_t)crc;
44 out[3 + data_len + 1] = (uint8_t)(crc >> 8);
48bool pc_nema_ts2_parse(
const uint8_t *frame,
size_t len, NemaTs2Frame *out)
50 if (!frame || !out || len < 5)
54 size_t body = len - 2;
55 uint16_t want = pc_nema_ts2_crc(frame, body);
56 uint16_t got = (uint16_t)(frame[body] | (frame[body + 1] << 8));
61 out->address = frame[0];
62 out->control = frame[1];
63 out->frame_type = frame[2];
64 out->data = (body > 3) ? (frame + 3) :
nullptr;
65 out->data_len = body - 3;
Parameterized CRC engine - one source of truth for every cyclic redundancy check.
constexpr pc_crc_params PC_CRC16_X25
CRC-16/X-25 (HDLC FCS). check = 0x906E. Used by services/radio/thread, mbplus, nema_ts2.
uint32_t pc_crc(const pc_crc_params *p, const uint8_t *data, size_t len)
One-shot CRC of len octets at data.
NEMA TS 2 traffic-cabinet SDLC frame codec (PC_ENABLE_NEMA_TS2).