use super::StorageError;
use crate::{
sync::{RawLock, RawLockGuard},
timer::{Divider, Timer},
};
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<RawLockGuard<'static>, StorageError> {
static LOCK: RawLock = RawLock::new();
match LOCK.try_lock() {
Some(x) => Ok(x),
None => Err(StorageError::MediaInUse),
}
}