use cortex_m::interrupt::InterruptNumber;
use cortex_m::peripheral::NVIC;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Irq(pub u16);
unsafe impl InterruptNumber for Irq {
fn number(self) -> u16 {
self.0
}
}
pub unsafe fn enable(irq: impl InterruptNumber) {
unsafe { NVIC::unmask(irq) }
}
pub fn disable(irq: impl InterruptNumber) {
NVIC::mask(irq);
}
pub fn is_enabled(irq: impl InterruptNumber) -> bool {
NVIC::is_enabled(irq)
}
pub fn pend(irq: impl InterruptNumber) {
NVIC::pend(irq);
}
pub fn unpend(irq: impl InterruptNumber) {
NVIC::unpend(irq);
}
pub fn is_pending(irq: impl InterruptNumber) -> bool {
NVIC::is_pending(irq)
}
pub unsafe fn set_priority(irq: impl InterruptNumber, priority: u8) {
#[allow(clippy::multiple_unsafe_ops_per_block)]
unsafe {
cortex_m::Peripherals::steal()
.NVIC
.set_priority(irq, priority);
}
}
pub fn priority(irq: impl InterruptNumber) -> u8 {
NVIC::get_priority(irq)
}
#[cfg(test)]
mod tests {
use super::Irq;
use cortex_m::interrupt::InterruptNumber;
#[test]
fn irq_forwards_its_number() {
assert_eq!(Irq(0).number(), 0);
assert_eq!(Irq(225).number(), 225);
}
}