aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-common
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2021-08-16 17:16:49 +0200
committerGitHub <[email protected]>2021-08-16 17:16:49 +0200
commitcbff0398bb8d59f881e6649e2b3776d9e00af671 (patch)
tree826f554074a11a9bf818eb3f6c6e66644790aba2 /embassy-hal-common
parentc310f18aaf6b42da232d678c38d6199596675840 (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.rs45
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)]
95mod 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}