From 27709df94ad0662a262aa2465b41554ce0d88d87 Mon Sep 17 00:00:00 2001 From: Guy Marino Date: Wed, 26 Feb 2025 14:14:16 -0800 Subject: [PATCH] Implement `core::error::Error` for STM32 Serial Devices --- embassy-stm32/src/i2c/mod.rs | 18 ++++++++++++++++++ embassy-stm32/src/spi/mod.rs | 15 +++++++++++++++ embassy-stm32/src/usart/mod.rs | 16 ++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/embassy-stm32/src/i2c/mod.rs b/embassy-stm32/src/i2c/mod.rs index 1fc91f1ef..3a9954663 100644 --- a/embassy-stm32/src/i2c/mod.rs +++ b/embassy-stm32/src/i2c/mod.rs @@ -44,6 +44,24 @@ pub enum Error { ZeroLengthTransfer, } +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let message = match self { + Self::Bus => "Bus Error", + Self::Arbitration => "Arbitration Lost", + Self::Nack => "ACK Not Received", + Self::Timeout => "Request Timed Out", + Self::Crc => "CRC Mismatch", + Self::Overrun => "Buffer Overrun", + Self::ZeroLengthTransfer => "Zero-Length Transfers are not allowed", + }; + + write!(f, "{}", message) + } +} + +impl core::error::Error for Error {} + /// I2C config #[non_exhaustive] #[derive(Copy, Clone)] diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 45893d24b..44dda6a9e 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -31,6 +31,21 @@ pub enum Error { Overrun, } +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let message = match self { + Self::Framing => "Invalid Framing", + Self::Crc => "Hardware CRC Check Failed", + Self::ModeFault => "Mode Fault", + Self::Overrun => "Buffer Overrun", + }; + + write!(f, "{}", message) + } +} + +impl core::error::Error for Error {} + /// SPI bit order #[derive(Copy, Clone)] pub enum BitOrder { diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index 48cc4f6d6..de7b3c8df 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -293,6 +293,22 @@ pub enum Error { BufferTooLong, } +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let message = match self { + Self::Framing => "Framing Error", + Self::Noise => "Noise Error", + Self::Overrun => "RX Buffer Overrun", + Self::Parity => "Parity Check Error", + Self::BufferTooLong => "Buffer too large for DMA", + }; + + write!(f, "{}", message) + } +} + +impl core::error::Error for Error {} + enum ReadCompletionEvent { // DMA Read transfer completed first DmaCompleted,