1use std::error::Error;
7use std::fmt;
8use std::sync::Arc;
9
10use crate::peak_can;
11
12#[derive(Debug, Clone)]
14pub enum CanError {
15 Libloading(Arc<libloading::Error>),
17 XmtFull,
19 Overrun,
21 BusLight,
23 BusHeavy,
25 BusPassive,
27 BusOff,
29 AnyBusErr,
31 QrcvEmpty,
33 QOverrun,
35 QxmtFull,
37 RegTest,
39 NoDriver,
41 HwInUse,
43 NetInUse,
45 IllHw,
47 IllNet,
49 IllClient,
51 Resource,
53 IllParamType,
55 IllParamVal,
57 Unknown,
59 IllData,
61 IllMode,
63 Caution,
65 Initialize,
67 IllOperation,
69}
70
71#[derive(Debug)]
73pub enum CanOkError {
74 Ok,
76 Err(CanError),
78}
79
80impl From<CanError> for u32 {
81 fn from(value: CanError) -> u32 {
82 match value {
83 CanError::Libloading(_) => peak_can::PEAK_ERROR_UNKNOWN,
84 CanError::XmtFull => peak_can::PEAK_ERROR_XMTFULL,
85 CanError::Overrun => peak_can::PEAK_ERROR_OVERRUN,
86 CanError::BusLight => peak_can::PEAK_ERROR_BUSLIGHT,
87 CanError::BusHeavy => peak_can::PEAK_ERROR_BUSHEAVY,
88 CanError::BusPassive => peak_can::PEAK_ERROR_BUSPASSIVE,
89 CanError::BusOff => peak_can::PEAK_ERROR_BUSOFF,
90 CanError::AnyBusErr => {
91 let mut value = peak_can::PEAK_ERROR_BUSWARNING;
92 value |= peak_can::PEAK_ERROR_BUSLIGHT;
93 value |= peak_can::PEAK_ERROR_BUSHEAVY;
94 value |= peak_can::PEAK_ERROR_BUSOFF;
95 value |= peak_can::PEAK_ERROR_BUSPASSIVE;
96 value
97 }
98 CanError::QrcvEmpty => peak_can::PEAK_ERROR_QRCVEMPTY,
99 CanError::QOverrun => peak_can::PEAK_ERROR_QOVERRUN,
100 CanError::QxmtFull => peak_can::PEAK_ERROR_QXMTFULL,
101 CanError::RegTest => peak_can::PEAK_ERROR_REGTEST,
102 CanError::NoDriver => peak_can::PEAK_ERROR_NODRIVER,
103 CanError::HwInUse => peak_can::PEAK_ERROR_HWINUSE,
104 CanError::NetInUse => peak_can::PEAK_ERROR_NETINUSE,
105 CanError::IllHw => peak_can::PEAK_ERROR_ILLHW,
106 CanError::IllNet => peak_can::PEAK_ERROR_ILLNET,
107 CanError::IllClient => peak_can::PEAK_ERROR_ILLCLIENT,
108 CanError::Resource => peak_can::PEAK_ERROR_RESOURCE,
109 CanError::IllParamType => peak_can::PEAK_ERROR_ILLPARAMTYPE,
110 CanError::IllParamVal => peak_can::PEAK_ERROR_ILLPARAMVAL,
111 CanError::Unknown => peak_can::PEAK_ERROR_UNKNOWN,
112 CanError::IllData => peak_can::PEAK_ERROR_ILLDATA,
113 CanError::IllMode => peak_can::PEAK_ERROR_ILLMODE,
114 CanError::Caution => peak_can::PEAK_ERROR_CAUTION,
115 CanError::Initialize => peak_can::PEAK_ERROR_INITIALIZE,
116 CanError::IllOperation => peak_can::PEAK_ERROR_ILLOPERATION,
117 }
118 }
119}
120
121impl From<CanOkError> for u32 {
122 fn from(value: CanOkError) -> u32 {
123 match value {
124 CanOkError::Ok => peak_can::PEAK_ERROR_OK,
125 CanOkError::Err(error) => u32::from(error),
126 }
127 }
128}
129
130impl TryFrom<u32> for CanError {
131 type Error = ();
132
133 fn try_from(value: u32) -> Result<Self, Self::Error> {
134 match value {
135 peak_can::PEAK_ERROR_XMTFULL => Ok(CanError::XmtFull),
136 peak_can::PEAK_ERROR_OVERRUN => Ok(CanError::Overrun),
137 peak_can::PEAK_ERROR_BUSLIGHT => Ok(CanError::BusLight),
138 peak_can::PEAK_ERROR_BUSHEAVY => Ok(CanError::BusHeavy),
139 peak_can::PEAK_ERROR_BUSPASSIVE => Ok(CanError::BusPassive),
140 peak_can::PEAK_ERROR_BUSOFF => Ok(CanError::BusOff),
141 peak_can::PEAK_ERROR_ANYBUSERR => Ok(CanError::AnyBusErr),
142 peak_can::PEAK_ERROR_QRCVEMPTY => Ok(CanError::QrcvEmpty),
143 peak_can::PEAK_ERROR_QOVERRUN => Ok(CanError::QOverrun),
144 peak_can::PEAK_ERROR_QXMTFULL => Ok(CanError::QxmtFull),
145 peak_can::PEAK_ERROR_REGTEST => Ok(CanError::RegTest),
146 peak_can::PEAK_ERROR_NODRIVER => Ok(CanError::NoDriver),
147 peak_can::PEAK_ERROR_HWINUSE => Ok(CanError::HwInUse),
148 peak_can::PEAK_ERROR_NETINUSE => Ok(CanError::NetInUse),
149 peak_can::PEAK_ERROR_ILLHW => Ok(CanError::IllHw),
150 peak_can::PEAK_ERROR_ILLNET => Ok(CanError::IllNet),
151 peak_can::PEAK_ERROR_ILLCLIENT => Ok(CanError::IllClient),
152 peak_can::PEAK_ERROR_RESOURCE => Ok(CanError::Resource),
153 peak_can::PEAK_ERROR_ILLPARAMTYPE => Ok(CanError::IllParamType),
154 peak_can::PEAK_ERROR_ILLPARAMVAL => Ok(CanError::IllParamVal),
155 peak_can::PEAK_ERROR_UNKNOWN => Ok(CanError::Unknown),
156 peak_can::PEAK_ERROR_ILLDATA => Ok(CanError::IllData),
157 peak_can::PEAK_ERROR_ILLMODE => Ok(CanError::IllMode),
158 peak_can::PEAK_ERROR_CAUTION => Ok(CanError::Caution),
159 peak_can::PEAK_ERROR_INITIALIZE => Ok(CanError::Initialize),
160 peak_can::PEAK_ERROR_ILLOPERATION => Ok(CanError::IllOperation),
161 _ => Err(()),
162 }
163 }
164}
165
166impl TryFrom<u32> for CanOkError {
167 type Error = ();
168
169 fn try_from(value: u32) -> Result<Self, Self::Error> {
170 match value {
171 peak_can::PEAK_ERROR_OK => Ok(CanOkError::Ok),
172 _ => {
173 let err = CanError::try_from(value)?;
174 Ok(CanOkError::Err(err))
175 }
176 }
177 }
178}
179
180impl From<libloading::Error> for CanError {
181 fn from(value: libloading::Error) -> Self {
182 Self::Libloading(Arc::new(value))
183 }
184}
185
186impl fmt::Display for CanError {
187 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188 match self {
189 CanError::Libloading(e) => write!(f, "{e}"),
190 CanError::XmtFull => write!(f, "xmt full"),
191 CanError::Overrun => write!(f, "overrun"),
192 CanError::BusLight => write!(f, "bus light"),
193 CanError::BusHeavy => write!(f, "bus heavy"),
194 CanError::BusPassive => write!(f, "bus passive"),
195 CanError::BusOff => write!(f, "bus off"),
196 CanError::AnyBusErr => write!(f, "any bus error"),
197 CanError::QrcvEmpty => write!(f, "qrcv empty"),
198 CanError::QOverrun => write!(f, "q overrun"),
199 CanError::QxmtFull => write!(f, "qxmt full"),
200 CanError::RegTest => write!(f, "reg test"),
201 CanError::NoDriver => write!(f, "no driver"),
202 CanError::HwInUse => write!(f, "hardware in use"),
203 CanError::NetInUse => write!(f, "network in use"),
204 CanError::IllHw => write!(f, "illegal hardware"),
205 CanError::IllNet => write!(f, "illegal network"),
206 CanError::IllClient => write!(f, "illegal client"),
207 CanError::Resource => write!(f, "resource"),
208 CanError::IllParamType => write!(f, "illegal parameter type"),
209 CanError::IllParamVal => write!(f, "illegal parameter value"),
210 CanError::Unknown => write!(f, "unknown"),
211 CanError::IllData => write!(f, "illegal data"),
212 CanError::IllMode => write!(f, "illegal mode"),
213 CanError::Caution => write!(f, "caution"),
214 CanError::Initialize => write!(f, "initialize"),
215 CanError::IllOperation => write!(f, "illegal operation"),
216 }
217 }
218}
219
220impl Error for CanError {}