1const RING_BUFFER_SIZE: usize = 256;
5
6#[derive(Copy, Clone, PartialEq)]
8enum BufferStatus {
9 FULL,
10 EMPTY,
11 NORMAL,
12}
13
14pub struct RingBuffer {
16 arr: [u8; RING_BUFFER_SIZE],
17 head: usize,
18 tail: usize,
19 status: BufferStatus,
20}
21
22impl RingBuffer {
23 pub fn new() -> Self {
25 RingBuffer {
26 arr: [0; RING_BUFFER_SIZE],
27 head: 0,
28 tail: 0,
29 status: BufferStatus::EMPTY,
30 }
31 }
32
33 pub fn read_byte(&mut self) -> Option<u8> {
35 if self.status == BufferStatus::EMPTY {
36 return None;
37 }
38 let byte = self.arr[self.tail];
39 self.tail = (self.tail + 1) % RING_BUFFER_SIZE;
40 if self.tail == self.head {
41 self.status = BufferStatus::EMPTY;
42 } else {
43 self.status = BufferStatus::NORMAL;
44 }
45 Some(byte)
46 }
47
48 pub fn write_byte(&mut self, byte: u8) -> Result<(), ()> {
50 if self.status == BufferStatus::FULL {
51 return Err(());
52 }
53 self.arr[self.head] = byte;
54 self.head = (self.head + 1) % RING_BUFFER_SIZE;
55 if self.head == self.tail {
56 self.status = BufferStatus::FULL;
57 } else {
58 self.status = BufferStatus::NORMAL;
59 }
60 Ok(())
61 }
62
63 pub fn available_space(&self) -> usize {
65 match self.status {
66 BufferStatus::FULL => 0,
67 BufferStatus::EMPTY => RING_BUFFER_SIZE,
68 BufferStatus::NORMAL => {
69 if self.head >= self.tail {
70 RING_BUFFER_SIZE - (self.head - self.tail)
71 } else {
72 self.tail - self.head
73 }
74 }
75 }
76 }
77}