1use core::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[cfg_attr(feature = "defmt", derive(defmt::Format))]
8pub enum Error<E> {
9 Uart(E),
11 CrcMismatch,
13 InvalidSync,
15 InvalidMasterAddress,
17 AddressMismatch {
19 expected: u8,
21 actual: u8,
23 },
24 UnknownAddress(u8),
26 InvalidSlaveAddress(u8),
28 BufferTooSmall,
30 NoResponse,
32}
33
34impl<E> Error<E> {
35 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}