15#if DETWS_ENABLE_ZIGBEE
19bool is_reserved(uint8_t b)
21 return b == 0x7E || b == 0x7D || b == 0x11 || b == 0x13 || b == 0x18 || b == 0x1A;
24uint16_t crc16_byte(uint16_t crc, uint8_t b)
26 crc ^= (uint16_t)b << 8;
27 for (uint8_t i = 0; i < 8; i++)
28 crc = (crc & 0x8000) ? (uint16_t)((crc << 1) ^ 0x1021) : (uint16_t)(crc << 1);
33bool put_stuffed(uint8_t *out, uint16_t *p, uint16_t cap, uint8_t b)
39 out[(*p)++] = Ash::ASH_ESCAPE;
40 out[(*p)++] = (uint8_t)(b ^ 0x20);
52uint16_t ash_crc16(
const uint8_t *buf, uint16_t len)
54 uint16_t crc = 0xFFFF;
55 for (uint16_t i = 0; i < len; i++)
56 crc = crc16_byte(crc, buf[i]);
60uint16_t ash_frame_encode(uint8_t control,
const uint8_t *payload, uint16_t len, uint8_t *out, uint16_t cap)
65 uint16_t crc = crc16_byte(0xFFFF, control);
66 for (uint16_t i = 0; i < len; i++)
67 crc = crc16_byte(crc, payload[i]);
70 if (!put_stuffed(out, &p, cap, control))
72 for (uint16_t i = 0; i < len; i++)
73 if (!put_stuffed(out, &p, cap, payload[i]))
75 if (!put_stuffed(out, &p, cap, (uint8_t)(crc >> 8)) || !put_stuffed(out, &p, cap, (uint8_t)(crc & 0xFF)))
79 out[p++] = Ash::ASH_FLAG;
83int ash_frame_decode(
const uint8_t *raw, uint16_t len, uint8_t *control, uint8_t *payload, uint16_t pay_cap,
90 while (flag < len && raw[flag] != Ash::ASH_FLAG)
98 for (uint16_t i = 0; i < flag; i++)
101 if (b == Ash::ASH_ESCAPE)
105 b = (uint8_t)(raw[i] ^ 0x20);
113 uint16_t body = (uint16_t)(n - 2);
114 uint16_t crc = ash_crc16(un, body);
115 if ((uint16_t)((un[n - 2] << 8) | un[n - 1]) != crc)
118 uint16_t plen = (uint16_t)(body - 1);
123 for (uint16_t i = 0; i < plen; i++)
124 payload[i] = un[1 + i];
127 return (
int)(flag + 1);
#define DETWS_ZIGBEE_MAX_DATA
Max ASH payload bytes (an EZSP frame; the ASH data field caps near 128).
Zigbee EZSP / ASH framing codec (DETWS_ENABLE_ZIGBEE) - Silicon Labs NCP.