7 // NOTE: buffer size must be 2^n and up to 255. size_mask should be 2^n - 1 due to using &(AND) instead of %(modulo)
15 static inline void ringbuf_init(ringbuf_t *buf, uint8_t *array, uint8_t size);
16 static inline int16_t ringbuf_get(ringbuf_t *buf);
17 static inline bool ringbuf_put(ringbuf_t *buf, uint8_t data);
18 static inline void ringbuf_write(ringbuf_t *buf, uint8_t data);
19 static inline bool ringbuf_is_empty(ringbuf_t *buf);
20 static inline bool ringbuf_is_full(ringbuf_t *buf);
21 static inline void ringbuf_reset(ringbuf_t *buf);
23 static inline void ringbuf_init(ringbuf_t *buf, uint8_t *array, uint8_t size)
28 buf->size_mask = size - 1;
30 static inline int16_t ringbuf_get(ringbuf_t *buf)
32 if (ringbuf_is_empty(buf)) return -1;
33 uint8_t data = buf->buffer[buf->tail];
35 buf->tail &= buf->size_mask;
38 static inline bool ringbuf_put(ringbuf_t *buf, uint8_t data)
40 if (ringbuf_is_full(buf)) {
43 buf->buffer[buf->head] = data;
45 buf->head &= buf->size_mask;
48 // this overrides data in buffer when it is full
49 static inline void ringbuf_write(ringbuf_t *buf, uint8_t data)
51 buf->buffer[buf->head] = data;
53 buf->head &= buf->size_mask;
54 // eat tail: override data yet to be consumed
55 if (buf->head == buf->tail) {
57 buf->tail &= buf->size_mask;
60 static inline bool ringbuf_is_empty(ringbuf_t *buf)
62 return (buf->head == buf->tail);
64 static inline bool ringbuf_is_full(ringbuf_t *buf)
66 return (((buf->head + 1) & buf->size_mask) == buf->tail);
68 static inline void ringbuf_reset(ringbuf_t *buf)