22
33pub 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
105119where
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+ }
0 commit comments