use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum ErrorKind {
Uart(UartError),
I2c(I2cError),
Spi(SpiError),
Gpio(GpioError),
Adc(AdcError),
Hardware(HardwareError),
Buffer(BufferError),
InvalidConfig,
Unknown,
Other,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum UartError {
Framing,
Parity,
Overrun,
Underrun,
Timeout,
}
impl fmt::Display for UartError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
UartError::Framing => f.write_str("Framing"),
UartError::Parity => f.write_str("Parity"),
UartError::Overrun => f.write_str("Overrun"),
UartError::Underrun => f.write_str("Underrun"),
UartError::Timeout => f.write_str("Timeout"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum I2cError {
Nack,
ArbitrationLost,
Bus,
}
impl fmt::Display for I2cError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
I2cError::Nack => f.write_str("Nack"),
I2cError::ArbitrationLost => f.write_str("ArbitrationLost"),
I2cError::Bus => f.write_str("Bus"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum SpiError {
ModeFault,
}
impl fmt::Display for SpiError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SpiError::ModeFault => f.write_str("ModeFault"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum GpioError {
InvalidState,
}
impl fmt::Display for GpioError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
GpioError::InvalidState => f.write_str("InvalidState"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum AdcError {
OutOfRange,
}
impl fmt::Display for AdcError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AdcError::OutOfRange => f.write_str("OutOfRange"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum HardwareError {
Power,
Peripheral,
ShortCircuit,
OpenCircuit,
}
impl fmt::Display for HardwareError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HardwareError::Power => f.write_str("PowerFault"),
HardwareError::Peripheral => f.write_str("PeripheralFault"),
HardwareError::ShortCircuit => f.write_str("ShortCircuit"),
HardwareError::OpenCircuit => f.write_str("OpenCircuit"),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum BufferError {
Overflow,
Underflow,
}
impl fmt::Display for BufferError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BufferError::Overflow => f.write_str("Overflow"),
BufferError::Underflow => f.write_str("Underflow"),
}
}
}
impl fmt::Display for ErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ErrorKind::Uart(e) => write!(f, "Uart: {e}"),
ErrorKind::I2c(e) => write!(f, "I2c: {e}"),
ErrorKind::Spi(e) => write!(f, "Spi: {e}"),
ErrorKind::Gpio(e) => write!(f, "Gpio: {e}"),
ErrorKind::Adc(e) => write!(f, "Adc: {e}"),
ErrorKind::Hardware(e) => write!(f, "Hardware: {e}"),
ErrorKind::Buffer(e) => write!(f, "Buffer: {e}"),
ErrorKind::InvalidConfig => f.write_str("InvalidConfig"),
ErrorKind::Unknown => f.write_str("Unknown"),
ErrorKind::Other => f.write_str("Other"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BitFlagsError {
IndexOutOfBounds { idx: usize, max: usize },
}
impl fmt::Display for BitFlagsError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BitFlagsError::IndexOutOfBounds { idx, max } => {
write!(
f,
"Index out of bounds: index {idx} is out of range 0..{max}"
)
}
}
}
}
#[derive(PartialEq, Eq)]
pub enum ExplorerError {
TooManyCommands,
DependencyCycle,
NoValidAddressesFound,
ExecutionFailed(ErrorKind),
BufferOverflow,
InvalidDependencyIndex,
DeviceNotFound(ErrorKind),
BitFlags(BitFlagsError),
}
impl fmt::Display for ExplorerError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExplorerError::TooManyCommands => f.write_str("TooManyCommands"),
ExplorerError::DependencyCycle => f.write_str("DependencyCycle"),
ExplorerError::NoValidAddressesFound => f.write_str("NoValidAddressesFound"),
ExplorerError::ExecutionFailed(kind) => write!(f, "ExecutionFailed: {kind}"),
ExplorerError::BufferOverflow => f.write_str("BufferOverflow"),
ExplorerError::InvalidDependencyIndex => f.write_str("InvalidDependencyIndex"),
ExplorerError::DeviceNotFound(kind) => write!(f, "DeviceNotFound: {kind}"),
ExplorerError::BitFlags(e) => write!(f, "BitFlagsError: {e}"),
}
}
}
#[derive(PartialEq, Eq)]
pub enum ExecutorError {
I2cError(ErrorKind),
ExecFailed,
BufferOverflow,
BitFlags(BitFlagsError),
Explorer(ExplorerError),
}
impl From<ExecutorError> for ExplorerError {
fn from(error: ExecutorError) -> Self {
match error {
ExecutorError::I2cError(kind) => ExplorerError::ExecutionFailed(kind),
ExecutorError::ExecFailed => ExplorerError::ExecutionFailed(ErrorKind::Unknown),
ExecutorError::BufferOverflow => ExplorerError::BufferOverflow,
ExecutorError::BitFlags(e) => ExplorerError::BitFlags(e),
ExecutorError::Explorer(e) => e,
}
}
}
impl From<ErrorKind> for ExplorerError {
fn from(error: ErrorKind) -> Self {
ExplorerError::DeviceNotFound(error)
}
}
impl fmt::Display for ExecutorError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExecutorError::I2cError(kind) => write!(f, "I2cError: {kind}"),
ExecutorError::ExecFailed => f.write_str("ExecFailed"),
ExecutorError::BufferOverflow => f.write_str("BufferOverflow"),
ExecutorError::BitFlags(e) => write!(f, "BitFlagsError: {e}"),
ExecutorError::Explorer(e) => write!(f, "ExplorerError: {e}"),
}
}
}