use crate::ringq::RingQ;
use crate::event::{OxideEvent, EventSink};
use crate::mut_singleton;
pub struct OxideSupervisor
{
event_q: RingQ<OxideEvent, 16>
}
mut_singleton!(OxideSupervisor, INSTANCE, instance,
OxideSupervisor {
event_q: RingQ::new()
});
impl OxideSupervisor {
pub fn run<F: FnMut(OxideEvent)>(&mut self, mut handler: F) -> ! {
unsafe {
crate::hal::concurrency::imp::enable_interrupts();
}
loop {
crate::hal::concurrency::imp::wait_for_interrupt();
while let Some(event) = self.event_q.consume() {
handler(event);
}
}
}
}
impl EventSink for OxideSupervisor {
fn event(event: OxideEvent) -> () {
instance().event_q.append(event).unwrap();
}
}