use thiserror::Error;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Error, Debug)]
pub enum Error {
#[error("{0}")]
Custom(String),
#[error("USB error: {0}")]
Rusb(#[from] rusb::Error),
#[error("WCH-Link not found or not in RV mode, please check your connection or use mode-switch tool to switch to RV mode")]
ProbeNotFound,
#[error("Unknown WCH-Link variant: {0}")]
UnknownLinkVariant(u8),
#[error("Unknown RISC-V Chip: 0x{0:02x}")]
UnknownChip(u8),
#[error("Probe is not attached to an MCU")]
NotAttached,
#[error("WCH-Link underlying protocol error: {0:#04x} {1:#04x?}")]
Protocol(u8, Vec<u8>),
#[error("Invalid payload length")]
InvalidPayloadLength,
#[error("Invalid payload")]
InvalidPayload,
#[error("DM Abstract comand error: {0:?}")]
AbstractCommandError(AbstractcsCmdErr),
#[error("DM is busy")]
Busy,
#[error("DMI Status Failed")]
DmiFailed,
#[error("Operation timeout")]
Timeout,
}
#[derive(Debug, Clone, Copy)]
pub enum AbstractcsCmdErr {
Busy = 1,
NotSupported = 2,
Exception = 3,
HaltOrResume = 4,
Bus = 5,
Parity = 6,
Other = 7,
}
impl AbstractcsCmdErr {
pub(crate) fn try_from_cmderr(value: u8) -> Result<()> {
match value {
0 => Ok(()),
1 => Err(Error::AbstractCommandError(AbstractcsCmdErr::Busy)),
2 => Err(Error::AbstractCommandError(AbstractcsCmdErr::NotSupported)),
3 => Err(Error::AbstractCommandError(AbstractcsCmdErr::Exception)),
4 => Err(Error::AbstractCommandError(AbstractcsCmdErr::HaltOrResume)),
5 => Err(Error::AbstractCommandError(AbstractcsCmdErr::Bus)),
6 => Err(Error::AbstractCommandError(AbstractcsCmdErr::Parity)),
7 => Err(Error::AbstractCommandError(AbstractcsCmdErr::Other)),
_ => unreachable!(),
}
}
}