Skip to content

Commit ffbbc6a

Browse files
committed
Rename AdcChannel to Voltmeter and add Ammeter.
1 parent 9ed5035 commit ffbbc6a

File tree

2 files changed

+182
-55
lines changed

2 files changed

+182
-55
lines changed

embedded-hal-async/src/adc.rs

Lines changed: 97 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,19 @@
22
33
pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
44

5-
/// Read data from an ADC.
6-
///
7-
/// # Note for Implementers
8-
///
9-
/// This should wait until data is ready and then read it.
5+
/// Asynchronous voltmeter for measuring voltage.
106
///
117
/// # Examples
128
///
13-
/// In the first naive example, [`AdcChannel`] is implemented
9+
/// In the first naive example, [`Voltmeter`] is implemented
1410
/// using a spin loop and only returns once data is ready.
1511
///
1612
/// ```
17-
/// # use embedded_hal_async::adc::{AdcChannel, ErrorKind, ErrorType, Error};
18-
/// #
19-
/// struct MySpinningAdc;
13+
/// use embedded_hal_async::adc::{ErrorKind, ErrorType, Error, Voltmeter};
14+
///
15+
/// struct MySpinningVoltmeter;
2016
///
21-
/// impl MySpinningAdc {
17+
/// impl MySpinningVoltmeter {
2218
/// pub fn is_ready(&mut self) -> bool {
2319
/// // Just pretend this returns `false` the first few times.
2420
/// true
@@ -29,21 +25,21 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
2925
/// }
3026
/// }
3127
///
32-
/// impl ErrorType for MySpinningAdc {
28+
/// impl ErrorType for MySpinningVoltmeter {
3329
/// type Error = ErrorKind;
3430
/// }
3531
///
36-
/// impl AdcChannel for MySpinningAdc {
32+
/// impl Voltmeter for MySpinningVoltmeter {
3733
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
3834
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
3935
/// }
4036
///
41-
/// async fn measure_mv(&mut self) -> Result<i32, Self::Error> {
37+
/// async fn measure_mv(&mut self) -> Result<i16, Self::Error> {
4238
/// while !self.is_ready() {
4339
/// core::hint::spin_loop();
4440
/// }
4541
///
46-
/// Ok(self.data() as i32)
42+
/// Ok(self.data() as i16)
4743
/// }
4844
/// }
4945
/// ```
@@ -52,28 +48,31 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
5248
/// When the “ready pin” goes high, data is ready.
5349
///
5450
/// ```
55-
/// # use embedded_hal_async::{adc::{self, ErrorKind, ErrorType, Error, AdcChannel}, digital::{self, Wait, Error as _, ErrorType as _}};
56-
/// #
57-
/// struct MyWaitingAdc<T> {
51+
/// use embedded_hal_async::{
52+
/// adc::{self, ErrorKind, ErrorType, Error, Voltmeter},
53+
/// digital::{self, Wait, Error as _, ErrorType as _},
54+
/// };
55+
///
56+
/// struct MyWaitingVoltmeter<T> {
5857
/// ready_pin: T,
5958
/// };
6059
///
61-
/// impl<T> MyWaitingAdc<T> {
60+
/// impl<T> MyWaitingVoltmeter<T> {
6261
/// pub fn data(&mut self) -> u16 {
6362
/// 3300
6463
/// }
6564
/// }
6665
///
67-
/// impl<T> adc::ErrorType for MyWaitingAdc<T> {
66+
/// impl<T> adc::ErrorType for MyWaitingVoltmeter<T> {
6867
/// type Error = adc::ErrorKind;
6968
/// }
7069
///
71-
/// impl<T: Wait> AdcChannel for MyWaitingAdc<T> {
70+
/// impl<T: Wait> Voltmeter for MyWaitingVoltmeter<T> {
7271
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
7372
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
7473
/// }
7574
///
76-
/// async fn measure_mv(&mut self) -> Result<i32, Self::Error> {
75+
/// async fn measure_mv(&mut self) -> Result<i16, Self::Error> {
7776
/// match self.ready_pin.wait_for_high().await {
7877
/// Ok(()) => (),
7978
/// Err(err) => return Err(match err.kind() {
@@ -82,28 +81,43 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
8281
/// })
8382
/// }
8483
///
85-
/// Ok(self.data() as i32)
84+
/// Ok(self.data() as i16)
8685
/// }
8786
/// }
8887
/// ```
89-
pub trait AdcChannel: ErrorType {
90-
/// Take a measurement in nV (nanovolts).
88+
pub trait Voltmeter: ErrorType {
89+
/// Measures voltage in nV (nanovolts).
90+
///
91+
/// This can measure between -9223372036.854775808V and 9223372036.854775807V.
9192
async fn measure_nv(&mut self) -> Result<i64, Self::Error>;
9293

93-
/// Take a measurement in mV (microvolts).
94+
/// Measures voltage in mV (microvolts).
95+
///
96+
/// This can measure between -2147.483648V and 2147.483647V.
97+
/// If you need to measure a larger range, use [`measure_nv`](Voltmeter::measure_nv) instead.
98+
///
99+
/// When overriding the default implementation, ensure that the measured voltage is clamped
100+
/// between [`i32::MIN`] and [`i32::MAX`].
94101
async fn measure_uv(&mut self) -> Result<i32, Self::Error> {
95-
Ok((self.measure_nv().await? / 1_000) as i32)
102+
Ok((self.measure_nv().await? / 1_000).clamp(i32::MIN.into(), i32::MAX.into()) as i32)
96103
}
97104

98-
/// Take a measurement in mV (millivolts).
99-
async fn measure_mv(&mut self) -> Result<i32, Self::Error> {
100-
Ok(self.measure_uv().await? / 1_000)
105+
/// Measures voltage in mV (millivolts).
106+
///
107+
/// This can measure between between -32.768V and 32.767V.
108+
/// If you need to measure a larger range,
109+
/// use [`measure_uv`](Voltmeter::measure_uv) or [`measure_nv`](Voltmeter::measure_nv) instead.
110+
///
111+
/// When overriding the default implementation, ensure that the measured voltage is clamped
112+
/// between [`i16::MIN`] and [`i16::MAX`].
113+
async fn measure_mv(&mut self) -> Result<i16, Self::Error> {
114+
Ok((self.measure_uv().await? / 1_000).clamp(i16::MIN.into(), i16::MAX.into()) as i16)
101115
}
102116
}
103117

104-
impl<T> AdcChannel for &mut T
118+
impl<T> Voltmeter for &mut T
105119
where
106-
T: AdcChannel + ?Sized,
120+
T: Voltmeter + ?Sized,
107121
{
108122
#[inline]
109123
async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
@@ -116,7 +130,58 @@ where
116130
}
117131

118132
#[inline]
119-
async fn measure_mv(&mut self) -> Result<i32, Self::Error> {
133+
async fn measure_mv(&mut self) -> Result<i16, Self::Error> {
120134
(*self).measure_mv().await
121135
}
122136
}
137+
138+
/// Asynchronous ammeter (ampere meter) for measuring current.
139+
pub trait Ammeter: ErrorType {
140+
/// Measures current in nA (nanoampere).
141+
///
142+
/// This can measure between -9223372036.854775808A and 9223372036.854775807A.
143+
async fn measure_na(&mut self) -> Result<i64, Self::Error>;
144+
145+
/// Measures current in uA (microampere).
146+
///
147+
/// This can measure between -2147.483648A and 2147.483647A.
148+
/// If you need to measure a larger range, use [`measure_na`](Ammeter::measure_na) instead.
149+
///
150+
/// When overriding the default implementation, ensure that the measured current is clamped
151+
/// between [`i32::MIN`] and [`i32::MAX`].
152+
async fn measure_ua(&mut self) -> Result<i32, Self::Error> {
153+
Ok((self.measure_na().await? / 1_000).clamp(i32::MIN.into(), i32::MAX.into()) as i32)
154+
}
155+
156+
/// Measures current in mA (milliampere).
157+
///
158+
/// This can measure between between -32.768A and 32.767A.
159+
/// If you need to measure a larger range,
160+
/// use [`measure_ua`](Ammeter::measure_ua) or [`measure_na`](Ammeter::measure_na) instead.
161+
///
162+
/// When overriding the default implementation, ensure that the measured voltage is clamped
163+
/// between [`i16::MIN`] and [`i16::MAX`].
164+
async fn measure_ma(&mut self) -> Result<i16, Self::Error> {
165+
Ok((self.measure_ua().await? / 1_000).clamp(i16::MIN.into(), i16::MAX.into()) as i16)
166+
}
167+
}
168+
169+
impl<T> Ammeter for &mut T
170+
where
171+
T: Ammeter + ?Sized,
172+
{
173+
#[inline]
174+
async fn measure_na(&mut self) -> Result<i64, Self::Error> {
175+
(*self).measure_na().await
176+
}
177+
178+
#[inline]
179+
async fn measure_ua(&mut self) -> Result<i32, Self::Error> {
180+
(*self).measure_ua().await
181+
}
182+
183+
#[inline]
184+
async fn measure_ma(&mut self) -> Result<i16, Self::Error> {
185+
(*self).measure_ma().await
186+
}
187+
}

embedded-hal/src/adc.rs

Lines changed: 85 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,19 @@ use core::fmt::{Debug, Display};
55
#[cfg(feature = "defmt-03")]
66
use crate::defmt;
77

8-
/// Read data from an ADC.
9-
///
10-
/// # Note for Implementers
11-
///
12-
/// This should wait until data is ready and then read it.
8+
/// Blocking voltmeter for measuring voltage.
139
///
1410
/// # Examples
1511
///
16-
/// In the first naive example, [`AdcChannel`] is implemented
12+
/// In the first naive example, [`Voltmeter`] is implemented
1713
/// using a spin loop and only returns once data is ready.
1814
///
1915
/// ```
20-
/// use embedded_hal::adc::{AdcChannel, ErrorKind, ErrorType, Error};
16+
/// use embedded_hal::adc::{ErrorKind, ErrorType, Error, Voltmeter};
2117
///
22-
/// struct MySpinningAdc;
18+
/// struct MySpinningVoltmeter;
2319
///
24-
/// impl MySpinningAdc {
20+
/// impl MySpinningVoltmeter {
2521
/// pub fn is_ready(&mut self) -> bool {
2622
/// // Just pretend this returns `false` the first few times.
2723
/// true
@@ -32,42 +28,57 @@ use crate::defmt;
3228
/// }
3329
/// }
3430
///
35-
/// impl ErrorType for MySpinningAdc {
31+
/// impl ErrorType for MySpinningVoltmeter {
3632
/// type Error = ErrorKind;
3733
/// }
3834
///
39-
/// impl AdcChannel for MySpinningAdc {
35+
/// impl Voltmeter for MySpinningVoltmeter {
4036
/// fn measure_nv(&mut self) -> Result<i64, Self::Error> {
4137
/// Ok(self.measure_mv()? as i64 * 1_000_000)
4238
/// }
4339
///
44-
/// fn measure_mv(&mut self) -> Result<i32, Self::Error> {
40+
/// fn measure_mv(&mut self) -> Result<i16, Self::Error> {
4541
/// while !self.is_ready() {
4642
/// core::hint::spin_loop();
4743
/// }
4844
///
49-
/// Ok(self.data() as i32)
45+
/// Ok(self.data() as i16)
5046
/// }
5147
/// }
5248
/// ```
53-
pub trait AdcChannel: ErrorType {
54-
/// Take a measurement in nV (nanovolts).
49+
pub trait Voltmeter: ErrorType {
50+
/// Measures voltage in nV (nanovolts).
51+
///
52+
/// This can measure between -9223372036.854775808V and 9223372036.854775807V.
5553
fn measure_nv(&mut self) -> Result<i64, Self::Error>;
5654

57-
/// Take a measurement in mV (microvolts).
55+
/// Measures voltage in mV (microvolts).
56+
///
57+
/// This can measure between -2147.483648V and 2147.483647V.
58+
/// If you need to measure a larger range, use [`measure_nv`](Voltmeter::measure_nv) instead.
59+
///
60+
/// When overriding the default implementation, ensure that the measured voltage is clamped
61+
/// between [`i32::MIN`] and [`i32::MAX`].
5862
fn measure_uv(&mut self) -> Result<i32, Self::Error> {
59-
Ok((self.measure_nv()? / 1_000) as i32)
63+
Ok((self.measure_nv()? / 1_000).clamp(i32::MIN.into(), i32::MAX.into()) as i32)
6064
}
6165

62-
/// Take a measurement in mV (millivolts).
63-
fn measure_mv(&mut self) -> Result<i32, Self::Error> {
64-
Ok(self.measure_uv()? / 1_000)
66+
/// Measures voltage in mV (millivolts).
67+
///
68+
/// This can measure between between -32.768V and 32.767V.
69+
/// If you need to measure a larger range,
70+
/// use [`measure_uv`](Voltmeter::measure_uv) or [`measure_mv`](Voltmeter::measure_mv) instead.
71+
///
72+
/// When overriding the default implementation, ensure that the measured voltage is clamped
73+
/// between [`i16::MIN`] and [`i16::MAX`].
74+
fn measure_mv(&mut self) -> Result<i16, Self::Error> {
75+
Ok((self.measure_uv()? / 1_000).clamp(i16::MIN.into(), i16::MAX.into()) as i16)
6576
}
6677
}
6778

68-
impl<T> AdcChannel for &mut T
79+
impl<T> Voltmeter for &mut T
6980
where
70-
T: AdcChannel + ?Sized,
81+
T: Voltmeter + ?Sized,
7182
{
7283
#[inline]
7384
fn measure_nv(&mut self) -> Result<i64, Self::Error> {
@@ -80,11 +91,62 @@ where
8091
}
8192

8293
#[inline]
83-
fn measure_mv(&mut self) -> Result<i32, Self::Error> {
94+
fn measure_mv(&mut self) -> Result<i16, Self::Error> {
8495
(*self).measure_mv()
8596
}
8697
}
8798

99+
/// Blocking ammeter (ampere meter) for measuring current.
100+
pub trait Ammeter: ErrorType {
101+
/// Measures current in nA (nanoampere).
102+
///
103+
/// This can measure between -9223372036.854775808A and 9223372036.854775807A.
104+
fn measure_na(&mut self) -> Result<i64, Self::Error>;
105+
106+
/// Measures current in uA (microampere).
107+
///
108+
/// This can measure between -2147.483648A and 2147.483647A.
109+
/// If you need to measure a larger range, use [`measure_na`](Ammeter::measure_na) instead.
110+
///
111+
/// When overriding the default implementation, ensure that the measured current is clamped
112+
/// between [`i32::MIN`] and [`i32::MAX`].
113+
fn measure_ua(&mut self) -> Result<i32, Self::Error> {
114+
Ok((self.measure_na()? / 1_000).clamp(i32::MIN.into(), i32::MAX.into()) as i32)
115+
}
116+
117+
/// Measures current in mA (milliampere).
118+
///
119+
/// This can measure between between -32.768A and 32.767A.
120+
/// If you need to measure a larger range,
121+
/// use [`measure_ua`](Ammeter::measure_ua) or [`measure_na`](Ammeter::measure_na) instead.
122+
///
123+
/// When overriding the default implementation, ensure that the measured voltage is clamped
124+
/// between [`i16::MIN`] and [`i16::MAX`].
125+
fn measure_ma(&mut self) -> Result<i16, Self::Error> {
126+
Ok((self.measure_ua()? / 1_000).clamp(i16::MIN.into(), i16::MAX.into()) as i16)
127+
}
128+
}
129+
130+
impl<T> Ammeter for &mut T
131+
where
132+
T: Ammeter + ?Sized,
133+
{
134+
#[inline]
135+
fn measure_na(&mut self) -> Result<i64, Self::Error> {
136+
(*self).measure_na()
137+
}
138+
139+
#[inline]
140+
fn measure_ua(&mut self) -> Result<i32, Self::Error> {
141+
(*self).measure_ua()
142+
}
143+
144+
#[inline]
145+
fn measure_ma(&mut self) -> Result<i16, Self::Error> {
146+
(*self).measure_ma()
147+
}
148+
}
149+
88150
/// ADC error.
89151
pub trait Error: Debug {
90152
/// Convert error to a generic ADC error kind.

0 commit comments

Comments
 (0)