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>::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 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}