14#if DETWS_ENABLE_ENOCEAN
18uint8_t esp3_crc8(
const uint8_t *buf, uint16_t len)
21 for (uint16_t i = 0; i < len; i++)
24 for (uint8_t b = 0; b < 8; b++)
25 crc = (crc & 0x80) ? (uint8_t)((crc << 1) ^ 0x07) : (uint8_t)(crc << 1);
30int esp3_parse(
const uint8_t *raw, uint16_t len, esp3_packet *out)
34 if (raw[0] != ESP3_SYNC)
38 uint16_t data_len = (uint16_t)((raw[1] << 8) | raw[2]);
39 uint8_t opt_len = raw[3];
40 uint8_t type = raw[4];
43 if (esp3_crc8(&raw[1], 4) != raw[5])
45 uint32_t total = 6u + data_len + opt_len + 1u;
48 if (esp3_crc8(&raw[6], (uint16_t)(data_len + opt_len)) != raw[6 + data_len + opt_len])
52 out->type = (esp3_type)type;
54 out->data_len = data_len;
55 out->opt = &raw[6 + data_len];
56 out->opt_len = opt_len;
61uint16_t esp3_build(esp3_type type,
const uint8_t *data, uint16_t data_len,
const uint8_t *opt, uint8_t opt_len,
62 uint8_t *out, uint16_t cap)
66 uint32_t total = 6u + data_len + opt_len + 1u;
70 out[1] = (uint8_t)(data_len >> 8);
71 out[2] = (uint8_t)(data_len & 0xFF);
73 out[4] = (uint8_t)type;
74 out[5] = esp3_crc8(&out[1], 4);
75 for (uint16_t i = 0; i < data_len; i++)
77 for (uint8_t i = 0; i < opt_len; i++)
78 out[6 + data_len + i] = opt[i];
79 out[6 + data_len + opt_len] = esp3_crc8(&out[6], (uint16_t)(data_len + opt_len));
80 return (uint16_t)total;
#define DETWS_ENOCEAN_MAX_DATA
Reject an ESP3 telegram whose declared data length exceeds this (framing sanity).
EnOcean ESP3 serial codec (DETWS_ENABLE_ENOCEAN) - energy-harvesting 868 MHz.