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 pc_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))
51 size_t total = FINS_HEADER_SIZE + 2 + params_len;
56 size_t p = write_header(buf, h);
61 memcpy(buf + p, params, params_len);
67size_t pc_fins_build_memory_area_read(uint8_t *buf,
size_t cap,
const FinsHeader *h, uint8_t area, uint16_t address,
68 uint8_t bit, uint16_t count)
72 params[1] = (uint8_t)(address >> 8);
73 params[2] = (uint8_t)(address & 0xFF);
75 params[4] = (uint8_t)(count >> 8);
76 params[5] = (uint8_t)(count & 0xFF);
77 return pc_fins_build_command(buf, cap, h, FINS_MRC_MEMORY_AREA, FINS_SRC_MEMORY_AREA_READ, params,
sizeof(params));
80size_t pc_fins_build_memory_area_write(uint8_t *buf,
size_t cap,
const FinsHeader *h, uint8_t area, uint16_t address,
81 uint8_t bit, uint16_t count,
const uint8_t *data,
size_t data_len)
83 if (data_len && !data)
89 prefix[1] = (uint8_t)(address >> 8);
90 prefix[2] = (uint8_t)(address & 0xFF);
92 prefix[4] = (uint8_t)(count >> 8);
93 prefix[5] = (uint8_t)(count & 0xFF);
96 pc_fins_build_command(buf, cap, h, FINS_MRC_MEMORY_AREA, FINS_SRC_MEMORY_AREA_WRITE, prefix,
sizeof(prefix));
103 if (n + data_len > cap)
107 memcpy(buf + n, data, data_len);
112size_t pc_fins_build_run(uint8_t *buf,
size_t cap,
const FinsHeader *h, FinsRunMode mode)
117 params[2] = (uint8_t)mode;
118 return pc_fins_build_command(buf, cap, h, FINS_MRC_OPERATING_MODE, FINS_SRC_RUN, params,
sizeof(params));
121size_t pc_fins_build_stop(uint8_t *buf,
size_t cap,
const FinsHeader *h)
123 return pc_fins_build_command(buf, cap, h, FINS_MRC_OPERATING_MODE, FINS_SRC_STOP,
nullptr, 0);
126bool pc_fins_parse_command(
const uint8_t *buf,
size_t len, FinsCommand *out)
128 if (!buf || !out || len < FINS_HEADER_SIZE + 2)
132 read_header(buf, &out->header);
133 out->mrc = buf[FINS_HEADER_SIZE];
134 out->src = buf[FINS_HEADER_SIZE + 1];
135 out->params = buf + FINS_HEADER_SIZE + 2;
136 out->params_len = len - (FINS_HEADER_SIZE + 2);
140bool pc_fins_parse_response(
const uint8_t *buf,
size_t len, FinsResponse *out)
142 if (!buf || !out || len < FINS_HEADER_SIZE + 4)
146 read_header(buf, &out->header);
147 out->mrc = buf[FINS_HEADER_SIZE];
148 out->src = buf[FINS_HEADER_SIZE + 1];
149 out->mres = buf[FINS_HEADER_SIZE + 2];
150 out->sres = buf[FINS_HEADER_SIZE + 3];
151 out->data = buf + FINS_HEADER_SIZE + 4;
152 out->data_len = len - (FINS_HEADER_SIZE + 4);
Omron FINS frame codec (PC_ENABLE_FINS) - zero-heap command/response builder + parser for the Factory...