use crate::private::ringq::RingQ;
use crate::event::{OxideEvent, EventSink};
use crate::mut_singleton;
use crate::hal::concurrency::interrupt;
pub struct OxideSupervisor
{
event_q: RingQ<OxideEvent, 16>
}
mut_singleton!(OxideSupervisor, INSTANCE, instance,
OxideSupervisor {
event_q: RingQ::new_with(OxideEvent::Initialise)
});
impl OxideSupervisor {
pub fn run<F: FnMut(OxideEvent)>(&mut self, mut handler: F) -> ! {
loop {
interrupt::wait();
while let Some(event) = self.event_q.consume_nolock() {
handler(event);
}
}
}
}
impl EventSink for OxideSupervisor {
fn event(event: OxideEvent) {
match instance().event_q.append_nolock(event) {
Ok(_) => {
}
Err(_) => {
}
}
}
}