use crate::base::*;
use crate::task::*;
use crate::shim::*;
use crate::units::*;
pub struct TaskDelay {
last_wake_time: FreeRtosTickType,
}
impl TaskDelay {
pub fn new() -> TaskDelay {
TaskDelay { last_wake_time: FreeRtosUtils::get_tick_count() }
}
pub fn delay_until<D: DurationTicks>(&mut self, delay: D) {
unsafe {
freertos_rs_vTaskDelayUntil(&mut self.last_wake_time as *mut FreeRtosTickType,
delay.to_ticks());
}
}
}
pub struct TaskDelayPeriodic {
last_wake_time: FreeRtosTickType,
period_ticks: FreeRtosTickType,
}
impl TaskDelayPeriodic {
pub fn new<D: DurationTicks>(period: D) -> TaskDelayPeriodic {
let l = FreeRtosUtils::get_tick_count();
TaskDelayPeriodic {
last_wake_time: l,
period_ticks: period.to_ticks(),
}
}
pub fn should_run(&mut self) -> bool {
let c = FreeRtosUtils::get_tick_count();
if (c - self.last_wake_time) < (self.period_ticks) {
false
} else {
self.last_wake_time = c;
true
}
}
pub fn set_period<D: DurationTicks>(&mut self, period: D) {
self.period_ticks = period.to_ticks();
}
pub fn reset(&mut self) {
self.last_wake_time = FreeRtosUtils::get_tick_count();
}
}