sim_lib_view_device/
clock.rs1use crate::RateClass;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub struct FrameClock {
11 pub tick: u64,
13 pub rate: RateClass,
15}
16
17impl FrameClock {
18 pub fn new(tick: u64, rate: RateClass) -> Self {
20 Self { tick, rate }
21 }
22
23 pub fn at_zero(rate: RateClass) -> Self {
25 Self::new(0, rate)
26 }
27
28 pub fn advance(&mut self) {
30 self.tick = self.tick.saturating_add(1);
31 }
32
33 pub fn elapsed_ms_since(self, state_seq: u64) -> u64 {
35 let elapsed_ticks = self.tick.saturating_sub(state_seq);
36 elapsed_ticks.saturating_mul(1000) / u64::from(self.rate.adapt_hz.max(1))
37 }
38
39 pub fn stale(self, state_seq: u64) -> bool {
41 self.elapsed_ms_since(state_seq) > u64::from(self.rate.max_stale_ms)
42 }
43}