tmc2209_uart/
error.rs

1//! Error types for TMC2209 driver.
2
3use core::fmt;
4
5/// Errors that can occur during TMC2209 communication.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[cfg_attr(feature = "defmt", derive(defmt::Format))]
8pub enum Error<E> {
9    /// UART communication error (read or write failed).
10    Uart(E),
11    /// CRC checksum mismatch in received response.
12    CrcMismatch,
13    /// Invalid sync byte in response (expected 0x05).
14    InvalidSync,
15    /// Invalid master address in response (expected 0xFF).
16    InvalidMasterAddress,
17    /// Register address in response doesn't match request.
18    AddressMismatch {
19        /// The expected register address.
20        expected: u8,
21        /// The actual register address received.
22        actual: u8,
23    },
24    /// Unknown register address received.
25    UnknownAddress(u8),
26    /// Invalid slave address (must be 0-3).
27    InvalidSlaveAddress(u8),
28    /// Response buffer too small.
29    BufferTooSmall,
30    /// No response received (timeout or no data).
31    NoResponse,
32}
33
34impl<E> Error<E> {
35    /// Map the UART error type to a different type.
36    pub fn map_uart<F, E2>(self, f: F) -> Error<E2>
37    where
38        F: FnOnce(E) -> E2,
39    {
40        match self {
41            Error::Uart(e) => Error::Uart(f(e)),
42            Error::CrcMismatch => Error::CrcMismatch,
43            Error::InvalidSync => Error::InvalidSync,
44            Error::InvalidMasterAddress => Error::InvalidMasterAddress,
45            Error::AddressMismatch { expected, actual } => {
46                Error::AddressMismatch { expected, actual }
47            }
48            Error::UnknownAddress(addr) => Error::UnknownAddress(addr),
49            Error::InvalidSlaveAddress(addr) => Error::InvalidSlaveAddress(addr),
50            Error::BufferTooSmall => Error::BufferTooSmall,
51            Error::NoResponse => Error::NoResponse,
52        }
53    }
54}
55
56impl<E: fmt::Debug> fmt::Display for Error<E> {
57    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58        match self {
59            Error::Uart(e) => write!(f, "UART error: {:?}", e),
60            Error::CrcMismatch => write!(f, "CRC checksum mismatch"),
61            Error::InvalidSync => write!(f, "Invalid sync byte (expected 0x05)"),
62            Error::InvalidMasterAddress => write!(f, "Invalid master address (expected 0xFF)"),
63            Error::AddressMismatch { expected, actual } => {
64                write!(
65                    f,
66                    "Register address mismatch: expected 0x{:02X}, got 0x{:02X}",
67                    expected, actual
68                )
69            }
70            Error::UnknownAddress(addr) => write!(f, "Unknown register address: 0x{:02X}", addr),
71            Error::InvalidSlaveAddress(addr) => {
72                write!(f, "Invalid slave address: {} (must be 0-3)", addr)
73            }
74            Error::BufferTooSmall => write!(f, "Response buffer too small"),
75            Error::NoResponse => write!(f, "No response received"),
76        }
77    }
78}