aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandros Liarokapis <[email protected]>2024-09-23 16:50:26 +0300
committerAlexandros Liarokapis <[email protected]>2024-10-15 12:29:12 +0300
commit82712252166a274c1499c3680b63f86cdfbb8dfb (patch)
tree3c3d9a7abbe1677f35c24e11e9fc83d7db8cfdf3
parent85fb890b0025db386459f8b6a573c29f00bf3ed1 (diff)
make len method take mut self and remove sync index calls
-rw-r--r--embassy-stm32/src/dma/ringbuffer/mod.rs32
1 files changed, 12 insertions, 20 deletions
diff --git a/embassy-stm32/src/dma/ringbuffer/mod.rs b/embassy-stm32/src/dma/ringbuffer/mod.rs
index abc01e3cc..76f7f36ec 100644
--- a/embassy-stm32/src/dma/ringbuffer/mod.rs
+++ b/embassy-stm32/src/dma/ringbuffer/mod.rs
@@ -99,7 +99,10 @@ impl<'a, W: Word> ReadableDmaRingBuffer<'a, W> {
99 } 99 }
100 100
101 /// Get the available readable dma samples. 101 /// Get the available readable dma samples.
102 pub fn len(&self) -> Result<usize, OverrunError> { 102 pub fn len(&mut self, dma: &mut impl DmaCtrl) -> Result<usize, OverrunError> {
103 self.write_index.dma_sync(self.cap(), dma);
104 DmaIndex::normalize(&mut self.write_index, &mut self.read_index);
105
103 let diff: usize = self.write_index.diff(self.cap(), &self.read_index).try_into().unwrap(); 106 let diff: usize = self.write_index.diff(self.cap(), &self.read_index).try_into().unwrap();
104 107
105 if diff > self.cap() { 108 if diff > self.cap() {
@@ -155,13 +158,11 @@ impl<'a, W: Word> ReadableDmaRingBuffer<'a, W> {
155 } 158 }
156 159
157 fn read_raw(&mut self, dma: &mut impl DmaCtrl, buf: &mut [W]) -> Result<(usize, usize), OverrunError> { 160 fn read_raw(&mut self, dma: &mut impl DmaCtrl, buf: &mut [W]) -> Result<(usize, usize), OverrunError> {
158 self.sync_write_index(dma); 161 let readable = self.len(dma)?.min(buf.len());
159 let readable = self.len()?.min(buf.len());
160 for i in 0..readable { 162 for i in 0..readable {
161 buf[i] = self.read_buf(i); 163 buf[i] = self.read_buf(i);
162 } 164 }
163 self.sync_write_index(dma); 165 let available = self.len(dma)?;
164 let available = self.len()?;
165 self.read_index.advance(self.cap(), readable); 166 self.read_index.advance(self.cap(), readable);
166 Ok((readable, available - readable)) 167 Ok((readable, available - readable))
167 } 168 }
@@ -175,11 +176,6 @@ impl<'a, W: Word> ReadableDmaRingBuffer<'a, W> {
175 ) 176 )
176 } 177 }
177 } 178 }
178
179 fn sync_write_index(&mut self, dma: &mut impl DmaCtrl) {
180 self.write_index.dma_sync(self.cap(), dma);
181 DmaIndex::normalize(&mut self.write_index, &mut self.read_index);
182 }
183} 179}
184 180
185pub struct WritableDmaRingBuffer<'a, W: Word> { 181pub struct WritableDmaRingBuffer<'a, W: Word> {
@@ -212,7 +208,10 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
212 } 208 }
213 209
214 /// Get the remaining writable dma samples. 210 /// Get the remaining writable dma samples.
215 pub fn len(&self) -> Result<usize, OverrunError> { 211 pub fn len(&mut self, dma: &mut impl DmaCtrl) -> Result<usize, OverrunError> {
212 self.read_index.dma_sync(self.cap(), dma);
213 DmaIndex::normalize(&mut self.read_index, &mut self.write_index);
214
216 let diff = self.write_index.diff(self.cap(), &self.read_index); 215 let diff = self.write_index.diff(self.cap(), &self.read_index);
217 216
218 if diff < 0 { 217 if diff < 0 {
@@ -271,13 +270,11 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
271 } 270 }
272 271
273 pub fn write_raw(&mut self, dma: &mut impl DmaCtrl, buf: &[W]) -> Result<(usize, usize), OverrunError> { 272 pub fn write_raw(&mut self, dma: &mut impl DmaCtrl, buf: &[W]) -> Result<(usize, usize), OverrunError> {
274 self.sync_read_index(dma); 273 let writable = self.len(dma)?.min(buf.len());
275 let writable = self.len()?.min(buf.len());
276 for i in 0..writable { 274 for i in 0..writable {
277 self.write_buf(i, buf[i]); 275 self.write_buf(i, buf[i]);
278 } 276 }
279 self.sync_read_index(dma); 277 let available = self.len(dma)?;
280 let available = self.len()?;
281 self.write_index.advance(self.cap(), writable); 278 self.write_index.advance(self.cap(), writable);
282 Ok((writable, available - writable)) 279 Ok((writable, available - writable))
283 } 280 }
@@ -292,11 +289,6 @@ impl<'a, W: Word> WritableDmaRingBuffer<'a, W> {
292 ) 289 )
293 } 290 }
294 } 291 }
295
296 fn sync_read_index(&mut self, dma: &mut impl DmaCtrl) {
297 self.read_index.dma_sync(self.cap(), dma);
298 DmaIndex::normalize(&mut self.read_index, &mut self.write_index);
299 }
300} 292}
301 293
302#[cfg(test)] 294#[cfg(test)]