timeout_trait/
lib.rs

1//! Traits used to wait and timeout in a `no-std` embedded system.
2//!
3//!
4//! # Cargo Features
5//!
6//! - `std`: Used for unit test. Disabled by default.
7
8#![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
28/// It doesn't require operation interfaces on `TickInstant` itself.
29/// Embedded systems can thus implement only the relative time version.
30pub trait TickInstant: Clone {
31    fn frequency() -> KilohertzU32;
32    fn now() -> Self;
33    /// Returns the amount of ticks elapsed since this instant.
34    fn elapsed(&mut self) -> TickDuration<Self>;
35
36    /// Move the instant forward, but it cannot be in the future.
37    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}