embassy_time/
delay.rs

1use super::{Duration, Instant};
2use crate::Timer;
3
4/// Blocks for at least `duration`.
5pub fn block_for(duration: Duration) {
6    let expires_at = Instant::now() + duration;
7    while Instant::now() < expires_at {}
8}
9
10/// Type implementing async delays and blocking `embedded-hal` delays.
11///
12/// The delays are implemented in a "best-effort" way, meaning that the cpu will block for at least
13/// the amount provided, but accuracy can be affected by many factors, including interrupt usage.
14/// Make sure to use a suitable tick rate for your use case. The tick rate is defined by the currently
15/// active driver.
16#[derive(Clone)]
17pub struct Delay;
18
19impl embedded_hal_1::delay::DelayNs for Delay {
20    fn delay_ns(&mut self, ns: u32) {
21        block_for(Duration::from_nanos(ns as u64))
22    }
23
24    fn delay_us(&mut self, us: u32) {
25        block_for(Duration::from_micros(us as u64))
26    }
27
28    fn delay_ms(&mut self, ms: u32) {
29        block_for(Duration::from_millis(ms as u64))
30    }
31}
32
33impl embedded_hal_async::delay::DelayNs for Delay {
34    async fn delay_ns(&mut self, ns: u32) {
35        Timer::after_nanos(ns as _).await
36    }
37
38    async fn delay_us(&mut self, us: u32) {
39        Timer::after_micros(us as _).await
40    }
41
42    async fn delay_ms(&mut self, ms: u32) {
43        Timer::after_millis(ms as _).await
44    }
45}
46
47impl embedded_hal_02::blocking::delay::DelayMs<u8> for Delay {
48    fn delay_ms(&mut self, ms: u8) {
49        block_for(Duration::from_millis(ms as u64))
50    }
51}
52
53impl embedded_hal_02::blocking::delay::DelayMs<u16> for Delay {
54    fn delay_ms(&mut self, ms: u16) {
55        block_for(Duration::from_millis(ms as u64))
56    }
57}
58
59impl embedded_hal_02::blocking::delay::DelayMs<u32> for Delay {
60    fn delay_ms(&mut self, ms: u32) {
61        block_for(Duration::from_millis(ms as u64))
62    }
63}
64
65impl embedded_hal_02::blocking::delay::DelayUs<u8> for Delay {
66    fn delay_us(&mut self, us: u8) {
67        block_for(Duration::from_micros(us as u64))
68    }
69}
70
71impl embedded_hal_02::blocking::delay::DelayUs<u16> for Delay {
72    fn delay_us(&mut self, us: u16) {
73        block_for(Duration::from_micros(us as u64))
74    }
75}
76
77impl embedded_hal_02::blocking::delay::DelayUs<u32> for Delay {
78    fn delay_us(&mut self, us: u32) {
79        block_for(Duration::from_micros(us as u64))
80    }
81}