hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use core::sync::atomic::{AtomicUsize, Ordering};

pub struct ClockEvent {
    pub interval_ns: u64,
    pub handler: fn(),
}

static INTERVAL: AtomicUsize = AtomicUsize::new(0);
static EVENT_COUNT: AtomicUsize = AtomicUsize::new(0);

static ACTIVE_EVENT: crate::common::once::Once<ClockEvent> = crate::common::once::Once::new();

pub fn register(event: ClockEvent) -> bool {
    INTERVAL.store(event.interval_ns as usize, Ordering::Release);
    ACTIVE_EVENT.set(event)
}

pub fn fire() {
    if let Some(ev) = ACTIVE_EVENT.get() {
        EVENT_COUNT.fetch_add(1, Ordering::AcqRel);
        (ev.handler)();
    }
}

pub fn event_count() -> usize {
    EVENT_COUNT.load(Ordering::Acquire)
}

pub fn interval() -> u64 {
    INTERVAL.load(Ordering::Acquire) as u64
}