bmp585/
lib.rs

1use embedded_hal::i2c::I2c;
2
3// const ADDR: u8 = 0x46; // alt of 0x47
4const ADDR: u8 = 0x47;
5
6// set ODR to 100 Hz; pg 18
7// math calc pressure to altitude, some challenges for supersonic
8// decide if want to add Low Power Normal mode - apply
9// determine OSR rate higher means less error but more power consumed
10
11#[derive(Debug)]
12pub enum PowerMode {
13	Standby = 0b00,
14	Normal = 0b01,
15	Forced = 0b10,
16	NonStop = 0b11
17}
18
19pub enum OsrT { //note not all OSR rates are valid; refer to datasheet for appropriate combinations
20	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 { //note not all OSR rates are valid; refer to datasheet for appropriate combinations
31	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]; // Buffer to store read data
47  // Attempt to write and read using the I2C bus, propagating errors with `?`
48  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(); // check if issues
58
59	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)} // return 0 if no issues, 1 if issues
66}
67
68pub fn get_pressure(bus: &mut impl I2c) -> f32 { //issue getting pressure here, refer to 4.4.1 config (pg20) write 1 to 0x36
69	let mut buf = [0_u8; 3];
70
71	let _res = bus.write_read(ADDR, &[0x20], &mut buf).unwrap(); // get pressure
72
73	let output = u32::from_le_bytes([buf[0], buf[1], buf[2], 0]);
74	// let div_thingy: f32 = (1_u32 << 6).into();
75	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(); // get temperature
83
84	let output = u32::from_le_bytes([buf[0], buf[1], buf[2], 0]);
85
86	//let div_thingy: f32 = (1_u32 << 16).into();
87	let div_thingy: f32 = (1_u32 << 16) as f32;
88	output as f32 / div_thingy
89}
90
91// TODO later check status or something
92pub 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; // set to 0
98	buf[0] |= power_mode as u8; // Add powerMode setting to buffer
99
100	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; // set target bits to 0
109	buf[0] |= osr_p as u8; // Add OSR pressure rate setting to buffer
110	buf[0] |= osr_t as u8; //Add OSR temperature rate setting to buffer
111
112	bus.write(ADDR, &[0x36, buf[0]]).unwrap();
113}
114
115pub fn set_osr_press(bus: &mut impl I2c) { // Enable pressure reading from OSR
116	let mut buf = [0b01111011];
117
118	bus.write_read(ADDR, &[0x36], &mut buf).unwrap();
119
120	buf[0] &= !0b0100_0000; // set target to 0
121	buf[0] |= 0b10 << 5 as u8; // Add setting to buffer
122
123	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(); // check if issues
130
131	buf[0]
132}