Skip to content

Commit 9baa541

Browse files
committed
Allow mapping interrupt in Vector.
1 parent 924293d commit 9baa541

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

src/peripheral/scb.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

304304
impl Vector {
@@ -311,10 +311,20 @@ 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+
#[inline]
321+
pub fn map_interrupt<INT>(&self, f: impl FnOnce(u16) -> INT) -> Vector<INT> {
322+
match self {
323+
Self::ThreadMode => Vector::ThreadMode,
324+
Self::Exception(ex) => Vector::Exception(*ex),
325+
Self::Interrupt(irqn) => Vector::Interrupt(f(*irqn)),
326+
}
327+
}
318328
}
319329

320330
impl TryFrom<u16> for Vector {
@@ -326,7 +336,7 @@ impl TryFrom<u16> for Vector {
326336
Ok(match isrn {
327337
0 => Self::ThreadMode,
328338
2..=15 => Self::Exception(Exception::try_from(isrn as i8 - 16).or(Err(isrn))?),
329-
16..=511 => Self::Interrupt { irqn: isrn - 16 },
339+
16..=511 => Self::Interrupt(isrn - 16),
330340
_ => return Err(isrn),
331341
})
332342
}

xtask/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ pub fn check_host_side() {
2424
{
2525
let v = Vector::try_from(22).unwrap();
2626
let json = serde_json::to_string(&v).expect("Failed to serialize Vector");
27-
let deser_v: Vector =
28-
serde_json::from_str(&json).expect("Failed to deserialize Vector");
27+
let deser_v: Vector = serde_json::from_str(&json).expect("Failed to deserialize Vector");
2928
assert_eq!(deser_v, v);
3029

3130
let lts = LocalTimestampOptions::EnabledDiv4;

0 commit comments

Comments
 (0)