@@ -287,18 +287,18 @@ impl TryFrom<i8> for Exception {
287287#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
288288#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
289289#[ cfg_attr( feature = "std" , derive( PartialOrd , Hash ) ) ]
290- pub enum Vector {
290+ pub enum Vector < INT = u16 > {
291291 /// Thread mode
292292 ThreadMode ,
293293
294294 /// Processor core exception (internal interrupts)
295295 Exception ( Exception ) ,
296296
297297 /// Device specific exception (external interrupts)
298- Interrupt {
298+ Interrupt (
299299 /// Interrupt number. This number is always in range `[0, 495]` (9-bit integer - 16)
300- irqn : u16 ,
301- } ,
300+ INT ,
301+ ) ,
302302}
303303
304304impl Vector {
@@ -311,10 +311,35 @@ impl Vector {
311311 match isrn {
312312 0 => Self :: ThreadMode ,
313313 2 ..=15 => Self :: Exception ( Exception :: new_unchecked ( isrn as i8 - 16 ) ) ,
314- 16 ..=511 => Self :: Interrupt { irqn : isrn - 16 } ,
314+ 16 ..=511 => Self :: Interrupt ( isrn - 16 ) ,
315315 _ => core:: hint:: unreachable_unchecked ( ) ,
316316 }
317317 }
318+
319+ /// Map the interrupt number to a different type.
320+ ///
321+ /// ### Example
322+ ///
323+ /// ```
324+ /// #[exception]
325+ /// unsafe fn DefaultHandler(vect_active: Vector) -> ! {
326+ /// let interrupt = vect_active.map_interrupt(|i| {
327+ /// core::mem::transmute::<_, stm32l4xx_hal::pac::interrupt>(i)
328+ /// });
329+ ///
330+ /// log::error!("Unexpected interrupt: ({:?})", interrupt);
331+ ///
332+ /// loop {}
333+ /// }
334+ /// ```
335+ #[ inline]
336+ pub fn map_interrupt < INT > ( & self , f : impl FnOnce ( u16 ) -> INT ) -> Vector < INT > {
337+ match self {
338+ Self :: ThreadMode => Vector :: ThreadMode ,
339+ Self :: Exception ( ex) => Vector :: Exception ( * ex) ,
340+ Self :: Interrupt ( irqn) => Vector :: Interrupt ( f ( * irqn) ) ,
341+ }
342+ }
318343}
319344
320345impl TryFrom < u16 > for Vector {
@@ -326,7 +351,7 @@ impl TryFrom<u16> for Vector {
326351 Ok ( match isrn {
327352 0 => Self :: ThreadMode ,
328353 2 ..=15 => Self :: Exception ( Exception :: try_from ( isrn as i8 - 16 ) . or ( Err ( isrn) ) ?) ,
329- 16 ..=511 => Self :: Interrupt { irqn : isrn - 16 } ,
354+ 16 ..=511 => Self :: Interrupt ( isrn - 16 ) ,
330355 _ => return Err ( isrn) ,
331356 } )
332357 }
0 commit comments