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}