diff options
author | Karl Palsson <karlp@tweak.net.au> | 2016-09-26 22:04:02 +0000 |
---|---|---|
committer | Karl Palsson <karlp@tweak.net.au> | 2016-09-26 22:04:02 +0000 |
commit | c0ec94e4c94371d22c334396c5d937d0a682de78 (patch) | |
tree | 8fbf2576d64ebc3cb708b08c63e5863fe2c220d2 /tests/usb-serial-rs485/ringb.c | |
parent | 19d3225fd66573a2a62ece83158cd5551255f2ad (diff) | |
download | olsndot-c0ec94e4c94371d22c334396c5d937d0a682de78.tar.gz olsndot-c0ec94e4c94371d22c334396c5d937d0a682de78.tar.bz2 olsndot-c0ec94e4c94371d22c334396c5d937d0a682de78.zip |
ubs-serial-rs485: First solidly working version.
Needs major refactoring to split out the _actual_ arch dependent pieces.
Needs parity and more complete baud rate support.
Needs rs485 support.
Diffstat (limited to 'tests/usb-serial-rs485/ringb.c')
-rw-r--r-- | tests/usb-serial-rs485/ringb.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/usb-serial-rs485/ringb.c b/tests/usb-serial-rs485/ringb.c new file mode 100644 index 0000000..245325b --- /dev/null +++ b/tests/usb-serial-rs485/ringb.c @@ -0,0 +1,59 @@ + +#include "ringb.h" +void ringb_init(struct ringb *ring, uint8_t *buf, int len) +{ + ring->buf_len = len; + ring->buf = buf; + ring->idx_r = 0; + ring->idx_w = 0; +} + +int ringb_get(struct ringb *ring) { +#if 1 + int rval; + if (ring->idx_r != ring->idx_w) { + rval = ring->buf[ring->idx_r]; + ring->idx_r = (ring->idx_r + 1) % ring->buf_len; + return rval; + } + return -1; +#else + if (((ring->idx_w - ring->idx_r) % ring->buf_len) >= 0) { + int rval = ring->buf[ring->idx_r]; + ring->idx_r = (ring->idx_r + 1) % ring->buf_len; + return rval; + } else { + return -1; + } +#endif +} + +bool ringb_put(struct ringb *ring, uint8_t c) { +#if 1 + unsigned int next = (ring->idx_w + 1) % ring->buf_len; + if (next != ring->idx_r) { + ring->buf[ring->idx_w] = c; + ring->idx_w = next; + return true; + } + return false; +#else + if (((ring->idx_w - ring->idx_r) % ring->buf_len) == 0) { + return false; + } + ring->buf[ring->idx_w] = c; + ring->idx_w = (ring->idx_w + 1) % ring->buf_len; + return true; +#endif + +} + + +void ringb_flush(struct ringb *ring) { + ring->idx_r = 0; + ring->idx_w = 0; +} + +int ringb_depth(struct ringb *ring) { + return ((unsigned int)(ring->idx_w - ring->idx_r) % ring->buf_len); +}
\ No newline at end of file |