use super::Error;
use crate::sync::{RawMutex, RawMutexGuard};
use crate::timer::{Timer, Divider};
pub struct Timeout {
timer: Option<Timer>,
}
impl Timeout {
#[inline(never)]
pub fn new(timer: Option<Timer>) -> Self {
Timeout { timer }
}
pub fn start(&mut self) {
if let Some(timer) = &mut self.timer {
timer.set_enabled(false);
timer.set_divider(Divider::Divider1024);
timer.set_interrupt(false);
timer.set_overflow_amount(0xFFFF);
timer.set_cascade(false);
timer.set_enabled(true);
}
}
pub fn check_timeout_met(&self, check_ms: u16) -> bool {
if let Some(timer) = &self.timer {
check_ms * 17 < timer.value()
} else {
false
}
}
}
impl Drop for Timeout {
fn drop(&mut self) {
if let Some(timer) = &mut self.timer {
timer.set_enabled(false);
}
}
}
pub fn lock_media_access() -> Result<RawMutexGuard<'static>, Error> {
static LOCK: RawMutex = RawMutex::new();
match LOCK.try_lock() {
Some(x) => Ok(x),
None => Err(Error::MediaInUse),
}
}