Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stm32: impl uart write_all without panic #2665

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
52 changes: 50 additions & 2 deletions embassy-stm32/src/usart/buffered.rs
Expand Up @@ -562,6 +562,18 @@ impl<'d, T: BasicInstance> embedded_io_async::Write for BufferedUart<'d, T> {
self.tx.write(buf).await
}

async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
let mut buf = buf;
while !buf.is_empty() {
match self.tx.write(buf).await {
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buf = &buf[n..],
Err(e) => return Err(e),
}
}
Ok(())
}

async fn flush(&mut self) -> Result<(), Self::Error> {
self.tx.flush().await
}
Expand All @@ -572,6 +584,18 @@ impl<'d, T: BasicInstance> embedded_io_async::Write for BufferedUartTx<'d, T> {
Self::write(self, buf).await
}

async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
let mut buf = buf;
while !buf.is_empty() {
match Self::write(self, buf).await {
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buf = &buf[n..],
Err(e) => return Err(e),
}
}
Ok(())
}

async fn flush(&mut self) -> Result<(), Self::Error> {
Self::flush(self).await
}
Expand All @@ -594,6 +618,18 @@ impl<'d, T: BasicInstance> embedded_io::Write for BufferedUart<'d, T> {
self.tx.blocking_write(buf)
}

fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
let mut buf = buf;
while !buf.is_empty() {
match self.tx.blocking_write(buf) {
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buf = &buf[n..],
Err(e) => return Err(e),
}
}
Ok(())
}

fn flush(&mut self) -> Result<(), Self::Error> {
self.tx.blocking_flush()
}
Expand All @@ -604,6 +640,18 @@ impl<'d, T: BasicInstance> embedded_io::Write for BufferedUartTx<'d, T> {
Self::blocking_write(self, buf)
}

fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
let mut buf = buf;
while !buf.is_empty() {
match Self::blocking_write(self, buf) {
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buf = &buf[n..],
Err(e) => return Err(e),
}
}
Ok(())
}

fn flush(&mut self) -> Result<(), Self::Error> {
Self::blocking_flush(self)
}
Expand Down Expand Up @@ -643,7 +691,7 @@ impl<'d, T: BasicInstance> embedded_hal_02::blocking::serial::Write<u8> for Buff
fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> {
while !buffer.is_empty() {
match self.blocking_write(buffer) {
Ok(0) => panic!("zero-length write."),
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buffer = &buffer[n..],
Err(e) => return Err(e),
}
Expand All @@ -670,7 +718,7 @@ impl<'d, T: BasicInstance> embedded_hal_02::blocking::serial::Write<u8> for Buff
fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> {
while !buffer.is_empty() {
match self.tx.blocking_write(buffer) {
Ok(0) => panic!("zero-length write."),
Ok(0) => return Err(Error::WriteZero),
Ok(n) => buffer = &buffer[n..],
Err(e) => return Err(e),
}
Expand Down
23 changes: 23 additions & 0 deletions embassy-stm32/src/usart/mod.rs
Expand Up @@ -199,6 +199,8 @@ pub enum Error {
Parity,
/// Buffer too large for DMA
BufferTooLong,
/// An attempted write could not write any data.
WriteZero,
}

enum ReadCompletionEvent {
Expand Down Expand Up @@ -1188,6 +1190,7 @@ impl embedded_hal_nb::serial::Error for Error {
Self::Overrun => embedded_hal_nb::serial::ErrorKind::Overrun,
Self::Parity => embedded_hal_nb::serial::ErrorKind::Parity,
Self::BufferTooLong => embedded_hal_nb::serial::ErrorKind::Other,
Self::WriteZero => embedded_hal_nb::serial::ErrorKind::Other,
}
}
}
Expand Down Expand Up @@ -1266,6 +1269,11 @@ where
Ok(buf.len())
}

fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
self.blocking_write(buf)?;
Ok(())
}

fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
Expand All @@ -1281,6 +1289,11 @@ where
Ok(buf.len())
}

fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
self.blocking_write(buf)?;
Ok(())
}

fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
Expand All @@ -1296,6 +1309,11 @@ where
Ok(buf.len())
}

async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
self.write(buf).await?;
Ok(())
}

async fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
Expand All @@ -1311,6 +1329,11 @@ where
Ok(buf.len())
}

async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
self.write(buf).await?;
Ok(())
}

async fn flush(&mut self) -> Result<(), Self::Error> {
self.blocking_flush()
}
Expand Down