8 p[0] =
static_cast<uint8_t
>(v & 0xFFu);
9 p[1] =
static_cast<uint8_t
>(v >> 8);
13 p[0] =
static_cast<uint8_t
>(v & 0xFFu);
14 p[1] =
static_cast<uint8_t
>((v >> 8) & 0xFFu);
15 p[2] =
static_cast<uint8_t
>((v >> 16) & 0xFFu);
16 p[3] =
static_cast<uint8_t
>(v >> 24);
20 return static_cast<uint16_t
>(
static_cast<uint16_t
>(
p[0]) |
21 (
static_cast<uint16_t
>(
p[1]) << 8));
25 return static_cast<uint32_t
>(
p[0]) | (
static_cast<uint32_t
>(
p[1]) << 8) |
26 (
static_cast<uint32_t
>(
p[2]) << 16) |
27 (
static_cast<uint32_t
>(
p[3]) << 24);
30uint16_t
crc16(
const uint8_t* data,
size_t len) {
31 uint16_t crc = 0xFFFFu;
32 for (
size_t i = 0; i < len; i++) {
33 crc ^=
static_cast<uint16_t
>(
static_cast<uint16_t
>(data[i]) << 8);
34 for (
int b = 0;
b < 8;
b++) {
35 const uint16_t shifted =
static_cast<uint16_t
>(crc << 1);
36 crc = (crc & 0x8000u) ?
static_cast<uint16_t
>(shifted ^ 0x1021u)
73 const uint8_t plen = buf[4];
82 const int want = payload_len_for(buf[1]);
86 if (
static_cast<int>(plen) != want) {
89 out.type =
static_cast<FrameType>(buf[1]);
91 out.payload_len = plen;
97 uint8_t payload_len, uint8_t* out,
size_t out_cap,
99 if (out ==
nullptr || (
payload ==
nullptr && payload_len > 0)) {
102 const int want = payload_len_for(
static_cast<uint8_t
>(type));
106 if (
static_cast<int>(payload_len) != want) {
110 if (out_cap < total) {
114 out[1] =
static_cast<uint8_t
>(type);
116 out[4] = payload_len;
117 if (payload_len > 0) {
Over-the-air frame format for the LoRa command link.
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
int payload_len_for(uint8_t type)
constexpr uint8_t kUnArmLen
void put_u16(uint8_t *p, uint16_t v)
constexpr uint8_t kSelfTestLen
FrameStatus encode_frame(FrameType type, uint16_t seq, const uint8_t *payload, uint8_t payload_len, uint8_t *out, size_t out_cap, size_t &out_len)
Build a frame into out[0..out_cap).
void put_u32(uint8_t *p, uint32_t v)
uint16_t crc16(const uint8_t *data, size_t len)
CRC-16/CCITT-FALSE: poly 0x1021, init 0xFFFF, no reflection, no xorout.
constexpr uint8_t kHeartbeatLen
Required payload length per type.
constexpr uint8_t kFrameVersion
FrameStatus decode_frame(const uint8_t *buf, size_t len, Frame &out)
Parse and validate a received packet.
constexpr size_t kFrameHeaderLen
uint32_t get_u32(const uint8_t *p)
constexpr uint8_t kArmLen
uint16_t get_u16(const uint8_t *p)
constexpr size_t kFrameOverhead
constexpr size_t kFrameMaxPayload