use crate::core::{
AcqtimeMarker, AppMonotonicClock, Clock, Pubtime, PubtimeMarker, SysMonotonicClock,
};
#[derive(Clone)]
pub struct Clocks {
pub app_mono: AppMonotonicClock<PubtimeMarker>,
pub sys_mono: SysMonotonicClock<AcqtimeMarker>,
}
impl Clocks {
pub fn new() -> Self {
Self {
app_mono: AppMonotonicClock::new(),
sys_mono: SysMonotonicClock::new(),
}
}
}
#[derive(Clone)]
pub struct TaskClocks {
pub app_mono: AppMonotonicClock<PubtimeMarker>,
pub sys_mono: SysMonotonicClock<AcqtimeMarker>,
pub codelet: CodeletClock,
}
impl TaskClocks {
pub fn from(clocks: Clocks) -> Self {
Self {
app_mono: clocks.app_mono.clone(),
sys_mono: clocks.sys_mono.clone(),
codelet: CodeletClock::new(clocks.app_mono.now()),
}
}
pub(crate) fn on_codelet_start(&mut self) {
let now = self.app_mono.now();
self.codelet.last = now;
}
pub(crate) fn on_codelet_stop(&mut self) {}
pub(crate) fn on_codelet_step(&mut self) {
let now = self.app_mono.now();
self.codelet.update_dt(now);
}
}
#[derive(Clone)]
pub struct CodeletClock {
last: Pubtime,
dt: f64,
}
impl CodeletClock {
pub fn new(now: Pubtime) -> Self {
Self { last: now, dt: 0.0 }
}
pub fn update_dt(&mut self, now: Pubtime) {
let dt = self.last.abs_diff(now).as_secs_f64();
self.last = now;
self.dt = dt;
}
pub fn step_time(&self) -> Pubtime {
self.last
}
pub fn dt_secs_f32(&self) -> f32 {
self.dt as f32
}
pub fn dt_secs_f64(&self) -> f64 {
self.dt
}
}