16#if PC_ENABLE_FANUC_J519
24size_t wr_f32le(uint8_t *p,
float v)
30float rd_f32le(
const uint8_t *p)
39void wr_f32_block(uint8_t *p,
const float *src,
size_t n)
41 for (
size_t k = 0; k < n; k++)
43 wr_f32le(p + 4 * k, src[k]);
46void rd_f32_block(
const uint8_t *p,
float *dst,
size_t n)
48 for (
size_t k = 0; k < n; k++)
50 dst[k] = rd_f32le(p + 4 * k);
55void wr_header(uint8_t *buf, J519Type type, uint32_t version_no)
63bool hdr_ok(
const uint8_t *buf,
size_t len,
size_t want_len, J519Type want_type)
65 return buf && len == want_len &&
pc_rd32le(buf + 0) == (uint32_t)want_type;
71bool pc_j519_peek(
const uint8_t *buf,
size_t len, uint32_t *type, uint32_t *version_no)
90size_t pc_j519_build_start(uint8_t *buf,
size_t cap, uint32_t version_no)
92 if (!buf || cap < PC_J519_LEN_START)
96 wr_header(buf, J519Type::J519_START_OR_STATUS, version_no);
97 return PC_J519_LEN_START;
100size_t pc_j519_build_stop(uint8_t *buf,
size_t cap, uint32_t version_no)
102 if (!buf || cap < PC_J519_LEN_STOP)
106 wr_header(buf, J519Type::J519_STOP, version_no);
107 return PC_J519_LEN_STOP;
110size_t pc_j519_build_motion(uint8_t *buf,
size_t cap,
const J519MotionCommand *cmd)
112 if (!buf || !cmd || cap < PC_J519_LEN_MOTION)
116 wr_header(buf, J519Type::J519_MOTION, cmd->version_no);
118 buf[12] = cmd->last_data;
119 buf[13] = cmd->read_io_type;
122 buf[18] = cmd->data_style;
123 buf[19] = cmd->write_io_type;
124 pc_wr16le(buf + 20, cmd->write_io_index);
126 pc_wr16le(buf + 24, cmd->write_io_value);
128 wr_f32_block(buf + 28, cmd->joint_data, PC_J519_AXES);
129 return PC_J519_LEN_MOTION;
132size_t pc_j519_build_request(uint8_t *buf,
size_t cap,
const J519Request *req)
134 if (!buf || !req || cap < PC_J519_LEN_REQUEST)
138 wr_header(buf, J519Type::J519_REQUEST_OR_ACK, req->version_no);
140 pc_wr32le(buf + 12, req->threshold_type);
141 return PC_J519_LEN_REQUEST;
146bool pc_j519_parse_motion(
const uint8_t *buf,
size_t len, J519MotionCommand *out)
148 if (!out || !hdr_ok(buf, len, PC_J519_LEN_MOTION, J519Type::J519_MOTION))
154 out->last_data = buf[12];
155 out->read_io_type = buf[13];
156 out->read_io_index =
pc_rd16le(buf + 14);
158 out->data_style = buf[18];
159 out->write_io_type = buf[19];
160 out->write_io_index =
pc_rd16le(buf + 20);
161 out->write_io_mask =
pc_rd16le(buf + 22);
162 out->write_io_value =
pc_rd16le(buf + 24);
164 rd_f32_block(buf + 28, out->joint_data, PC_J519_AXES);
168bool pc_j519_parse_request(
const uint8_t *buf,
size_t len, J519Request *out)
170 if (!out || !hdr_ok(buf, len, PC_J519_LEN_REQUEST, J519Type::J519_REQUEST_OR_ACK))
176 out->threshold_type =
pc_rd32le(buf + 12);
182size_t pc_j519_build_status(uint8_t *buf,
size_t cap,
const J519RobotStatus *st)
184 if (!buf || !st || cap < PC_J519_LEN_STATUS)
188 wr_header(buf, J519Type::J519_START_OR_STATUS, st->version_no);
190 buf[12] = st->status;
191 buf[13] = st->read_io_type;
196 wr_f32_block(buf + 24, st->cartesian_pose, PC_J519_AXES);
197 wr_f32_block(buf + 60, st->joint_pose, PC_J519_AXES);
198 wr_f32_block(buf + 96, st->motor_current, PC_J519_AXES);
199 return PC_J519_LEN_STATUS;
202size_t pc_j519_build_ack(uint8_t *buf,
size_t cap,
const J519Ack *ack)
204 if (!buf || !ack || cap < PC_J519_LEN_ACK)
208 wr_header(buf, J519Type::J519_REQUEST_OR_ACK, ack->version_no);
210 pc_wr32le(buf + 12, ack->threshold_type);
211 pc_wr32le(buf + 16, ack->max_cart_speed);
213 wr_f32_block(buf + 24, ack->threshold_no_load, PC_J519_THRESHOLDS);
214 wr_f32_block(buf + 104, ack->threshold_max_load, PC_J519_THRESHOLDS);
215 return PC_J519_LEN_ACK;
220bool pc_j519_parse_status(
const uint8_t *buf,
size_t len, J519RobotStatus *out)
222 if (!out || !hdr_ok(buf, len, PC_J519_LEN_STATUS, J519Type::J519_START_OR_STATUS))
228 out->status = buf[12];
229 out->read_io_type = buf[13];
230 out->read_io_index =
pc_rd16le(buf + 14);
232 out->read_io_value =
pc_rd16le(buf + 18);
234 rd_f32_block(buf + 24, out->cartesian_pose, PC_J519_AXES);
235 rd_f32_block(buf + 60, out->joint_pose, PC_J519_AXES);
236 rd_f32_block(buf + 96, out->motor_current, PC_J519_AXES);
240bool pc_j519_parse_ack(
const uint8_t *buf,
size_t len, J519Ack *out)
242 if (!out || !hdr_ok(buf, len, PC_J519_LEN_ACK, J519Type::J519_REQUEST_OR_ACK))
248 out->threshold_type =
pc_rd32le(buf + 12);
249 out->max_cart_speed =
pc_rd32le(buf + 16);
251 rd_f32_block(buf + 24, out->threshold_no_load, PC_J519_THRESHOLDS);
252 rd_f32_block(buf + 104, out->threshold_max_load, PC_J519_THRESHOLDS);
Fixed-width integer serializers into a raw uint8_t* buffer - one source of truth.
uint32_t pc_rd32le(const uint8_t *p)
Read a little-endian u32 at p.
size_t pc_wr32le(uint8_t *p, uint32_t v)
Write v little-endian at p.
uint16_t pc_rd16le(const uint8_t *p)
Read a little-endian u16 at p.
size_t pc_wr16le(uint8_t *p, uint16_t v)
Write v little-endian at p.
FANUC Stream Motion (option J519) UDP codec (PC_ENABLE_FANUC_J519) - the robot counterpart to the shi...