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: u16) {
unsafe { NVIC::unmask(Irq(irq)) }
}
pub fn disable(irq: u16) {
NVIC::mask(Irq(irq));
}
pub fn is_enabled(irq: u16) -> bool {
NVIC::is_enabled(Irq(irq))
}
pub fn pend(irq: u16) {
NVIC::pend(Irq(irq));
}
pub fn unpend(irq: u16) {
NVIC::unpend(Irq(irq));
}
pub fn is_pending(irq: u16) -> bool {
NVIC::is_pending(Irq(irq))
}
pub unsafe fn set_priority(irq: u16, priority: u8) {
#[allow(clippy::multiple_unsafe_ops_per_block)]
unsafe {
cortex_m::Peripherals::steal()
.NVIC
.set_priority(Irq(irq), priority);
}
}
pub fn priority(irq: u16) -> u8 {
NVIC::get_priority(Irq(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);
}
}