Skip to content

Commit a52c28f

Browse files
committed
refactor error handling to use constants for component IDs and error codes
1 parent ea55473 commit a52c28f

1 file changed

Lines changed: 81 additions & 48 deletions

File tree

aimdb-embassy-adapter/src/error.rs

Lines changed: 81 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,38 @@ use embedded_hal::i2c;
1414
use embedded_hal::spi;
1515
use embedded_hal_nb::nb;
1616

17+
// Embassy Error Code Base Values
18+
const SPI_ERROR_BASE: u16 = 0x6100;
19+
const UART_ERROR_BASE: u16 = 0x6200;
20+
const I2C_ERROR_BASE: u16 = 0x6300;
21+
const ADC_ERROR_BASE: u16 = 0x6400;
22+
const GPIO_ERROR_BASE: u16 = 0x6500;
23+
const TIMER_ERROR_BASE: u16 = 0x6600;
24+
25+
// Component IDs for Embassy hardware
26+
const TIMER_COMPONENT_ID: u8 = 0;
27+
const GPIO_COMPONENT_ID: u8 = 1;
28+
const SPI_COMPONENT_ID: u8 = 2;
29+
const I2C_COMPONENT_ID: u8 = 3;
30+
const UART_COMPONENT_ID: u8 = 4;
31+
const ADC_COMPONENT_ID: u8 = 5;
32+
33+
// SPI-specific error codes
34+
const SPI_CHIP_SELECT_FAULT: u8 = 0x01;
35+
const SPI_MODE_FAULT: u8 = 0x02;
36+
const SPI_OVERRUN: u8 = 0x04;
37+
const SPI_FRAME_FORMAT: u8 = 0x05;
38+
const SPI_UNKNOWN_ERROR: u8 = 0xFF;
39+
40+
// I2C-specific error codes
41+
const I2C_BUS_ERROR: u8 = 0x01;
42+
const I2C_ARBITRATION_LOSS: u8 = 0x02;
43+
const I2C_NACK_ADDRESS: u8 = 0x03;
44+
const I2C_NACK_DATA: u8 = 0x04;
45+
const I2C_NACK_UNKNOWN: u8 = 0x05;
46+
const I2C_OVERRUN: u8 = 0x06;
47+
const I2C_UNKNOWN_ERROR: u8 = 0xFF;
48+
1749
/// Trait that provides Embassy-specific error constructors for DbError
1850
///
1951
/// This trait provides hardware-specific error creation methods without requiring
@@ -54,79 +86,79 @@ impl EmbassyErrorSupport for DbError {
5486
/// Creates an SPI error for Embassy environments (error codes 0x6100-0x61FF)
5587
fn from_spi_error(code: u8) -> Self {
5688
DbError::HardwareError {
57-
component: 2, // SPI component ID
58-
error_code: 0x6100 | (code as u16),
89+
component: SPI_COMPONENT_ID,
90+
error_code: SPI_ERROR_BASE | (code as u16),
5991
_description: (),
6092
}
6193
}
6294

6395
/// Creates a UART error for Embassy environments (error codes 0x6200-0x62FF)
6496
fn from_uart_error(code: u8) -> Self {
6597
DbError::HardwareError {
66-
component: 4, // UART component ID
67-
error_code: 0x6200 | (code as u16),
98+
component: UART_COMPONENT_ID,
99+
error_code: UART_ERROR_BASE | (code as u16),
68100
_description: (),
69101
}
70102
}
71103

72104
/// Creates an I2C error for Embassy environments (error codes 0x6300-0x63FF)
73105
fn from_i2c_error(code: u8) -> Self {
74106
DbError::HardwareError {
75-
component: 3, // I2C component ID
76-
error_code: 0x6300 | (code as u16),
107+
component: I2C_COMPONENT_ID,
108+
error_code: I2C_ERROR_BASE | (code as u16),
77109
_description: (),
78110
}
79111
}
80112

81113
/// Creates an ADC error for Embassy environments (error codes 0x6400-0x64FF)
82114
fn from_adc_error(code: u8) -> Self {
83115
DbError::HardwareError {
84-
component: 5, // ADC component ID
85-
error_code: 0x6400 | (code as u16),
116+
component: ADC_COMPONENT_ID,
117+
error_code: ADC_ERROR_BASE | (code as u16),
86118
_description: (),
87119
}
88120
}
89121

90122
/// Creates a GPIO error for Embassy environments (error codes 0x6500-0x65FF)
91123
fn from_gpio_error(code: u8) -> Self {
92124
DbError::HardwareError {
93-
component: 1, // GPIO component ID
94-
error_code: 0x6500 | (code as u16),
125+
component: GPIO_COMPONENT_ID,
126+
error_code: GPIO_ERROR_BASE | (code as u16),
95127
_description: (),
96128
}
97129
}
98130

99131
/// Creates a Timer error for Embassy environments (error codes 0x6600-0x66FF)
100132
fn from_timer_error(code: u8) -> Self {
101133
DbError::HardwareError {
102-
component: 0, // Timer component ID
103-
error_code: 0x6600 | (code as u16),
134+
component: TIMER_COMPONENT_ID,
135+
error_code: TIMER_ERROR_BASE | (code as u16),
104136
_description: (),
105137
}
106138
}
107139

108140
/// Converts an SPI error to DbError
109141
fn from_spi_hal_error(error: spi::ErrorKind) -> Self {
110142
let error_code = match error {
111-
spi::ErrorKind::ChipSelectFault => 0x01,
112-
spi::ErrorKind::ModeFault => 0x02,
113-
spi::ErrorKind::Overrun => 0x04,
114-
spi::ErrorKind::FrameFormat => 0x05,
115-
_ => 0xFF, // Generic/unknown error
143+
spi::ErrorKind::ChipSelectFault => SPI_CHIP_SELECT_FAULT,
144+
spi::ErrorKind::ModeFault => SPI_MODE_FAULT,
145+
spi::ErrorKind::Overrun => SPI_OVERRUN,
146+
spi::ErrorKind::FrameFormat => SPI_FRAME_FORMAT,
147+
_ => SPI_UNKNOWN_ERROR, // Generic/unknown error
116148
};
117149
Self::from_spi_error(error_code)
118150
}
119151

120152
/// Converts an I2C error to DbError
121153
fn from_i2c_hal_error(error: i2c::ErrorKind) -> Self {
122154
let error_code = match error {
123-
i2c::ErrorKind::Bus => 0x01,
124-
i2c::ErrorKind::ArbitrationLoss => 0x02,
125-
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Address) => 0x03,
126-
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Data) => 0x04,
127-
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Unknown) => 0x05,
128-
i2c::ErrorKind::Overrun => 0x06,
129-
_ => 0xFF, // Generic/unknown error
155+
i2c::ErrorKind::Bus => I2C_BUS_ERROR,
156+
i2c::ErrorKind::ArbitrationLoss => I2C_ARBITRATION_LOSS,
157+
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Address) => I2C_NACK_ADDRESS,
158+
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Data) => I2C_NACK_DATA,
159+
i2c::ErrorKind::NoAcknowledge(i2c::NoAcknowledgeSource::Unknown) => I2C_NACK_UNKNOWN,
160+
i2c::ErrorKind::Overrun => I2C_OVERRUN,
161+
_ => I2C_UNKNOWN_ERROR, // Generic/unknown error
130162
};
131163
Self::from_i2c_error(error_code)
132164
}
@@ -135,6 +167,7 @@ impl EmbassyErrorSupport for DbError {
135167
fn from_nb_error<E>(error: nb::Error<E>) -> Self
136168
where
137169
E: Into<Self>,
170+
Self: Sized,
138171
{
139172
match error {
140173
nb::Error::Other(e) => e.into(),
@@ -185,8 +218,8 @@ mod tests {
185218
..
186219
} = spi_error
187220
{
188-
assert_eq!(component, 2); // SPI component ID
189-
assert_eq!(error_code, 0x6142); // 0x6100 | 0x42
221+
assert_eq!(component, SPI_COMPONENT_ID);
222+
assert_eq!(error_code, SPI_ERROR_BASE | 0x42);
190223
} else {
191224
panic!("Expected HardwareError variant");
192225
}
@@ -199,8 +232,8 @@ mod tests {
199232
..
200233
} = uart_error
201234
{
202-
assert_eq!(component, 4); // UART component ID
203-
assert_eq!(error_code, 0x6210); // 0x6200 | 0x10
235+
assert_eq!(component, UART_COMPONENT_ID);
236+
assert_eq!(error_code, UART_ERROR_BASE | 0x10);
204237
} else {
205238
panic!("Expected HardwareError variant");
206239
}
@@ -213,8 +246,8 @@ mod tests {
213246
..
214247
} = i2c_error
215248
{
216-
assert_eq!(component, 3); // I2C component ID
217-
assert_eq!(error_code, 0x6305); // 0x6300 | 0x05
249+
assert_eq!(component, I2C_COMPONENT_ID);
250+
assert_eq!(error_code, I2C_ERROR_BASE | 0x05);
218251
} else {
219252
panic!("Expected HardwareError variant");
220253
}
@@ -227,8 +260,8 @@ mod tests {
227260
..
228261
} = adc_error
229262
{
230-
assert_eq!(component, 5); // ADC component ID
231-
assert_eq!(error_code, 0x6420); // 0x6400 | 0x20
263+
assert_eq!(component, ADC_COMPONENT_ID);
264+
assert_eq!(error_code, ADC_ERROR_BASE | 0x20);
232265
} else {
233266
panic!("Expected HardwareError variant");
234267
}
@@ -241,8 +274,8 @@ mod tests {
241274
..
242275
} = gpio_error
243276
{
244-
assert_eq!(component, 1); // GPIO component ID
245-
assert_eq!(error_code, 0x6508); // 0x6500 | 0x08
277+
assert_eq!(component, GPIO_COMPONENT_ID);
278+
assert_eq!(error_code, GPIO_ERROR_BASE | 0x08);
246279
} else {
247280
panic!("Expected HardwareError variant");
248281
}
@@ -255,8 +288,8 @@ mod tests {
255288
..
256289
} = timer_error
257290
{
258-
assert_eq!(component, 0); // Timer component ID
259-
assert_eq!(error_code, 0x66FF); // 0x6600 | 0xFF
291+
assert_eq!(component, TIMER_COMPONENT_ID);
292+
assert_eq!(error_code, TIMER_ERROR_BASE | 0xFF);
260293
} else {
261294
panic!("Expected HardwareError variant");
262295
}
@@ -274,8 +307,8 @@ mod tests {
274307
..
275308
} = spi_overrun
276309
{
277-
assert_eq!(component, 2); // SPI component
278-
assert_eq!(error_code, 0x6104); // 0x6100 | 0x04
310+
assert_eq!(component, SPI_COMPONENT_ID);
311+
assert_eq!(error_code, SPI_ERROR_BASE | SPI_OVERRUN as u16);
279312
} else {
280313
panic!("Expected HardwareError variant");
281314
}
@@ -287,8 +320,8 @@ mod tests {
287320
..
288321
} = spi_mode_fault
289322
{
290-
assert_eq!(component, 2); // SPI component
291-
assert_eq!(error_code, 0x6102); // 0x6100 | 0x02
323+
assert_eq!(component, SPI_COMPONENT_ID);
324+
assert_eq!(error_code, SPI_ERROR_BASE | SPI_MODE_FAULT as u16);
292325
} else {
293326
panic!("Expected HardwareError variant");
294327
}
@@ -301,8 +334,8 @@ mod tests {
301334
..
302335
} = i2c_bus_error
303336
{
304-
assert_eq!(component, 3); // I2C component
305-
assert_eq!(error_code, 0x6301); // 0x6300 | 0x01
337+
assert_eq!(component, I2C_COMPONENT_ID);
338+
assert_eq!(error_code, I2C_ERROR_BASE | I2C_BUS_ERROR as u16);
306339
} else {
307340
panic!("Expected HardwareError variant");
308341
}
@@ -316,8 +349,8 @@ mod tests {
316349
..
317350
} = i2c_nack
318351
{
319-
assert_eq!(component, 3); // I2C component
320-
assert_eq!(error_code, 0x6303); // 0x6300 | 0x03
352+
assert_eq!(component, I2C_COMPONENT_ID);
353+
assert_eq!(error_code, I2C_ERROR_BASE | I2C_NACK_ADDRESS as u16);
321354
} else {
322355
panic!("Expected HardwareError variant");
323356
}
@@ -385,8 +418,8 @@ mod tests {
385418
..
386419
} = spi_error
387420
{
388-
assert_eq!(component, 2); // SPI component
389-
assert_eq!(error_code, 0x6104); // 0x6100 | 0x04 (Overrun) - component-specific code
421+
assert_eq!(component, SPI_COMPONENT_ID);
422+
assert_eq!(error_code, SPI_ERROR_BASE | SPI_OVERRUN as u16); // component-specific code
390423
} else {
391424
panic!("Expected HardwareError variant");
392425
}
@@ -400,8 +433,8 @@ mod tests {
400433
..
401434
} = i2c_error
402435
{
403-
assert_eq!(component, 3); // I2C component
404-
assert_eq!(error_code, 0x6301); // 0x6300 | 0x01 (Bus) - component-specific code
436+
assert_eq!(component, I2C_COMPONENT_ID);
437+
assert_eq!(error_code, I2C_ERROR_BASE | I2C_BUS_ERROR as u16); // component-specific code
405438
} else {
406439
panic!("Expected HardwareError variant");
407440
}

0 commit comments

Comments
 (0)