1#![cfg_attr(not(feature = "std"), no_std)]
9
10pub mod delay;
11pub mod duration;
12pub mod fake_impls;
13pub mod prelude;
14#[cfg(feature = "std")]
15pub mod std_impls;
16pub mod timeout;
17
18#[cfg(all(feature = "std", test))]
19mod mock;
20
21pub use delay::TickDelay;
22pub use duration::TickDuration;
23pub use embedded_hal;
24pub use fake_impls::*;
25pub use fugit::{self, KilohertzU32, MicrosDurationU32};
26pub use timeout::TickTimeout;
27
28pub trait TickInstant: Clone {
31 fn frequency() -> KilohertzU32;
32 fn now() -> Self;
33 fn elapsed(&mut self) -> TickDuration<Self>;
35
36 fn move_forward(&mut self, dur: &TickDuration<Self>);
38
39 #[inline]
40 fn timeout(&mut self, dur: &TickDuration<Self>) -> bool {
41 &self.elapsed() >= dur
42 }
43
44 fn timeout_with(&self, dur: &TickDuration<Self>, mut f: impl FnMut() -> bool) -> bool {
45 let mut t = Self::now();
46 while f() {
47 if t.timeout(dur) {
48 return true;
49 }
50 }
51 false
52 }
53
54 fn time_left(&mut self, dur: &TickDuration<Self>) -> TickDuration<Self> {
55 let elapsed = &self.elapsed();
56 if elapsed >= dur {
57 TickDuration::ZERO
58 } else {
59 dur - elapsed
60 }
61 }
62}