19uint8_t checksum(
const uint8_t *from_len, uint16_t n)
22 for (uint16_t i = 0; i < n; i++)
24 c = (uint8_t)(c ^ from_len[i]);
30uint16_t pc_zwave_build_frame(pc_zwave_type type, uint8_t cmd,
const uint8_t *data, uint8_t data_len, uint8_t *out,
37 uint8_t frame_len = (uint8_t)(data_len + 3);
38 uint16_t total = (uint16_t)(2 + frame_len);
43 out[0] = Zwave::ZWAVE_SOF;
45 out[2] = (uint8_t)type;
47 for (uint8_t i = 0; i < data_len; i++)
52 out[1 + frame_len] = checksum(&out[1], frame_len);
56int pc_zwave_parse_frame(
const uint8_t *raw, uint16_t len, uint8_t *type, uint8_t *cmd,
const uint8_t **pdata,
63 if (raw[0] != Zwave::ZWAVE_SOF)
71 uint8_t frame_len = raw[1];
76 uint16_t total = (uint16_t)(2 + frame_len);
81 if (checksum(&raw[1], frame_len) != raw[1 + frame_len])
99 *pdata_len = (uint8_t)(frame_len - 3);
104bool pc_zwave_is_ack(uint8_t b)
106 return b == Zwave::ZWAVE_ACK;
108bool pc_zwave_is_nak(uint8_t b)
110 return b == Zwave::ZWAVE_NAK;
112bool pc_zwave_is_can(uint8_t b)
114 return b == Zwave::ZWAVE_CAN;
117uint16_t pc_zwave_build_ack(uint8_t *out, uint16_t cap)
123 out[0] = Zwave::ZWAVE_ACK;
#define PC_ZWAVE_MAX_DATA
Reject a Z-Wave frame whose declared length exceeds this data cap (sanity).
Z-Wave Serial API frame codec (PC_ENABLE_ZWAVE) - Silicon Labs controller.