rcbench
Servo and ESC test bench: panel, IOmcu and shared C
Loading...
Searching...
No Matches
hitec_wire.h
Go to the documentation of this file.
1
38
39#ifndef HITEC_WIRE_H
40#define HITEC_WIRE_H
41
42#include <stdbool.h>
43#include <stddef.h>
44#include <stdint.h>
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50/* --- families ------------------------------------------------------------- */
51
53typedef enum {
55 HITEC_D = 1,
57
72
74#define HITEC_C_BIT_RATE 19200u
76#define HITEC_D_BIT_RATE 115200u
77
85uint32_t hitec_bit_rate(uint8_t family);
86
95uint32_t hitec_bits_ns(uint8_t family, uint32_t bits);
96
97/* --- classic frames ------------------------------------------------------- */
98
100#define HITEC_C_FRAME_LEN 4u
101
108#define HITEC_C_READ_EEPROM 0x61u
109#define HITEC_C_WRITE_EEPROM 0x62u
110#define HITEC_C_READ_RAM 0x63u
111#define HITEC_C_WRITE_RAM 0x64u
112#define HITEC_C_READ_POSITION 0x65u
113#define HITEC_C_MOVE 0x66u
114#define HITEC_C_FIRST 0x67u
116
117#define HITEC_C_ACK 0x2Bu
118#define HITEC_C_NAK 0x2Du
119
128uint8_t hitec_c_sum(uint8_t cmd, uint8_t p1, uint8_t p2);
129
138void hitec_c_frame(uint8_t cmd, uint8_t p1, uint8_t p2,
139 uint8_t out[HITEC_C_FRAME_LEN]);
140
147bool hitec_c_frame_ok(const uint8_t frame[HITEC_C_FRAME_LEN]);
148
149/* --- D series frames ------------------------------------------------------ */
150
152#define HITEC_D_HEADER_REQUEST 0x96u
153#define HITEC_D_HEADER_ANSWER 0x69u
154#define HITEC_D_READ_LEN 5u
155#define HITEC_D_WRITE_LEN 7u
156#define HITEC_D_ANSWER_LEN 7u
158#define HITEC_D_DATA_LEN 2u
159
167uint8_t hitec_d_sum(const uint8_t *bytes, size_t n);
168
176void hitec_d_read_frame(uint8_t id, uint8_t addr,
177 uint8_t out[HITEC_D_READ_LEN]);
178
187void hitec_d_write_frame(uint8_t id, uint8_t addr, uint16_t value,
188 uint8_t out[HITEC_D_WRITE_LEN]);
189
190/* --- transactions --------------------------------------------------------- */
191
201
202#define HITEC_TX_MAX 8u
203#define HITEC_GAP_MAX 6u
204#define HITEC_RX_MAX 16u
206#define HITEC_TIME_MAX_US 4000000u
207
233typedef struct {
234 uint8_t kind;
235 uint8_t family;
236 uint8_t n_tx;
237 uint8_t gap_bits;
238 uint8_t tx[HITEC_TX_MAX];
239 uint8_t max_rx;
240 uint8_t answer;
241 uint8_t answer_byte;
242 uint8_t level;
243 uint32_t lead_us;
244 uint32_t window_us;
245 uint32_t level_us;
247
257bool hitec_xfer_valid(const hitec_xfer_t *x);
258
259/* --- classic transactions ------------------------------------------------- */
260
267#define HITEC_C_GAP_BITS 1u
272#define HITEC_C_ARM_BITS 9u
281#define HITEC_C_REPLY_MIN_NS 494792u
282#define HITEC_C_REPLY_MAX_NS 1000000u
284#define HITEC_C_WINDOW_US 1500u
286#define HITEC_C_REPLY_LEN 2u
287
297void hitec_c_xfer(uint8_t cmd, uint8_t p1, uint8_t p2, hitec_xfer_t *out);
298
299/* --- D series transactions ------------------------------------------------ */
300
305#define HITEC_D_LEAD_US 88u
309#define HITEC_D_SETTLE_BITS 1u
318#define HITEC_D_ANSWER_MIN_NS 2000000u
319#define HITEC_D_ANSWER_MAX_NS 20000000u
321#define HITEC_D_WINDOW_US 25000u
326#define HITEC_D_READ_RX 8u
327
336void hitec_d_read_xfer(uint8_t id, uint8_t addr, hitec_xfer_t *out);
337
346void hitec_d_write_xfer(uint8_t id, uint8_t addr, uint16_t value,
347 hitec_xfer_t *out);
348
349/* --- listen and level ----------------------------------------------------- */
350
365bool hitec_listen_xfer(uint8_t family, uint32_t window_us, uint8_t max_rx,
366 bool answer, uint8_t answer_byte, hitec_xfer_t *out);
367
379bool hitec_level_xfer(uint8_t family, uint8_t level, uint32_t time_us,
380 hitec_xfer_t *out);
381
382/* --- capture -------------------------------------------------------------- */
383
385typedef struct {
392 uint32_t at_ns;
393 uint8_t value;
394 uint8_t framing;
396
398typedef struct {
401 uint32_t window_ns;
402 uint8_t family;
403 uint8_t n;
404 uint8_t full;
405 uint8_t answered;
407 uint8_t overflow;
409 uint8_t aborted;
411
412/* --- decoders ------------------------------------------------------------- */
413
438
446#define HITEC_NEXT_MIN_HALF_BITS 19u
447#define HITEC_NEXT_MAX_HALF_BITS 30u
448
455
465bool hitec_c_expect_of(uint8_t cmd, hitec_c_expect_t *out);
466
468typedef struct {
469 uint16_t value;
470 uint8_t id;
471 uint8_t n;
477 uint32_t delay_ns;
479
494 hitec_reply_t *out);
495
511hitec_rx_t hitec_d_decode(const hitec_capture_t *cap, uint8_t addr,
512 hitec_reply_t *out);
513
526hitec_rx_t hitec_listen_decode(const hitec_capture_t *cap, uint8_t want,
527 hitec_reply_t *out);
528
529/* --- driver --------------------------------------------------------------- */
530
544typedef struct {
545 void *ctx;
546 bool (*start)(void *ctx, const hitec_xfer_t *xfer);
555 bool (*poll)(void *ctx, hitec_capture_t *out);
556 uint32_t (*now_us)(void *ctx);
558
566uint32_t hitec_elapsed_us(uint32_t now, uint32_t since);
567
580bool hitec_due(uint32_t now, uint32_t since, uint32_t span_us);
581
582#ifdef __cplusplus
583}
584#endif
585
586#endif /* HITEC_WIRE_H */
void hitec_c_frame(uint8_t cmd, uint8_t p1, uint8_t p2, uint8_t out[HITEC_C_FRAME_LEN])
The 4 bytes of a classic command.
Definition hitec_wire.c:43
uint8_t hitec_d_sum(const uint8_t *bytes, size_t n)
The low byte of the sum of the n bytes at bytes.
Definition hitec_wire.c:59
void hitec_d_read_xfer(uint8_t id, uint8_t addr, hitec_xfer_t *out)
A read and its answer: lead, 5 bytes back to back, HITEC_D_WINDOW_US, HITEC_D_READ_RX bytes.
Definition hitec_wire.c:145
uint8_t hitec_c_sum(uint8_t cmd, uint8_t p1, uint8_t p2)
The byte that makes cmd p1 p2 sum sum to 0 modulo 256.
Definition hitec_wire.c:38
uint32_t hitec_elapsed_us(uint32_t now, uint32_t since)
Microseconds from since to now on a clock that wraps at 2^32.
Definition hitec_wire.c:441
void hitec_c_xfer(uint8_t cmd, uint8_t p1, uint8_t p2, hitec_xfer_t *out)
A command and its 2-byte reply: 4 bytes, HITEC_C_GAP_BITS between them, HITEC_C_WINDOW_US,...
Definition hitec_wire.c:134
bool hitec_xfer_valid(const hitec_xfer_t *x)
True when x is a transaction a driver runs: every field in its range, LISTEN with a window,...
Definition hitec_wire.c:93
uint32_t hitec_bits_ns(uint8_t family, uint32_t bits)
bits bit times of family in ns, rounded to nearest; 0 for an unknown family.
Definition hitec_wire.c:26
void hitec_d_write_xfer(uint8_t id, uint8_t addr, uint16_t value, hitec_xfer_t *out)
A write: lead, 7 bytes back to back, nothing received.
Definition hitec_wire.c:156
bool hitec_level_xfer(uint8_t family, uint8_t level, uint32_t time_us, hitec_xfer_t *out)
A LEVEL of level for time_us.
Definition hitec_wire.c:185
void hitec_d_read_frame(uint8_t id, uint8_t addr, uint8_t out[HITEC_D_READ_LEN])
96 id addr 00 sum.
Definition hitec_wire.c:69
bool hitec_c_frame_ok(const uint8_t frame[HITEC_C_FRAME_LEN])
True when the 4 bytes at frame sum to 0 modulo 256.
Definition hitec_wire.c:52
hitec_rx_t hitec_c_decode(const hitec_capture_t *cap, hitec_c_expect_t expect, hitec_reply_t *out)
Decode a classic reply.
Definition hitec_wire.c:294
void hitec_d_write_frame(uint8_t id, uint8_t addr, uint16_t value, uint8_t out[HITEC_D_WRITE_LEN])
96 id addr 02 lo hi sum, value little endian.
Definition hitec_wire.c:79
uint32_t hitec_bit_rate(uint8_t family)
Bit rate of family in bit/s; 0 for a family this module does not have.
Definition hitec_wire.c:15
bool hitec_c_expect_of(uint8_t cmd, hitec_c_expect_t *out)
The reply cmd has.
Definition hitec_wire.c:204
bool hitec_due(uint32_t now, uint32_t since, uint32_t span_us)
True when span_us or more have passed from since to now, also across the wrap of the clock.
Definition hitec_wire.c:446
hitec_rx_t hitec_d_decode(const hitec_capture_t *cap, uint8_t addr, hitec_reply_t *out)
Decode a D series answer to a read of addr.
Definition hitec_wire.c:355
bool hitec_listen_xfer(uint8_t family, uint32_t window_us, uint8_t max_rx, bool answer, uint8_t answer_byte, hitec_xfer_t *out)
A LISTEN of window_us for up to max_rx bytes; with answer set the first byte is answered with answer_...
Definition hitec_wire.c:166
hitec_rx_t hitec_listen_decode(const hitec_capture_t *cap, uint8_t want, hitec_reply_t *out)
Decode a listen for the byte want, as the classic entry's +: abort, overflow, a byte at all,...
Definition hitec_wire.c:409
#define HITEC_RX_MAX
Definition hitec_wire.h:204
hitec_c_expect_t
The reply shape a classic command expects.
Definition hitec_wire.h:450
@ HITEC_C_EXPECT_VALUE
Definition hitec_wire.h:451
@ HITEC_C_EXPECT_WORD
Definition hitec_wire.h:453
@ HITEC_C_EXPECT_ACK
Definition hitec_wire.h:452
hitec_family_t
The two servo families.
Definition hitec_wire.h:53
@ HITEC_CLASSIC
Definition hitec_wire.h:54
@ HITEC_D
Definition hitec_wire.h:55
#define HITEC_D_WRITE_LEN
Definition hitec_wire.h:155
hitec_drive_t
How the master drives the line.
Definition hitec_wire.h:63
@ HITEC_DRIVE_OPEN_DRAIN
The pad drives low and is released for high: classic toward the servo's high level,...
Definition hitec_wire.h:68
@ HITEC_DRIVE_PUSH_PULL
D series only: the pad drives both levels while it sends.
Definition hitec_wire.h:70
hitec_kind_t
The kind of a transaction.
Definition hitec_wire.h:193
@ HITEC_XFER_LISTEN
Receive only; the first byte may be answered with one byte.
Definition hitec_wire.h:197
@ HITEC_XFER_SEND
Send 1 to HITEC_TX_MAX bytes, then receive.
Definition hitec_wire.h:195
@ HITEC_XFER_LEVEL
Hold the line at one level for a time, then release it.
Definition hitec_wire.h:199
#define HITEC_TX_MAX
Definition hitec_wire.h:202
#define HITEC_D_READ_LEN
Definition hitec_wire.h:154
#define HITEC_C_FRAME_LEN
Bytes of a classic frame.
Definition hitec_wire.h:100
hitec_rx_t
Result of a decoder.
Definition hitec_wire.h:419
@ HITEC_RX_ERR_HEADER
Definition hitec_wire.h:434
@ HITEC_RX_ERR_SUM
Definition hitec_wire.h:436
@ HITEC_RX_ERR_GAP
Definition hitec_wire.h:431
@ HITEC_RX_OK
Definition hitec_wire.h:420
@ HITEC_RX_ERR_EARLY
Definition hitec_wire.h:425
@ HITEC_RX_ERR_OVERFLOW
Definition hitec_wire.h:423
@ HITEC_RX_ERR_ADDRESS
Definition hitec_wire.h:435
@ HITEC_RX_ERR_LATE
Definition hitec_wire.h:426
@ HITEC_RX_ERR_SILENT
Definition hitec_wire.h:424
@ HITEC_RX_ERR_LENGTH
Definition hitec_wire.h:428
@ HITEC_RX_ERR_NAK
Definition hitec_wire.h:427
@ HITEC_RX_ERR_ARG
Definition hitec_wire.h:421
@ HITEC_RX_ERR_FRAMING
Definition hitec_wire.h:430
@ HITEC_RX_ERR_ACK
Definition hitec_wire.h:433
@ HITEC_RX_ERR_ABORTED
Definition hitec_wire.h:422
What the receiver took, in the order the bytes came.
Definition hitec_wire.h:398
uint8_t family
Definition hitec_wire.h:402
uint8_t answered
Definition hitec_wire.h:405
uint8_t overflow
Definition hitec_wire.h:407
uint8_t full
Definition hitec_wire.h:404
uint8_t aborted
Definition hitec_wire.h:409
uint8_t n
Definition hitec_wire.h:403
uint32_t window_ns
Definition hitec_wire.h:401
A pin driver.
Definition hitec_wire.h:544
void * ctx
Definition hitec_wire.h:545
bool(*) start(void *ctx, const hitec_xfer_t *xfer)
Definition hitec_wire.h:546
uint32_t(*) now_us(void *ctx)
Definition hitec_wire.h:556
bool(*) poll(void *ctx, hitec_capture_t *out)
Reports the end of a run: false while it runs; true once, with out filled, after it has ended.
Definition hitec_wire.h:555
A decoded reply.
Definition hitec_wire.h:468
uint16_t value
Definition hitec_wire.h:469
uint8_t id
Definition hitec_wire.h:470
uint8_t n
Definition hitec_wire.h:471
uint32_t delay_ns
The first byte's start bit, from the start of the master's last byte (classic), the end of its last s...
Definition hitec_wire.h:477
One received byte.
Definition hitec_wire.h:385
uint8_t value
Definition hitec_wire.h:393
uint32_t at_ns
The start bit's leading edge, in ns from the receiver's start: the release after a SEND (classic: the...
Definition hitec_wire.h:392
uint8_t framing
Definition hitec_wire.h:394
One transaction.
Definition hitec_wire.h:233
uint8_t tx[HITEC_TX_MAX]
Definition hitec_wire.h:238
uint8_t family
Definition hitec_wire.h:235
uint8_t level
Definition hitec_wire.h:242
uint8_t gap_bits
Definition hitec_wire.h:237
uint8_t max_rx
Definition hitec_wire.h:239
uint32_t window_us
Definition hitec_wire.h:244
uint32_t level_us
Definition hitec_wire.h:245
uint8_t n_tx
Definition hitec_wire.h:236
uint32_t lead_us
Definition hitec_wire.h:243
uint8_t answer_byte
Definition hitec_wire.h:241
uint8_t answer
Definition hitec_wire.h:240
uint8_t kind
Definition hitec_wire.h:234