11#if DETWS_ENABLE_NEMA_TS2
15uint16_t detws_nema_ts2_crc(
const uint8_t *bytes,
size_t len)
18 uint16_t crc = 0xFFFF;
19 for (
size_t i = 0; i < len; i++)
22 for (
int b = 0; b < 8; b++)
23 crc = (crc & 1) ? (uint16_t)((crc >> 1) ^ 0x8408) : (uint16_t)(crc >> 1);
25 return (uint16_t)~crc;
28size_t detws_nema_ts2_build(uint8_t address, uint8_t control, uint8_t frame_type,
const uint8_t *data,
size_t data_len,
29 uint8_t *out,
size_t cap)
31 if (!out || (data_len && !data))
33 size_t n = 3 + data_len + 2;
40 memcpy(out + 3, data, data_len);
41 uint16_t crc = detws_nema_ts2_crc(out, 3 + data_len);
42 out[3 + data_len] = (uint8_t)crc;
43 out[3 + data_len + 1] = (uint8_t)(crc >> 8);
47bool detws_nema_ts2_parse(
const uint8_t *frame,
size_t len, NemaTs2Frame *out)
49 if (!frame || !out || len < 5)
51 size_t body = len - 2;
52 uint16_t want = detws_nema_ts2_crc(frame, body);
53 uint16_t got = (uint16_t)(frame[body] | (frame[body + 1] << 8));
56 out->address = frame[0];
57 out->control = frame[1];
58 out->frame_type = frame[2];
59 out->data = (body > 3) ? (frame + 3) :
nullptr;
60 out->data_len = body - 3;
NEMA TS 2 traffic-cabinet SDLC frame codec (DETWS_ENABLE_NEMA_TS2).