Skip to content

Commit 4ec58c8

Browse files
committed
Rename DelayUs to DelayNs, add delay_ns.
1 parent 0b95d0a commit 4ec58c8

File tree

10 files changed

+75
-34
lines changed

10 files changed

+75
-34
lines changed

embedded-hal-async/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
- Minor document fixes.
1111
- Add #[inline] hints to most of `embedded-hal-async` functions.
12+
- delay: Rename `DelayUs` to `DelayNs`
13+
- delay: Add `DelayNs::delay_ns()`
14+
- delay: Add default impls of `delay_ms` and `delay_us` based on `delay_ns`.
1215

1316
## [v1.0.0-rc.1] - 2023-08-15
1417

embedded-hal-async/src/delay.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,42 @@
11
//! Delays.
22
3-
/// Microsecond delay.
4-
pub trait DelayUs {
3+
/// Delay with up to nanosecond precision.
4+
pub trait DelayNs {
5+
/// Pauses execution for at minimum `ns` nanoseconds. Pause can be longer
6+
/// if the implementation requires it due to precision/timing issues.
7+
async fn delay_ns(&mut self, ns: u32);
8+
59
/// Pauses execution for at minimum `us` microseconds. Pause can be longer
610
/// if the implementation requires it due to precision/timing issues.
7-
async fn delay_us(&mut self, us: u32);
11+
async fn delay_us(&mut self, mut us: u32) {
12+
while us > 4_294_967 {
13+
us -= 4_294_967;
14+
self.delay_ns(4_294_967_000).await;
15+
}
16+
self.delay_ns(us * 1_000).await;
17+
}
818

919
/// Pauses execution for at minimum `ms` milliseconds. Pause can be longer
1020
/// if the implementation requires it due to precision/timing issues.
11-
async fn delay_ms(&mut self, ms: u32);
21+
#[inline]
22+
async fn delay_ms(&mut self, mut ms: u32) {
23+
while ms > 4294 {
24+
ms -= 4294;
25+
self.delay_ns(4_294_000_000).await;
26+
}
27+
self.delay_ns(ms * 1_000_000).await;
28+
}
1229
}
1330

14-
impl<T> DelayUs for &mut T
31+
impl<T> DelayNs for &mut T
1532
where
16-
T: DelayUs + ?Sized,
33+
T: DelayNs + ?Sized,
1734
{
35+
#[inline]
36+
async fn delay_ns(&mut self, ns: u32) {
37+
T::delay_ns(self, ns).await;
38+
}
39+
1840
#[inline]
1941
async fn delay_us(&mut self, us: u32) {
2042
T::delay_us(self, us).await;

embedded-hal-bus/src/spi/critical_section.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use core::cell::RefCell;
22
use critical_section::Mutex;
3-
use embedded_hal::delay::DelayUs;
3+
use embedded_hal::delay::DelayNs;
44
use embedded_hal::digital::OutputPin;
55
use embedded_hal::spi::{ErrorType, Operation, SpiBus, SpiDevice};
66

@@ -60,7 +60,7 @@ impl<'a, Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for CriticalSectionDe
6060
where
6161
BUS: SpiBus<Word>,
6262
CS: OutputPin,
63-
D: DelayUs,
63+
D: DelayNs,
6464
{
6565
#[inline]
6666
fn transaction(&mut self, operations: &mut [Operation<'_, Word>]) -> Result<(), Self::Error> {

embedded-hal-bus/src/spi/exclusive.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
//! SPI bus sharing mechanisms.
22
3-
use embedded_hal::delay::DelayUs;
3+
use embedded_hal::delay::DelayNs;
44
use embedded_hal::digital::OutputPin;
55
use embedded_hal::spi::{ErrorType, Operation, SpiBus, SpiDevice};
66
#[cfg(feature = "async")]
77
use embedded_hal_async::{
8-
delay::DelayUs as AsyncDelayUs,
8+
delay::DelayNs as AsyncDelayUs,
99
spi::{SpiBus as AsyncSpiBus, SpiDevice as AsyncSpiDevice},
1010
};
1111

@@ -70,7 +70,7 @@ impl<Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for ExclusiveDevice<BUS,
7070
where
7171
BUS: SpiBus<Word>,
7272
CS: OutputPin,
73-
D: DelayUs,
73+
D: DelayNs,
7474
{
7575
#[inline]
7676
fn transaction(&mut self, operations: &mut [Operation<'_, Word>]) -> Result<(), Self::Error> {

embedded-hal-bus/src/spi/mod.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,18 @@ fn no_delay_panic() {
5353
panic!("You've tried to execute a SPI transaction containing a `Operation::Delay` in a `SpiDevice` created with `new_no_delay()`. Create it with `new()` instead, passing a `DelayUs` implementation.");
5454
}
5555

56-
impl embedded_hal::delay::DelayUs for NoDelay {
56+
impl embedded_hal::delay::DelayNs for NoDelay {
5757
#[inline]
58-
fn delay_us(&mut self, _us: u32) {
58+
fn delay_ns(&mut self, _ns: u32) {
5959
no_delay_panic();
6060
}
6161
}
6262

6363
#[cfg(feature = "async")]
6464
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
65-
impl embedded_hal_async::delay::DelayUs for NoDelay {
65+
impl embedded_hal_async::delay::DelayNs for NoDelay {
6666
#[inline]
67-
async fn delay_us(&mut self, _us: u32) {
68-
no_delay_panic();
69-
}
70-
71-
#[inline]
72-
async fn delay_ms(&mut self, _ms: u32) {
67+
async fn delay_ns(&mut self, _ns: u32) {
7368
no_delay_panic();
7469
}
7570
}

embedded-hal-bus/src/spi/mutex.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use embedded_hal::delay::DelayUs;
1+
use embedded_hal::delay::DelayNs;
22
use embedded_hal::digital::OutputPin;
33
use embedded_hal::spi::{ErrorType, Operation, SpiBus, SpiDevice};
44
use std::sync::Mutex;
@@ -58,7 +58,7 @@ impl<'a, Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for MutexDevice<'a, B
5858
where
5959
BUS: SpiBus<Word>,
6060
CS: OutputPin,
61-
D: DelayUs,
61+
D: DelayNs,
6262
{
6363
#[inline]
6464
fn transaction(&mut self, operations: &mut [Operation<'_, Word>]) -> Result<(), Self::Error> {

embedded-hal-bus/src/spi/refcell.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use core::cell::RefCell;
2-
use embedded_hal::delay::DelayUs;
2+
use embedded_hal::delay::DelayNs;
33
use embedded_hal::digital::OutputPin;
44
use embedded_hal::spi::{ErrorType, Operation, SpiBus, SpiDevice};
55

@@ -57,7 +57,7 @@ impl<'a, Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for RefCellDevice<'a,
5757
where
5858
BUS: SpiBus<Word>,
5959
CS: OutputPin,
60-
D: DelayUs,
60+
D: DelayNs,
6161
{
6262
#[inline]
6363
fn transaction(&mut self, operations: &mut [Operation<'_, Word>]) -> Result<(), Self::Error> {

embedded-hal-bus/src/spi/shared.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use embedded_hal::delay::DelayUs;
1+
use embedded_hal::delay::DelayNs;
22
use embedded_hal::digital::OutputPin;
33
use embedded_hal::spi::{ErrorType, Operation, SpiBus};
44

@@ -15,7 +15,7 @@ pub fn transaction<Word, BUS, CS, D>(
1515
where
1616
BUS: SpiBus<Word> + ErrorType,
1717
CS: OutputPin,
18-
D: DelayUs,
18+
D: DelayNs,
1919
Word: Copy,
2020
{
2121
cs.set_low().map_err(DeviceError::Cs)?;

embedded-hal/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1010
- Minor document fixes.
1111
- Add #[inline] hints to most of `embedded-hal` functions.
1212
- pwm: rename `get_max_duty_cycle` to `max_duty_cycle`.
13+
- delay: Rename `DelayUs` to `DelayNs`
14+
- delay: Add `DelayNs::delay_ns()`
15+
- delay: Add default impls of `delay_ms` and `delay_us` based on `delay_ns`.
16+
- delay: Make the default impl of `delay_ms` more efficient, it now does less calls to the underlying `delay_ns` (previously `delay_us`).
1317

1418
## [v1.0.0-rc.1] - 2023-08-15
1519

embedded-hal/src/delay.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,42 @@
11
//! Delays.
22
3-
/// Microsecond delay.
4-
pub trait DelayUs {
3+
/// Delay with up to nanosecond precision.
4+
pub trait DelayNs {
5+
/// Pauses execution for at minimum `ns` nanoseconds. Pause can be longer
6+
/// if the implementation requires it due to precision/timing issues.
7+
fn delay_ns(&mut self, ns: u32);
8+
59
/// Pauses execution for at minimum `us` microseconds. Pause can be longer
610
/// if the implementation requires it due to precision/timing issues.
7-
fn delay_us(&mut self, us: u32);
11+
fn delay_us(&mut self, mut us: u32) {
12+
while us > 4_294_967 {
13+
us -= 4_294_967;
14+
self.delay_ns(4_294_967_000);
15+
}
16+
self.delay_ns(us * 1_000);
17+
}
818

919
/// Pauses execution for at minimum `ms` milliseconds. Pause can be longer
1020
/// if the implementation requires it due to precision/timing issues.
1121
#[inline]
12-
fn delay_ms(&mut self, ms: u32) {
13-
for _ in 0..ms {
14-
self.delay_us(1000);
22+
fn delay_ms(&mut self, mut ms: u32) {
23+
while ms > 4294 {
24+
ms -= 4294;
25+
self.delay_ns(4_294_000_000);
1526
}
27+
self.delay_ns(ms * 1_000_000);
1628
}
1729
}
1830

19-
impl<T> DelayUs for &mut T
31+
impl<T> DelayNs for &mut T
2032
where
21-
T: DelayUs + ?Sized,
33+
T: DelayNs + ?Sized,
2234
{
35+
#[inline]
36+
fn delay_ns(&mut self, ns: u32) {
37+
T::delay_ns(self, ns);
38+
}
39+
2340
#[inline]
2441
fn delay_us(&mut self, us: u32) {
2542
T::delay_us(self, us);

0 commit comments

Comments
 (0)