timeout_trait/
delay_impls.rs1use super::{embedded_hal::delay::DelayNs, prelude::*, tick_impl::TickTimeoutNs};
2use core::marker::PhantomData;
3
4pub 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 #[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}