nrf52_hal_common/temp.rs
1//! Temperature sensor interface.
2
3use fpa::I30F2;
4use nb;
5use void::Void;
6use crate::target::TEMP;
7
8/// Integrated temperature sensor.
9pub struct Temp(TEMP);
10
11impl Temp {
12 /// Creates a new `Temp`, taking ownership of the temperature sensor's register block.
13 pub fn new(raw: TEMP) -> Self {
14 Temp(raw)
15 }
16
17 /// Starts a new measurement and blocks until completion.
18 ///
19 /// If a measurement was already started, it will be canceled.
20 pub fn measure(&mut self) -> I30F2 {
21 self.stop_measurement();
22 self.start_measurement();
23
24 nb::block!(self.read()).unwrap()
25 }
26
27 /// Kicks off a temperature measurement.
28 ///
29 /// The measurement can be retrieved by calling `read`.
30 pub fn start_measurement(&mut self) {
31 unsafe {
32 self.0.tasks_start.write(|w| w.bits(1));
33 }
34 }
35
36 /// Cancels an in-progress temperature measurement.
37 pub fn stop_measurement(&mut self) {
38 unsafe {
39 self.0.tasks_stop.write(|w| w.bits(1));
40 self.0.events_datardy.reset();
41 }
42 }
43
44 /// Tries to read a started measurement (non-blocking).
45 ///
46 /// Before calling this, `start_measurement` must be called.
47 ///
48 /// Returns the measured temperature in °C.
49 pub fn read(&mut self) -> nb::Result<I30F2, Void> {
50 if self.0.events_datardy.read().bits() == 0 {
51 return Err(nb::Error::WouldBlock);
52 } else {
53 self.0.events_datardy.reset(); // clear event
54 let raw = self.0.temp.read().bits();
55 Ok(I30F2::from_bits(raw as i32))
56 }
57 }
58}