15uint8_t detws_hart_checksum(
const uint8_t *bytes,
size_t len)
18 for (
size_t i = 0; i < len; i++)
23size_t detws_hart_build(uint8_t delimiter,
const uint8_t *addr,
size_t addr_len, uint8_t command,
const uint8_t *data,
24 size_t data_len, uint8_t *out,
size_t cap)
26 if (addr_len != 1 && addr_len != 5)
28 if (!addr || (data_len && !data))
31 size_t n = 1 + addr_len + 1 + 1 + data_len + 1;
32 if (n > cap || data_len > 0xFF)
37 memcpy(out + i, addr, addr_len);
40 out[i++] = (uint8_t)data_len;
43 memcpy(out + i, data, data_len);
46 out[i] = detws_hart_checksum(out, i);
51bool detws_hart_parse(
const uint8_t *frame,
size_t len, HartFrame *out)
55 size_t addr_len = (frame[0] & HartDelim::HART_DELIM_LONG_ADDR) ? 5 : 1;
57 size_t min = 1 + addr_len + 1 + 1 + 1;
61 size_t bc_idx = 1 + addr_len + 1;
62 uint8_t byte_count = frame[bc_idx];
63 size_t expect = 1 + addr_len + 1 + 1 + byte_count + 1;
67 uint8_t want = detws_hart_checksum(frame, expect - 1);
68 if (want != frame[expect - 1])
71 out->delimiter = frame[0];
72 out->addr = frame + 1;
73 out->addr_len = addr_len;
74 out->command = frame[1 + addr_len];
75 out->byte_count = byte_count;
76 out->data = byte_count ? (frame + bc_idx + 1) : nullptr;
77 out->data_len = byte_count;
81size_t detws_hartip_build_header(uint8_t msg_type, uint8_t msg_id, uint8_t status, uint16_t seq, uint16_t total_len,
82 uint8_t *out,
size_t cap)
84 if (cap < HartIp::HARTIP_HEADER_LEN || !out)
90 out[4] = (uint8_t)(seq >> 8);
91 out[5] = (uint8_t)seq;
92 out[6] = (uint8_t)(total_len >> 8);
93 out[7] = (uint8_t)total_len;
94 return HartIp::HARTIP_HEADER_LEN;
HART / HART-IP process-instrument protocol codec (DETWS_ENABLE_HART).