diff options
| author | Alexandros Liarokapis <[email protected]> | 2024-09-23 16:50:26 +0300 |
|---|---|---|
| committer | Alexandros Liarokapis <[email protected]> | 2024-10-15 12:29:12 +0300 |
| commit | 82712252166a274c1499c3680b63f86cdfbb8dfb (patch) | |
| tree | 3c3d9a7abbe1677f35c24e11e9fc83d7db8cfdf3 | |
| parent | 85fb890b0025db386459f8b6a573c29f00bf3ed1 (diff) | |
make len method take mut self and remove sync index calls
| -rw-r--r-- | embassy-stm32/src/dma/ringbuffer/mod.rs | 32 |
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 | ||
| 185 | pub struct WritableDmaRingBuffer<'a, W: Word> { | 181 | pub 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)] |
