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
9
+ /// In the first naive example, [`Voltmeter `] is implemented
14
10
/// using a spin loop and only returns once data is ready.
15
11
///
16
12
/// ```
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 ;
20
16
///
21
- /// impl MySpinningAdc {
17
+ /// impl MySpinningVoltmeter {
22
18
/// pub fn is_ready(&mut self) -> bool {
23
19
/// // Just pretend this returns `false` the first few times.
24
20
/// true
@@ -29,21 +25,21 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
29
25
/// }
30
26
/// }
31
27
///
32
- /// impl ErrorType for MySpinningAdc {
28
+ /// impl ErrorType for MySpinningVoltmeter {
33
29
/// type Error = ErrorKind;
34
30
/// }
35
31
///
36
- /// impl AdcChannel for MySpinningAdc {
32
+ /// impl Voltmeter for MySpinningVoltmeter {
37
33
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
38
34
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
39
35
/// }
40
36
///
41
- /// async fn measure_mv(&mut self) -> Result<i32 , Self::Error> {
37
+ /// async fn measure_mv(&mut self) -> Result<i16 , Self::Error> {
42
38
/// while !self.is_ready() {
43
39
/// core::hint::spin_loop();
44
40
/// }
45
41
///
46
- /// Ok(self.data() as i32 )
42
+ /// Ok(self.data() as i16 )
47
43
/// }
48
44
/// }
49
45
/// ```
@@ -52,28 +48,31 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
52
48
/// When the “ready pin” goes high, data is ready.
53
49
///
54
50
/// ```
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> {
58
57
/// ready_pin: T,
59
58
/// };
60
59
///
61
- /// impl<T> MyWaitingAdc <T> {
60
+ /// impl<T> MyWaitingVoltmeter <T> {
62
61
/// pub fn data(&mut self) -> u16 {
63
62
/// 3300
64
63
/// }
65
64
/// }
66
65
///
67
- /// impl<T> adc::ErrorType for MyWaitingAdc <T> {
66
+ /// impl<T> adc::ErrorType for MyWaitingVoltmeter <T> {
68
67
/// type Error = adc::ErrorKind;
69
68
/// }
70
69
///
71
- /// impl<T: Wait> AdcChannel for MyWaitingAdc <T> {
70
+ /// impl<T: Wait> Voltmeter for MyWaitingVoltmeter <T> {
72
71
/// async fn measure_nv(&mut self) -> Result<i64, Self::Error> {
73
72
/// Ok(self.measure_mv().await? as i64 * 1_000_000)
74
73
/// }
75
74
///
76
- /// async fn measure_mv(&mut self) -> Result<i32 , Self::Error> {
75
+ /// async fn measure_mv(&mut self) -> Result<i16 , Self::Error> {
77
76
/// match self.ready_pin.wait_for_high().await {
78
77
/// Ok(()) => (),
79
78
/// Err(err) => return Err(match err.kind() {
@@ -82,28 +81,43 @@ pub use embedded_hal::adc::{Error, ErrorKind, ErrorType};
82
81
/// })
83
82
/// }
84
83
///
85
- /// Ok(self.data() as i32 )
84
+ /// Ok(self.data() as i16 )
86
85
/// }
87
86
/// }
88
87
/// ```
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.
91
92
async fn measure_nv ( & mut self ) -> Result < i64 , Self :: Error > ;
92
93
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`].
94
101
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 )
96
103
}
97
104
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 )
101
115
}
102
116
}
103
117
104
- impl < T > AdcChannel for & mut T
118
+ impl < T > Voltmeter for & mut T
105
119
where
106
- T : AdcChannel + ?Sized ,
120
+ T : Voltmeter + ?Sized ,
107
121
{
108
122
#[ inline]
109
123
async fn measure_nv ( & mut self ) -> Result < i64 , Self :: Error > {
@@ -116,7 +130,58 @@ where
116
130
}
117
131
118
132
#[ inline]
119
- async fn measure_mv ( & mut self ) -> Result < i32 , Self :: Error > {
133
+ async fn measure_mv ( & mut self ) -> Result < i16 , Self :: Error > {
120
134
( * self ) . measure_mv ( ) . await
121
135
}
122
136
}
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
+ }
0 commit comments