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>::new().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    #[derive(Default)]
41    pub struct StdDelayNs {}
42
43    impl DelayNs for StdDelayNs {
44        #[inline]
45        fn delay_ns(&mut self, ns: u32) {
46            std::thread::sleep(Duration::from_nanos(ns.into()))
47        }
48    }
49
50    #[cfg(test)]
51    mod tests {
52        use super::*;
53        use std::time::{Duration, Instant};
54
55        fn test_delay(mut d: impl DelayNs) {
56            let t = Instant::now();
57            d.delay_ns(200_000_000);
58            let elapsed = t.elapsed();
59            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
60
61            let t = Instant::now();
62            d.delay_us(200_000);
63            let elapsed = t.elapsed();
64            assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
65
66            let t = Instant::now();
67            d.delay_ms(500);
68            let elapsed = t.elapsed();
69            assert!(elapsed - Duration::from_millis(500) < Duration::from_millis(100));
70        }
71
72        #[test]
73        fn std_delay() {
74            let d = StdDelayNs::default();
75            test_delay(d);
76        }
77
78        #[test]
79        fn tick_delay() {
80            let d = TickDelay::<Instant>::default();
81            test_delay(d);
82        }
83    }
84}