]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de> | |
3 | * | |
4 | * SPDX-License-Identifier: GPL-2.0+ | |
5 | */ | |
6 | ||
7 | #ifndef RING_H | |
8 | #define RING_H | |
9 | ||
10 | struct ring { | |
11 | uint8_t *data; | |
12 | uint_fast8_t mask; | |
13 | volatile uint_fast8_t begin; | |
14 | volatile uint_fast8_t end; | |
15 | }; | |
16 | ||
17 | ||
18 | static inline | |
19 | void ring_init(struct ring *ring, uint8_t *buf, int size) | |
20 | { | |
21 | ring->data = buf; | |
22 | ring->mask = (size-1) & 0xff; | |
23 | ring->begin = 0; | |
24 | ring->end = 0; | |
25 | } | |
26 | ||
27 | static inline | |
28 | int ring_write_ch(struct ring *ring, uint8_t ch) | |
29 | { | |
30 | uint_fast8_t ep = ring->end; | |
31 | ||
32 | ring->data[ep] = ch; | |
33 | ep = (ep + 1) & ring->mask; | |
34 | ||
35 | if ((ep) != ring->begin) { | |
36 | ring->end = ep; | |
37 | return 1; | |
38 | } | |
39 | ||
40 | return -1; | |
41 | } | |
42 | ||
43 | #if 0 | |
44 | static inline | |
45 | int ring_write(struct ring *ring, uint8_t *data, int size) | |
46 | { | |
47 | int i; | |
48 | ||
49 | for (i = 0; i < size; i++) { | |
50 | if (ring_write_ch(ring, data[i]) < 0) | |
51 | return -i; | |
52 | } | |
53 | ||
54 | return i; | |
55 | } | |
56 | #endif | |
57 | ||
58 | static inline | |
59 | int ring_read_ch(struct ring *ring) | |
60 | { | |
61 | int ret = -1; | |
62 | uint_fast8_t bp = ring->begin; | |
63 | ||
64 | if (bp != ring->end) { | |
65 | ret = ring->data[bp]; | |
66 | ring->begin = (bp + 1) & ring->mask; | |
67 | } | |
68 | ||
69 | return ret; | |
70 | } | |
71 | ||
72 | ||
73 | static inline | |
74 | int_fast8_t ring_is_empty(struct ring *ring) | |
75 | { | |
76 | return ring->begin == ring->end; | |
77 | } | |
78 | ||
79 | #endif /* RING_H */ |