//! Macros that implement embedded-hal traits for Monotonics /// Implements [`embedded_hal::delay::DelayNs`] for a given monotonic. #[macro_export] macro_rules! impl_embedded_hal_delay_fugit { ($t:ty) => { impl $crate::embedded_hal::delay::DelayNs for $t { fn delay_ns(&mut self, ns: u32) { let now = ::now(); let mut done = now + ::Duration::nanos_at_least(ns.into()); if now != done { // Compensate for sub-tick uncertainty done += ::Duration::from_ticks(1); } while ::now() < done {} } fn delay_us(&mut self, us: u32) { let now = ::now(); let mut done = now + ::Duration::micros_at_least(us.into()); if now != done { // Compensate for sub-tick uncertainty done += ::Duration::from_ticks(1); } while ::now() < done {} } fn delay_ms(&mut self, ms: u32) { let now = ::now(); let mut done = now + ::Duration::millis_at_least(ms.into()); if now != done { // Compensate for sub-tick uncertainty done += ::Duration::from_ticks(1); } while ::now() < done {} } } }; } /// Implements [`embedded_hal_async::delay::DelayNs`] for a given monotonic. #[macro_export] macro_rules! impl_embedded_hal_async_delay_fugit { ($t:ty) => { impl $crate::embedded_hal_async::delay::DelayNs for $t { #[inline] async fn delay_ns(&mut self, ns: u32) { ::delay( ::Duration::nanos_at_least(ns.into()), ) .await; } #[inline] async fn delay_us(&mut self, us: u32) { ::delay( ::Duration::micros_at_least(us.into()), ) .await; } #[inline] async fn delay_ms(&mut self, ms: u32) { ::delay( ::Duration::millis_at_least(ms.into()), ) .await; } } }; }