diff options
| author | Ulf Lilleengen <[email protected]> | 2021-08-16 17:16:49 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-08-16 17:16:49 +0200 |
| commit | cbff0398bb8d59f881e6649e2b3776d9e00af671 (patch) | |
| tree | 826f554074a11a9bf818eb3f6c6e66644790aba2 /embassy-hal-common | |
| parent | c310f18aaf6b42da232d678c38d6199596675840 (diff) | |
Add IRQ-driven buffered USART implementation for STM32 v2 usart (#356)
* Add IRQ-driven buffered USART implementation for STM32 v2 usart
* Implementation based on nRF UARTE, but simplified to not use DMA to
avoid complex interaction between DMA and USART.
* Implementation of AsyncBufRead and AsyncWrite traits
* Some unit tests to ring buffer
* Update polyfill version
* Update sub module to get usart IRQ fix
Diffstat (limited to 'embassy-hal-common')
| -rw-r--r-- | embassy-hal-common/src/ring_buffer.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/embassy-hal-common/src/ring_buffer.rs b/embassy-hal-common/src/ring_buffer.rs index 18795787f..6829f62f5 100644 --- a/embassy-hal-common/src/ring_buffer.rs +++ b/embassy-hal-common/src/ring_buffer.rs | |||
| @@ -67,6 +67,14 @@ impl<'a> RingBuffer<'a> { | |||
| 67 | self.empty = self.start == self.end; | 67 | self.empty = self.start == self.end; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | pub fn is_full(&self) -> bool { | ||
| 71 | self.start == self.end && !self.empty | ||
| 72 | } | ||
| 73 | |||
| 74 | pub fn is_empty(&self) -> bool { | ||
| 75 | self.empty | ||
| 76 | } | ||
| 77 | |||
| 70 | pub fn clear(&mut self) { | 78 | pub fn clear(&mut self) { |
| 71 | self.start = 0; | 79 | self.start = 0; |
| 72 | self.end = 0; | 80 | self.end = 0; |
| @@ -82,3 +90,40 @@ impl<'a> RingBuffer<'a> { | |||
| 82 | } | 90 | } |
| 83 | } | 91 | } |
| 84 | } | 92 | } |
| 93 | |||
| 94 | #[cfg(test)] | ||
| 95 | mod tests { | ||
| 96 | use super::*; | ||
| 97 | |||
| 98 | #[test] | ||
| 99 | fn push_pop() { | ||
| 100 | let mut b = [0; 4]; | ||
| 101 | let mut rb = RingBuffer::new(&mut b); | ||
| 102 | let buf = rb.push_buf(); | ||
| 103 | assert_eq!(4, buf.len()); | ||
| 104 | buf[0] = 1; | ||
| 105 | buf[1] = 2; | ||
| 106 | buf[2] = 3; | ||
| 107 | buf[3] = 4; | ||
| 108 | rb.push(4); | ||
| 109 | |||
| 110 | let buf = rb.pop_buf(); | ||
| 111 | assert_eq!(4, buf.len()); | ||
| 112 | assert_eq!(1, buf[0]); | ||
| 113 | rb.pop(1); | ||
| 114 | |||
| 115 | let buf = rb.pop_buf(); | ||
| 116 | assert_eq!(3, buf.len()); | ||
| 117 | assert_eq!(2, buf[0]); | ||
| 118 | rb.pop(1); | ||
| 119 | |||
| 120 | let buf = rb.pop_buf(); | ||
| 121 | assert_eq!(2, buf.len()); | ||
| 122 | assert_eq!(3, buf[0]); | ||
| 123 | rb.pop(1); | ||
| 124 | |||
| 125 | let buf = rb.pop_buf(); | ||
| 126 | assert_eq!(1, buf.len()); | ||
| 127 | assert_eq!(4, buf[0]); | ||
| 128 | } | ||
| 129 | } | ||
