use core::time::Duration;
use crate::ArchTrait;
const NANOS_PER_SEC: u64 = 1_000_000_000;
pub fn enable() {
crate::arch::Arch::systimer_enable();
}
pub fn irq_disable() {
crate::arch::Arch::systimer_irq_disable();
}
pub fn irq_enable() {
crate::arch::Arch::systimer_irq_enable();
}
pub fn irq_is_enabled() -> bool {
crate::arch::Arch::systimer_irq_is_enabled()
}
pub fn set_next_event(interval: Duration) {
let ticks = duration_to_ticks(interval);
crate::arch::Arch::systimer_set_interval(ticks);
}
pub fn set_next_event_in_ticks(ticks: usize) {
crate::arch::Arch::systimer_set_interval(ticks);
}
pub fn ack() {
crate::arch::Arch::systimer_ack();
}
pub fn since_boot() -> Duration {
elapsed()
}
#[inline]
pub fn freq() -> usize {
crate::arch::Arch::systimer_freq()
}
#[inline]
pub fn ticks() -> usize {
crate::arch::Arch::systimer_tick()
}
#[inline]
pub fn ticks_to_duration(ticks: usize) -> Duration {
let freq = freq();
if freq == 0 {
return Duration::ZERO;
}
let nanos = (ticks as u128 * NANOS_PER_SEC as u128) / freq as u128;
Duration::from_nanos(nanos as u64)
}
#[inline]
pub fn duration_to_ticks(duration: Duration) -> usize {
let freq = freq();
if freq == 0 {
return 0;
}
let ticks = (duration.as_nanos() * freq as u128) / NANOS_PER_SEC as u128;
ticks as _
}
#[inline]
pub fn elapsed() -> Duration {
ticks_to_duration(ticks())
}