mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-21 22:32:29 +00:00
Merge pull request #3451 from dvdsk/read_ready
stm32/uart impl ReadReady for RingbufferdUart
This commit is contained in:
commit
089b8a482e
@ -21,6 +21,10 @@ pub trait DmaCtrl {
|
|||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
Overrun,
|
Overrun,
|
||||||
|
/// the newly read DMA positions don't make sense compared to the previous
|
||||||
|
/// ones. This can usually only occur due to wrong Driver implementation, if
|
||||||
|
/// the driver author (or the user using raw metapac code) directly resets
|
||||||
|
/// the channel for instance.
|
||||||
DmaUnsynced,
|
DmaUnsynced,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ use core::task::Poll;
|
|||||||
|
|
||||||
use embassy_embedded_hal::SetConfig;
|
use embassy_embedded_hal::SetConfig;
|
||||||
use embassy_hal_internal::PeripheralRef;
|
use embassy_hal_internal::PeripheralRef;
|
||||||
|
use embedded_io_async::ReadReady;
|
||||||
use futures_util::future::{select, Either};
|
use futures_util::future::{select, Either};
|
||||||
|
|
||||||
use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx};
|
use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx};
|
||||||
@ -262,3 +263,20 @@ impl embedded_io_async::Read for RingBufferedUartRx<'_> {
|
|||||||
self.read(buf).await
|
self.read(buf).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ReadReady for RingBufferedUartRx<'_> {
|
||||||
|
fn read_ready(&mut self) -> Result<bool, Self::Error> {
|
||||||
|
let len = self.ring_buf.len().map_err(|e| match e {
|
||||||
|
crate::dma::ringbuffer::Error::Overrun => Self::Error::Overrun,
|
||||||
|
crate::dma::ringbuffer::Error::DmaUnsynced => {
|
||||||
|
error!(
|
||||||
|
"Ringbuffer error: DmaUNsynced, driver implementation is
|
||||||
|
probably bugged please open an issue"
|
||||||
|
);
|
||||||
|
// we report this as overrun since its recoverable in the same way
|
||||||
|
Self::Error::Overrun
|
||||||
|
}
|
||||||
|
})?;
|
||||||
|
Ok(len > 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user