2
2
3
3
pub use embedded_hal:: adc:: { Error , ErrorKind , ErrorType } ;
4
4
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.
10
6
///
11
7
/// # Examples
12
8
///
13
- /// In the first naive example, [`AdcChannel`] is implemented
14
- /// using a spin loop and only returns once data is ready.
9
+ /// In the first naive example, [`Voltmeter`] is implemented using a spin loop.
15
10
///
16
11
/// ```
17
- /// # use embedded_hal_async::adc::{AdcChannel, ErrorKind, ErrorType, Error};
18
- /// #
19
- /// struct MySpinningAdc ;
12
+ /// use embedded_hal_async::adc::{ErrorKind, ErrorType, Error, Voltmeter };
13
+ ///
14
+ /// struct MySpinningVoltmeter ;
20
15
///
21
- /// impl MySpinningAdc {
16
+ /// impl MySpinningVoltmeter {
22
17
/// pub fn is_ready(&mut self) -> bool {
23
18
/// // Just pretend this returns `false` the first few times.
24
19
/// true
@@ -29,21 +24,21 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
29
24
/// }
30
25
/// }
31
26
///
32
- /// impl ErrorType for MySpinningAdc {
27
+ /// impl ErrorType for MySpinningVoltmeter {
33
28
/// type Error = ErrorKind;
34
29
/// }
35
30
///
36
- /// impl AdcChannel for MySpinningAdc {
31
+ /// impl Voltmeter for MySpinningVoltmeter {
37
32
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
38
33
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
39
34
/// }
40
35
///
41
- /// async fn measure_mv(&mut self) -> Result<i32 , Self::Error> {
36
+ /// async fn measure_mv(&mut self) -> Result<i16 , Self::Error> {
42
37
/// while !self.is_ready() {
43
38
/// core::hint::spin_loop();
44
39
/// }
45
40
///
46
- /// Ok(self.data() as i32 )
41
+ /// Ok(self.data() as i16 )
47
42
/// }
48
43
/// }
49
44
/// ```
@@ -52,28 +47,31 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
52
47
/// When the “ready pin” goes high, data is ready.
53
48
///
54
49
/// ```
55
- /// # use embedded_hal_async::{adc::{self, ErrorKind, ErrorType, Error, AdcChannel}, digital::{self, Wait, Error as _, ErrorType as _}};
56
- /// #
57
- /// struct MyWaitingAdc<T> {
50
+ /// use embedded_hal_async::{
51
+ /// adc::{self, ErrorKind, ErrorType, Error, Voltmeter},
52
+ /// digital::{self, Wait, Error as _, ErrorType as _},
53
+ /// };
54
+ ///
55
+ /// struct MyWaitingVoltmeter<T> {
58
56
/// ready_pin: T,
59
57
/// };
60
58
///
61
- /// impl<T> MyWaitingAdc <T> {
59
+ /// impl<T> MyWaitingVoltmeter <T> {
62
60
/// pub fn data(&mut self) -> u16 {
63
61
/// 3300
64
62
/// }
65
63
/// }
66
64
///
67
- /// impl<T> adc::ErrorType for MyWaitingAdc <T> {
65
+ /// impl<T> adc::ErrorType for MyWaitingVoltmeter <T> {
68
66
/// type Error = adc::ErrorKind;
69
67
/// }
70
68
///
71
- /// impl<T: Wait> AdcChannel for MyWaitingAdc <T> {
69
+ /// impl<T: Wait> Voltmeter for MyWaitingVoltmeter <T> {
72
70
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
73
71
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
74
72
/// }
75
73
///
76
- /// async fn measure_mv(&mut self) -> Result<i32 , Self::Error> {
74
+ /// async fn measure_mv(&mut self) -> Result<i16 , Self::Error> {
77
75
/// match self.ready_pin.wait_for_high().await {
78
76
/// Ok(()) => (),
79
77
/// Err(err) => return Err(match err.kind() {
@@ -82,28 +80,43 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
82
80
/// })
83
81
/// }
84
82
///
85
- /// Ok(self.data() as i32 )
83
+ /// Ok(self.data() as i16 )
86
84
/// }
87
85
/// }
88
86
/// ```
89
- pub trait AdcChannel : ErrorType {
90
- /// Take a measurement in nV (nanovolts).
87
+ pub trait Voltmeter : ErrorType {
88
+ /// Measures voltage in nV (nanovolts).
89
+ ///
90
+ /// This can measure between -9223372036.854775808V and 9223372036.854775807V.
91
91
async fn measure_nv ( & mut self ) -> Result < i64 , Self :: Error > ;
92
92
93
- /// Take a measurement in mV (microvolts).
93
+ /// Measures voltage in mV (microvolts).
94
+ ///
95
+ /// This can measure between -2147.483648V and 2147.483647V.
96
+ /// If you need to measure a larger range, use [`measure_nv`](Voltmeter::measure_nv) instead.
97
+ ///
98
+ /// When overriding the default implementation, ensure that the measured voltage is clamped
99
+ /// between [`i32::MIN`] and [`i32::MAX`].
94
100
async fn measure_uv ( & mut self ) -> Result < i32 , Self :: Error > {
95
- Ok ( ( self . measure_nv ( ) . await ? / 1_000 ) as i32 )
101
+ Ok ( ( self . measure_nv ( ) . await ? / 1_000 ) . clamp ( i32 :: MIN . into ( ) , i32 :: MAX . into ( ) ) as i32 )
96
102
}
97
103
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 )
104
+ /// Measures voltage in mV (millivolts).
105
+ ///
106
+ /// This can measure between between -32.768V and 32.767V.
107
+ /// If you need to measure a larger range,
108
+ /// use [`measure_uv`](Voltmeter::measure_uv) or [`measure_nv`](Voltmeter::measure_nv) instead.
109
+ ///
110
+ /// When overriding the default implementation, ensure that the measured voltage is clamped
111
+ /// between [`i16::MIN`] and [`i16::MAX`].
112
+ async fn measure_mv ( & mut self ) -> Result < i16 , Self :: Error > {
113
+ Ok ( ( self . measure_uv ( ) . await ? / 1_000 ) . clamp ( i16:: MIN . into ( ) , i16:: MAX . into ( ) ) as i16 )
101
114
}
102
115
}
103
116
104
- impl < T > AdcChannel for & mut T
117
+ impl < T > Voltmeter for & mut T
105
118
where
106
- T : AdcChannel + ?Sized ,
119
+ T : Voltmeter + ?Sized ,
107
120
{
108
121
#[ inline]
109
122
async fn measure_nv ( & mut self ) -> Result < i64 , Self :: Error > {
@@ -116,7 +129,58 @@ where
116
129
}
117
130
118
131
#[ inline]
119
- async fn measure_mv ( & mut self ) -> Result < i32 , Self :: Error > {
132
+ async fn measure_mv ( & mut self ) -> Result < i16 , Self :: Error > {
120
133
( * self ) . measure_mv ( ) . await
121
134
}
122
135
}
136
+
137
+ /// Asynchronous ammeter (ampere meter) for measuring current.
138
+ pub trait Ammeter : ErrorType {
139
+ /// Measures current in nA (nanoampere).
140
+ ///
141
+ /// This can measure between -9223372036.854775808A and 9223372036.854775807A.
142
+ async fn measure_na ( & mut self ) -> Result < i64 , Self :: Error > ;
143
+
144
+ /// Measures current in uA (microampere).
145
+ ///
146
+ /// This can measure between -2147.483648A and 2147.483647A.
147
+ /// If you need to measure a larger range, use [`measure_na`](Ammeter::measure_na) instead.
148
+ ///
149
+ /// When overriding the default implementation, ensure that the measured current is clamped
150
+ /// between [`i32::MIN`] and [`i32::MAX`].
151
+ async fn measure_ua ( & mut self ) -> Result < i32 , Self :: Error > {
152
+ Ok ( ( self . measure_na ( ) . await ? / 1_000 ) . clamp ( i32:: MIN . into ( ) , i32:: MAX . into ( ) ) as i32 )
153
+ }
154
+
155
+ /// Measures current in mA (milliampere).
156
+ ///
157
+ /// This can measure between between -32.768A and 32.767A.
158
+ /// If you need to measure a larger range,
159
+ /// use [`measure_ua`](Ammeter::measure_ua) or [`measure_na`](Ammeter::measure_na) instead.
160
+ ///
161
+ /// When overriding the default implementation, ensure that the measured voltage is clamped
162
+ /// between [`i16::MIN`] and [`i16::MAX`].
163
+ async fn measure_ma ( & mut self ) -> Result < i16 , Self :: Error > {
164
+ Ok ( ( self . measure_ua ( ) . await ? / 1_000 ) . clamp ( i16:: MIN . into ( ) , i16:: MAX . into ( ) ) as i16 )
165
+ }
166
+ }
167
+
168
+ impl < T > Ammeter for & mut T
169
+ where
170
+ T : Ammeter + ?Sized ,
171
+ {
172
+ #[ inline]
173
+ async fn measure_na ( & mut self ) -> Result < i64 , Self :: Error > {
174
+ ( * self ) . measure_na ( ) . await
175
+ }
176
+
177
+ #[ inline]
178
+ async fn measure_ua ( & mut self ) -> Result < i32 , Self :: Error > {
179
+ ( * self ) . measure_ua ( ) . await
180
+ }
181
+
182
+ #[ inline]
183
+ async fn measure_ma ( & mut self ) -> Result < i16 , Self :: Error > {
184
+ ( * self ) . measure_ma ( ) . await
185
+ }
186
+ }
0 commit comments