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}