use core::fmt;
use kinavis_kernel::KernelError;
use crate::id::Pgn;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum Nmea2000Error {
BadCanId {
raw: u32,
},
BadFrameLength {
len: usize,
},
UnknownPgn {
pgn: Pgn,
},
BadLength {
declared: u8,
limit: usize,
},
UnexpectedFrame {
expected: u8,
found: u8,
},
NoSlot,
TooShort {
pgn: Pgn,
bytes: usize,
needed: usize,
},
Value {
field: &'static str,
error: KernelError,
},
}
impl fmt::Display for Nmea2000Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::BadCanId { raw } => write!(f, "identifier {raw:#x} is wider than 29 bits"),
Self::BadFrameLength { len } => {
write!(f, "a frame of {len} bytes where at most 8 are possible")
}
Self::UnknownPgn { pgn } => write!(f, "{pgn} is not a group this crate knows"),
Self::BadLength { declared, limit } => {
write!(f, "fast packet of {declared} bytes declared, limit {limit}")
}
Self::UnexpectedFrame { expected, found } => {
write!(f, "frame {found} where frame {expected} was expected")
}
Self::NoSlot => f.write_str("the assembler has no slot for a packet in frames"),
Self::TooShort { pgn, bytes, needed } => {
write!(
f,
"{pgn}: payload of {bytes} bytes where {needed} are needed"
)
}
Self::Value { field, error } => write!(f, "{field}: {error}"),
}
}
}
impl core::error::Error for Nmea2000Error {}