1use embedded_hal::i2c::I2c;
2
3const ADDR: u8 = 0x47;
5
6#[derive(Debug)]
12pub enum PowerMode {
13 Standby = 0b00,
14 Normal = 0b01,
15 Forced = 0b10,
16 NonStop = 0b11
17}
18
19pub enum OsrT { X1 = 0x0,
21 X2 = 0x1,
22 X4 = 0x2,
23 X8 = 0x3,
24 X16 = 0x4,
25 X32 = 0x5,
26 X64 = 0x6,
27 X128 = 0x7
28}
29
30pub enum OsrP { X1 = 0x0 << 3,
32 X2 = 0x1 << 3,
33 X4 = 0x2 << 3,
34 X8 = 0x3 << 3,
35 X16 = 0x4 << 3,
36 X32 = 0x5 << 3,
37 X64 = 0x6 << 3,
38 X128 = 0x7 << 3
39}
40
41impl PowerMode {
42 pub const MASK: u8 = 0b0000_0011;
43}
44
45pub fn get_ids(bus: &mut impl I2c) -> Result<u8, u8> {
46 let mut buf = [0_u8; 1]; match bus.write_read(ADDR, &[0x01], &mut buf) {
49 Ok(_) => Ok(buf[0]),
50 Err(_err) => Err(0),
51 }
52}
53
54
55pub fn get_status(bus: &mut impl I2c) -> Result<u8, u8> {
56 let mut buf = [0_u8; 1];
57 bus.write_read(ADDR, &[0x28], &mut buf).unwrap(); let mut nvm_error = buf[0];
60 nvm_error &= 0000_0100;
61 nvm_error = nvm_error >> 1;
62 let mut nvm_rdy = buf[0];
63 nvm_rdy &= 0000_0010;
64
65 if !nvm_error == nvm_rdy {Ok(0)} else {Err(1)} }
67
68pub fn get_pressure(bus: &mut impl I2c) -> f32 { let mut buf = [0_u8; 3];
70
71 let _res = bus.write_read(ADDR, &[0x20], &mut buf).unwrap(); let output = u32::from_le_bytes([buf[0], buf[1], buf[2], 0]);
74 let div_thingy: f32 = (1_u32 << 16) as f32;
76 output as f32 / div_thingy
77}
78
79pub fn get_temperature(bus: &mut impl I2c) -> f32 {
80 let mut buf = [0_u8; 3];
81
82 let _res = bus.write_read(ADDR, &[0x1D], &mut buf).unwrap(); let output = u32::from_le_bytes([buf[0], buf[1], buf[2], 0]);
85
86 let div_thingy: f32 = (1_u32 << 16) as f32;
88 output as f32 / div_thingy
89}
90
91pub fn set_power_mode(bus: &mut impl I2c, power_mode: PowerMode) {
93 let mut buf = [0];
94
95 bus.write_read(ADDR, &[0x37], &mut buf).unwrap();
96
97 buf[0] &= !PowerMode::MASK; buf[0] |= power_mode as u8; bus.write(ADDR, &[0x37, buf[0]]).unwrap();
101}
102
103pub fn set_odr(bus: &mut impl I2c, osr_p: OsrP, osr_t: OsrT) {
104 let mut buf = [0];
105
106 bus.write_read(ADDR, &[0x36], &mut buf).unwrap();
107
108 buf[0] &= !0b0011_1111; buf[0] |= osr_p as u8; buf[0] |= osr_t as u8; bus.write(ADDR, &[0x36, buf[0]]).unwrap();
113}
114
115pub fn set_osr_press(bus: &mut impl I2c) { let mut buf = [0b01111011];
117
118 bus.write_read(ADDR, &[0x36], &mut buf).unwrap();
119
120 buf[0] &= !0b0100_0000; buf[0] |= 0b10 << 5 as u8; bus.write(ADDR, &[0x36, buf[0]]).unwrap();
124}
125
126pub fn get_osr_press(bus: &mut impl I2c) -> u8 {
127 let mut buf = [0_u8; 1];
128
129 let _res = bus.write_read(ADDR, &[0x36], &mut buf).unwrap(); buf[0]
132}