15static size_t write_header(uint8_t *buf,
const FinsHeader *h)
27 return FINS_HEADER_SIZE;
30static void read_header(
const uint8_t *buf, FinsHeader *h)
44size_t fins_build_command(uint8_t *buf,
size_t cap,
const FinsHeader *h, uint8_t mrc, uint8_t src,
45 const uint8_t *params,
size_t params_len)
47 if (!buf || !h || (params_len && !params))
49 size_t total = FINS_HEADER_SIZE + 2 + params_len;
52 size_t p = write_header(buf, h);
57 memcpy(buf + p, params, params_len);
63size_t fins_build_memory_area_read(uint8_t *buf,
size_t cap,
const FinsHeader *h, uint8_t area, uint16_t address,
64 uint8_t bit, uint16_t count)
68 params[1] = (uint8_t)(address >> 8);
69 params[2] = (uint8_t)(address & 0xFF);
71 params[4] = (uint8_t)(count >> 8);
72 params[5] = (uint8_t)(count & 0xFF);
73 return fins_build_command(buf, cap, h, FINS_MRC_MEMORY_AREA, FINS_SRC_MEMORY_AREA_READ, params,
sizeof(params));
76bool fins_parse_command(
const uint8_t *buf,
size_t len, FinsCommand *out)
78 if (!buf || !out || len < FINS_HEADER_SIZE + 2)
80 read_header(buf, &out->header);
81 out->mrc = buf[FINS_HEADER_SIZE];
82 out->src = buf[FINS_HEADER_SIZE + 1];
83 out->params = buf + FINS_HEADER_SIZE + 2;
84 out->params_len = len - (FINS_HEADER_SIZE + 2);
88bool fins_parse_response(
const uint8_t *buf,
size_t len, FinsResponse *out)
90 if (!buf || !out || len < FINS_HEADER_SIZE + 4)
92 read_header(buf, &out->header);
93 out->mrc = buf[FINS_HEADER_SIZE];
94 out->src = buf[FINS_HEADER_SIZE + 1];
95 out->mres = buf[FINS_HEADER_SIZE + 2];
96 out->sres = buf[FINS_HEADER_SIZE + 3];
97 out->data = buf + FINS_HEADER_SIZE + 4;
98 out->data_len = len - (FINS_HEADER_SIZE + 4);
Omron FINS frame codec (DETWS_ENABLE_FINS) - zero-heap command/response builder + parser for the Fact...