14uint8_t pc_df1_bcc(
const uint8_t *data,
size_t len)
17 for (
size_t i = 0; i < len; i++)
19 s = (uint8_t)(s + data[i]);
21 return (uint8_t)(0u - s);
33static uint16_t df1_crc_data_plus_etx(
const uint8_t *data,
size_t len, uint8_t etx)
41uint16_t pc_df1_crc(
const uint8_t *data,
size_t len)
46size_t pc_df1_build_frame(uint8_t *buf,
size_t cap,
const uint8_t *data,
size_t data_len, Df1Check check)
48 if (!buf || (data_len && !data))
52 size_t stuffed = data_len;
53 for (
size_t i = 0; i < data_len; i++)
55 if (data[i] == DF1_DLE)
60 size_t checklen = (check == Df1Check::DF1_CHECK_CRC) ? 2 : 1;
61 size_t total = 2 + stuffed + 2 + checklen;
70 for (
size_t i = 0; i < data_len; i++)
73 if (data[i] == DF1_DLE)
81 if (check == Df1Check::DF1_CHECK_CRC)
83 uint16_t c = df1_crc_data_plus_etx(data, data_len, DF1_ETX);
84 buf[p++] = (uint8_t)(c & 0xFF);
85 buf[p++] = (uint8_t)(c >> 8);
89 buf[p++] = pc_df1_bcc(data, data_len);
94bool pc_df1_parse_frame(
const uint8_t *buf,
size_t len, Df1Check check, uint8_t *out,
size_t out_cap,
size_t *out_len)
96 size_t checklen = (check == Df1Check::DF1_CHECK_CRC) ? 2 : 1;
97 if (!buf || !out || len < 4 + checklen)
101 if (buf[0] != DF1_DLE || buf[1] != DF1_STX)
111 if (buf[i] == DF1_DLE)
117 uint8_t next = buf[i + 1];
127 else if (next == DF1_ETX)
152 if (check == Df1Check::DF1_CHECK_CRC)
158 uint16_t c = df1_crc_data_plus_etx(out, o, DF1_ETX);
159 uint16_t got = (uint16_t)(buf[i] | ((uint16_t)buf[i + 1] << 8));
171 if (pc_df1_bcc(out, o) != buf[i])
Parameterized CRC engine - one source of truth for every cyclic redundancy check.
constexpr pc_crc_params PC_CRC16_ARC
CRC-16/ARC (a.k.a. CRC-16, IBM). check = 0xBB3D.
uint32_t pc_crc_final(const pc_crc_params *p, uint32_t crc)
Finish a CRC: apply the output reflection and the final XOR.
uint32_t pc_crc_begin(const pc_crc_params *p)
Start a CRC.
uint32_t pc_crc(const pc_crc_params *p, const uint8_t *data, size_t len)
One-shot CRC of len octets at data.
uint32_t pc_crc_update(const pc_crc_params *p, uint32_t crc, const uint8_t *data, size_t len)
Fold len octets at data into the running register crc.
Allen-Bradley DF1 full-duplex frame codec (PC_ENABLE_DF1) - zero-heap framing + DLE byte-stuffing + B...