@@ -14,6 +14,38 @@ use embedded_hal::i2c;
1414use embedded_hal:: spi;
1515use 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