bmp280_core/
lib.rs

1#![no_std]
2
3#[cfg(test)]
4#[macro_use]
5extern crate hex_literal;
6
7#[macro_use]
8pub mod registers;
9pub mod bus;
10pub mod measurement;
11
12use embedded_hal::blocking::delay::DelayMs;
13use embedded_hal::spi::{Mode as SpiMode, MODE_0, MODE_3};
14
15use bus::Bus;
16use measurement::{Calibration, RawPressure, RawTemperature};
17use registers::{PressureOversampling, Register, StandbyTime, TemperatureOversampling, ID, RESET};
18
19pub const DEFAULT_SPI_MODE: SpiMode = MODE_3;
20pub const ALTERNATE_SPI_MODE: SpiMode = MODE_0;
21
22pub enum Mode {
23    Sleep = 0b00,
24    Forced = 0b01,
25    Normal = 0b11,
26}
27
28pub struct BMP280<BUS> {
29    bus: BUS,
30}
31
32impl<E, BUS: Bus<Error = E>> BMP280<BUS> {
33    pub fn new(bus: BUS) -> Self {
34        BMP280 { bus }
35    }
36
37    pub fn free(self) -> BUS {
38        self.bus
39    }
40
41    pub fn verify(&mut self) -> Result<bool, E> {
42        let id = self.bus.read(Register::Id)?;
43        Ok(id == ID)
44    }
45
46    pub fn set_register(&mut self, reg: Register, offset: u8, len: u8, bits: u8) -> Result<(), E> {
47        let mut value = self.bus.read(reg)?;
48        let mask = (1u8 << len) - 1;
49        value &= !(mask << offset);
50        value |= (bits & mask) << offset;
51        self.bus.write(reg, value)
52    }
53
54    pub fn reset<D: DelayMs<u8>>(&mut self, delay: &mut D) -> Result<(), E> {
55        self.bus.write(Register::Reset, RESET)?;
56        delay.delay_ms(2u8.into());
57        Ok(())
58    }
59
60    pub fn set_mode(&mut self, mode: Mode) -> Result<(), E> {
61        self.set_register(Register::ControlMeasurement, 0, 2, mode as u8)
62    }
63
64    pub fn set_pressure_oversampling(&mut self, value: PressureOversampling) -> Result<(), E> {
65        self.set_register(Register::ControlMeasurement, 2, 3, value as u8)
66    }
67
68    pub fn set_temperature_oversampling(&mut self, v: TemperatureOversampling) -> Result<(), E> {
69        self.set_register(Register::ControlMeasurement, 5, 3, v as u8)
70    }
71
72    pub fn set_standby_time(&mut self, standby_time: StandbyTime) -> Result<(), E> {
73        self.set_register(Register::Config, 5, 2, standby_time as u8)
74    }
75
76    pub fn set_iir_filter(&mut self, filter_coefficient: u8) -> Result<(), E> {
77        let value = match filter_coefficient {
78            0..=1 => 0,
79            2..=3 => 1,
80            4..=7 => 2,
81            8..=15 => 3,
82            16..=255 => 4,
83        };
84        self.set_register(Register::Config, 2, 3, value)
85    }
86
87    pub fn read_calibration(&mut self) -> Result<Calibration, E> {
88        let mut bytes = [0u8; 24];
89        self.bus.reads(Register::Calib0, &mut bytes)?;
90        Ok(Calibration::from_bytes(&bytes))
91    }
92
93    pub fn read_measurements(&mut self) -> Result<(RawPressure, RawTemperature), E> {
94        let mut bytes = [0u8; 6];
95        self.bus.reads(Register::PressureMsb, &mut bytes)?;
96        Ok((RawPressure::from_bytes(&bytes), RawTemperature::from_bytes(&bytes[3..])))
97    }
98}