nodo/codelet/
task_clock.rs1use crate::core::{
4 AcqtimeMarker, AppMonotonicClock, Clock, Pubtime, PubtimeMarker, SysMonotonicClock,
5};
6
7#[derive(Clone)]
9pub struct Clocks {
10 pub app_mono: AppMonotonicClock<PubtimeMarker>,
12
13 pub sys_mono: SysMonotonicClock<AcqtimeMarker>,
15}
16
17impl Clocks {
18 pub fn new() -> Self {
19 Self {
20 app_mono: AppMonotonicClock::new(),
21 sys_mono: SysMonotonicClock::new(),
22 }
23 }
24}
25
26#[derive(Clone)]
28pub struct TaskClocks {
29 pub app_mono: AppMonotonicClock<PubtimeMarker>,
31
32 pub sys_mono: SysMonotonicClock<AcqtimeMarker>,
34
35 pub codelet: CodeletClock,
37}
38
39impl TaskClocks {
40 pub fn from(clocks: Clocks) -> Self {
41 Self {
42 app_mono: clocks.app_mono.clone(),
43 sys_mono: clocks.sys_mono.clone(),
44 codelet: CodeletClock::new(clocks.app_mono.now()),
45 }
46 }
47
48 pub(crate) fn on_codelet_start(&mut self) {
49 let now = self.app_mono.now();
50 self.codelet.last = now;
51 }
52
53 pub(crate) fn on_codelet_stop(&mut self) {}
54
55 pub(crate) fn on_codelet_step(&mut self) {
56 let now = self.app_mono.now();
57 self.codelet.update_dt(now);
58 }
59}
60
61#[derive(Clone)]
62pub struct CodeletClock {
63 last: Pubtime,
64 dt: f64,
65}
66
67impl CodeletClock {
68 pub fn new(now: Pubtime) -> Self {
69 Self { last: now, dt: 0.0 }
70 }
71
72 pub fn update_dt(&mut self, now: Pubtime) {
73 let dt = self.last.abs_diff(now).as_secs_f64();
74 self.last = now;
75 self.dt = dt;
76 }
77
78 pub fn step_time(&self) -> Pubtime {
82 self.last
83 }
84
85 pub fn dt_secs_f32(&self) -> f32 {
87 self.dt as f32
88 }
89
90 pub fn dt_secs_f64(&self) -> f64 {
92 self.dt
93 }
94}