From 324bff8b6f4a7b20a7b8f6fa51d3e58ef21440aa Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Wed, 29 Nov 2023 20:53:23 +0100 Subject: [PATCH] Fixes for updated embedded hal --- rtic-monotonics/Cargo.toml | 4 ++-- rtic-monotonics/src/imxrt.rs | 14 ++++++++++++-- rtic-monotonics/src/nrf/rtc.rs | 14 ++++++++++++-- rtic-monotonics/src/nrf/timer.rs | 14 ++++++++++++-- rtic-monotonics/src/rp2040.rs | 13 +++++++++++-- rtic-monotonics/src/stm32.rs | 14 ++++++++++++-- rtic-monotonics/src/systick.rs | 17 +++++++++++++++-- rtic-sync/Cargo.toml | 6 +++--- rtic-sync/src/arbiter.rs | 8 ++++---- 9 files changed, 83 insertions(+), 21 deletions(-) diff --git a/rtic-monotonics/Cargo.toml b/rtic-monotonics/Cargo.toml index 441e772f8b58..4d9dc0b86394 100644 --- a/rtic-monotonics/Cargo.toml +++ b/rtic-monotonics/Cargo.toml @@ -28,8 +28,8 @@ rustdoc-flags = ["--cfg", "docsrs"] [dependencies] rtic-time = { version = "1.0.0", path = "../rtic-time" } -embedded-hal = { version = "1.0.0-rc.1" } -embedded-hal-async = { version = "1.0.0-rc.1", optional = true } +embedded-hal = { version = "1.0.0-rc.2" } +embedded-hal-async = { version = "1.0.0-rc.2", optional = true } fugit = { version = "0.3.6" } atomic-polyfill = "1" cfg-if = "1.0.0" diff --git a/rtic-monotonics/src/imxrt.rs b/rtic-monotonics/src/imxrt.rs index 39448291a0db..41d1fd2fbf95 100644 --- a/rtic-monotonics/src/imxrt.rs +++ b/rtic-monotonics/src/imxrt.rs @@ -217,7 +217,12 @@ macro_rules! make_timer { } #[cfg(feature = "embedded-hal-async")] - impl embedded_hal_async::delay::DelayUs for $mono_name { + impl embedded_hal_async::delay::DelayNs for $mono_name { + #[inline] + async fn delay_ns(&mut self, ns: u32) { + Self::delay((ns as u64).nanos()).await; + } + #[inline] async fn delay_us(&mut self, us: u32) { Self::delay((us as u64).micros()).await; @@ -229,7 +234,12 @@ macro_rules! make_timer { } } - impl embedded_hal::delay::DelayUs for $mono_name { + impl embedded_hal::delay::DelayNs for $mono_name { + fn delay_ns(&mut self, ns: u32) { + let done = Self::now() + u64::from(ns).nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { let done = Self::now() + (us as u64).micros(); while Self::now() < done {} diff --git a/rtic-monotonics/src/nrf/rtc.rs b/rtic-monotonics/src/nrf/rtc.rs index 94913071d8ef..e42dd1bd6447 100644 --- a/rtic-monotonics/src/nrf/rtc.rs +++ b/rtic-monotonics/src/nrf/rtc.rs @@ -168,7 +168,12 @@ macro_rules! make_rtc { } #[cfg(feature = "embedded-hal-async")] - impl embedded_hal_async::delay::DelayUs for $mono_name { + impl embedded_hal_async::delay::DelayNs for $mono_name { + #[inline] + async fn delay_ns(&mut self, ns: u32) { + Self::delay((ns as u64).nanos()).await; + } + #[inline] async fn delay_us(&mut self, us: u32) { Self::delay((us as u64).micros()).await; @@ -180,7 +185,12 @@ macro_rules! make_rtc { } } - impl embedded_hal::delay::DelayUs for $mono_name { + impl embedded_hal::delay::DelayNs for $mono_name { + fn delay_ns(&mut self, ns: u32) { + let done = Self::now() + u64::from(ns).nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { let done = Self::now() + u64::from(us).micros(); while Self::now() < done {} diff --git a/rtic-monotonics/src/nrf/timer.rs b/rtic-monotonics/src/nrf/timer.rs index 589cc6fdfbae..94dbc2929afc 100644 --- a/rtic-monotonics/src/nrf/timer.rs +++ b/rtic-monotonics/src/nrf/timer.rs @@ -204,7 +204,12 @@ macro_rules! make_timer { } #[cfg(feature = "embedded-hal-async")] - impl embedded_hal_async::delay::DelayUs for $mono_name { + impl embedded_hal_async::delay::DelayNs for $mono_name { + #[inline] + async fn delay_ns(&mut self, ns: u32) { + Self::delay((ns as u64).nanos()).await; + } + #[inline] async fn delay_us(&mut self, us: u32) { Self::delay((us as u64).micros()).await; @@ -216,7 +221,12 @@ macro_rules! make_timer { } } - impl embedded_hal::delay::DelayUs for $mono_name { + impl embedded_hal::delay::DelayNs for $mono_name { + fn delay_ns(&mut self, ns: u32) { + let done = Self::now() + u64::from(ns).nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { let done = Self::now() + (us as u64).micros(); while Self::now() < done {} diff --git a/rtic-monotonics/src/rp2040.rs b/rtic-monotonics/src/rp2040.rs index 130c7d3e60ba..2062558f16cb 100644 --- a/rtic-monotonics/src/rp2040.rs +++ b/rtic-monotonics/src/rp2040.rs @@ -152,7 +152,11 @@ impl Monotonic for Timer { } #[cfg(feature = "embedded-hal-async")] -impl embedded_hal_async::delay::DelayUs for Timer { +impl embedded_hal_async::delay::DelayNs for Timer { + async fn delay_ns(&mut self, ns: u32) { + Self::delay((ns as u64).nanos()).await; + } + async fn delay_us(&mut self, us: u32) { Self::delay((us as u64).micros()).await; } @@ -162,7 +166,12 @@ impl embedded_hal_async::delay::DelayUs for Timer { } } -impl embedded_hal::delay::DelayUs for Timer { +impl embedded_hal::delay::DelayNs for Timer { + fn delay_ns(&mut self, ns: u32) { + let done = Self::now() + u64::from(ns).nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { let done = Self::now() + u64::from(us).micros(); while Self::now() < done {} diff --git a/rtic-monotonics/src/stm32.rs b/rtic-monotonics/src/stm32.rs index 2676a3462786..bec84a304dc1 100644 --- a/rtic-monotonics/src/stm32.rs +++ b/rtic-monotonics/src/stm32.rs @@ -219,7 +219,12 @@ macro_rules! make_timer { } #[cfg(feature = "embedded-hal-async")] - impl embedded_hal_async::delay::DelayUs for $mono_name { + impl embedded_hal_async::delay::DelayNs for $mono_name { + #[inline] + async fn delay_ns(&mut self, ns: u32) { + Self::delay((ns as u64).nanos()).await; + } + #[inline] async fn delay_us(&mut self, us: u32) { Self::delay((us as u64).micros()).await; @@ -231,7 +236,12 @@ macro_rules! make_timer { } } - impl embedded_hal::delay::DelayUs for $mono_name { + impl embedded_hal::delay::DelayNs for $mono_name { + fn delay_ns(&mut self, ns: u32) { + let done = Self::now() + u64::from(ns).nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { let done = Self::now() + (us as u64).micros(); while Self::now() < done {} diff --git a/rtic-monotonics/src/systick.rs b/rtic-monotonics/src/systick.rs index 265ca9a0ecf4..0eb24468e2df 100644 --- a/rtic-monotonics/src/systick.rs +++ b/rtic-monotonics/src/systick.rs @@ -189,7 +189,13 @@ impl Monotonic for Systick { } #[cfg(feature = "embedded-hal-async")] -impl embedded_hal_async::delay::DelayUs for Systick { +impl embedded_hal_async::delay::DelayNs for Systick { + async fn delay_ns(&mut self, ns: u32) { + #[cfg(feature = "systick-64bit")] + let ns = u64::from(ns); + Self::delay(ns.nanos()).await; + } + async fn delay_us(&mut self, us: u32) { #[cfg(feature = "systick-64bit")] let us = u64::from(us); @@ -203,7 +209,14 @@ impl embedded_hal_async::delay::DelayUs for Systick { } } -impl embedded_hal::delay::DelayUs for Systick { +impl embedded_hal::delay::DelayNs for Systick { + fn delay_ns(&mut self, ns: u32) { + #[cfg(feature = "systick-64bit")] + let ns = u64::from(ns); + let done = Self::now() + ns.nanos(); + while Self::now() < done {} + } + fn delay_us(&mut self, us: u32) { #[cfg(feature = "systick-64bit")] let us = u64::from(us); diff --git a/rtic-sync/Cargo.toml b/rtic-sync/Cargo.toml index 39f62dc8f70f..8172e2629cc3 100644 --- a/rtic-sync/Cargo.toml +++ b/rtic-sync/Cargo.toml @@ -21,9 +21,9 @@ heapless = "0.7" critical-section = "1" rtic-common = { version = "1.0.0", path = "../rtic-common" } portable-atomic = { version = "1", default-features = false } -embedded-hal = { version = "1.0.0-rc.1", optional = true } -embedded-hal-async = { version = "1.0.0-rc.1", optional = true } -embedded-hal-bus = { version = "0.1.0-rc.1", optional = true, features = ["async"] } +embedded-hal = { version = "1.0.0-rc.2", optional = true } +embedded-hal-async = { version = "1.0.0-rc.2", optional = true } +embedded-hal-bus = { version = "0.1.0-rc.2", optional = true, features = ["async"] } [dev-dependencies] tokio = { version = "1", features = ["rt", "macros", "time"] } diff --git a/rtic-sync/src/arbiter.rs b/rtic-sync/src/arbiter.rs index 99d4174829bb..f0dbc4cdb382 100644 --- a/rtic-sync/src/arbiter.rs +++ b/rtic-sync/src/arbiter.rs @@ -197,7 +197,7 @@ pub mod spi { use super::Arbiter; use embedded_hal::digital::OutputPin; use embedded_hal_async::{ - delay::DelayUs, + delay::DelayNs, spi::{ErrorType, Operation, SpiBus, SpiDevice}, }; use embedded_hal_bus::spi::DeviceError; @@ -229,7 +229,7 @@ pub mod spi { Word: Copy + 'static, BUS: SpiBus, CS: OutputPin, - D: DelayUs, + D: DelayNs, { async fn transaction( &mut self, @@ -246,10 +246,10 @@ pub mod spi { Operation::Write(buf) => bus.write(buf).await, Operation::Transfer(read, write) => bus.transfer(read, write).await, Operation::TransferInPlace(buf) => bus.transfer_in_place(buf).await, - Operation::DelayUs(us) => match bus.flush().await { + Operation::DelayNs(ns) => match bus.flush().await { Err(e) => Err(e), Ok(()) => { - self.delay.delay_us(*us).await; + self.delay.delay_ns(*ns).await; Ok(()) } },