1use iso14229_1::{response::Code, Iso14229Error, Service};
2use iso15765_2::IsoTpError;
3use rs_can::CanError;
4
5#[derive(thiserror::Error, Debug)]
6pub enum DoCanError {
7 #[error("{0}")]
8 DeviceError(CanError),
9
10 #[error("{0}")]
11 Iso14229Error(Iso14229Error),
12
13 #[error("DoCAN - service `{service}` got an unexpected sub-function(expect: {expect}, actual: {actual})")]
14 UnexpectedSubFunction {
15 service: Service,
16 expect: u8,
17 actual: u8,
18 },
19
20 #[error("DoCAN - service `{expect}` got an unexpect response `{actual}`")]
21 UnexpectedResponse { expect: Service, actual: Service },
22
23 #[error("DoCAN - block sequence number of response (0x{actual:02x}) does not match request block sequence number (0x{expect:02x})")]
24 UnexpectedTransferSequence { expect: u8, actual: u8 },
25
26 #[error("DoCAN - service `{service}` got a NRC({code:?})")]
27 NRCError { service: Service, code: Code },
28
29 #[error("{0}")]
30 IsoTpError(IsoTpError),
31
32 #[error("DoCAN - security algorithm error: {0}")]
33 SecurityAlgoError(String),
34
35 #[error("DoCAN - other error: {0}")]
36 OtherError(String),
37
38 #[error("DoCAN - service: {0} is not implement")]
39 NotImplement(Service),
40}
41
42impl From<CanError> for DoCanError {
43 fn from(error: CanError) -> Self {
44 DoCanError::DeviceError(error)
45 }
46}
47
48impl From<Iso14229Error> for DoCanError {
49 fn from(error: Iso14229Error) -> Self {
50 DoCanError::Iso14229Error(error)
51 }
52}
53
54impl From<IsoTpError> for DoCanError {
55 fn from(error: IsoTpError) -> Self {
56 DoCanError::IsoTpError(error)
57 }
58}