#![no_std]
#![deny(missing_docs)]
use core::{error::Error, fmt::Display};
pub trait Timer {
fn start(&mut self);
fn tickrate(&self) -> u64;
fn elapsed_ticks(&self) -> Result<u64, OverflowError>;
fn elapsed_nanos(&self) -> Result<u64, OverflowError>;
fn elapsed_micros(&self) -> Result<u64, OverflowError>;
fn elapsed_millis(&self) -> Result<u64, OverflowError>;
fn elapsed_secs(&self) -> Result<u64, OverflowError>;
fn max_ticks(&self) -> u64;
fn max_nanos(&self) -> u64;
fn max_micros(&self) -> u64;
fn max_millis(&self) -> u64;
fn max_secs(&self) -> u64;
}
#[allow(async_fn_in_trait)]
pub trait Alarm: Timer {
async fn wait_until_ticks(&mut self, value: u64) -> Result<(), OverflowError>;
async fn wait_until_nanos(&mut self, value: u64) -> Result<(), OverflowError>;
async fn wait_until_micros(&mut self, value: u64) -> Result<(), OverflowError>;
async fn wait_until_millis(&mut self, value: u64) -> Result<(), OverflowError>;
async fn wait_until_secs(&mut self, value: u64) -> Result<(), OverflowError>;
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Hash, PartialOrd, Ord)]
pub struct OverflowError;
#[cfg(feature = "defmt")]
impl defmt::Format for OverflowError {
fn format(&self, fmt: defmt::Formatter) {
defmt::write!(fmt, "overflow")
}
}
impl Display for OverflowError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "overflow")
}
}
impl Error for OverflowError {}