timeout_trait/
delay_impls.rs

1use super::{embedded_hal::delay::DelayNs, prelude::*, tick_impl::TickTimeoutNs};
2use core::marker::PhantomData;
3
4/// [`DelayNs`] implementation
5pub struct TickDelay<T> {
6    _t: PhantomData<T>,
7}
8
9impl<T> Default for TickDelay<T>
10where
11    T: TickInstant,
12{
13    fn default() -> Self {
14        Self { _t: PhantomData }
15    }
16}
17
18impl<T> DelayNs for TickDelay<T>
19where
20    T: TickInstant,
21{
22    #[inline]
23    fn delay_ns(&mut self, ns: u32) {
24        let mut t = TickTimeoutNs::<T>::start_ns(ns);
25        while !t.timeout() {
26            // For unit test
27            #[cfg(feature = "std")]
28            std::thread::sleep(std::time::Duration::from_nanos(1));
29        }
30    }
31}
32
33#[cfg(feature = "std")]
34pub use for_std::*;
35#[cfg(feature = "std")]
36mod for_std {
37    use super::*;
38    use std::time::Duration;
39
40    pub struct StdDelayNs;
41
42    impl DelayNs for StdDelayNs {
43        #[inline]
44        fn delay_ns(&mut self, ns: u32) {
45            std::thread::sleep(Duration::from_nanos(ns.into()))
46        }
47    }
48
49    #[cfg(test)]
50    mod tests {
51        use super::*;
52        use std::time::{Duration, Instant};
53
54        fn test_delay(mut d: impl DelayNs) {
55            let t = Instant::now();
56            d.delay_ns(200_000_000);
57            let elapsed = t.elapsed();
58            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
59
60            let t = Instant::now();
61            d.delay_us(200_000);
62            let elapsed = t.elapsed();
63            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
64
65            let t = Instant::now();
66            d.delay_ms(500);
67            let elapsed = t.elapsed();
68            assert!(elapsed - Duration::from_millis(500) < Duration::from_millis(100));
69        }
70
71        #[test]
72        fn std_delay() {
73            let d = StdDelayNs {};
74            test_delay(d);
75        }
76
77        #[test]
78        fn tick_delay() {
79            let d = TickDelay::<Instant>::default();
80            test_delay(d);
81        }
82    }
83}