#![allow(unused)]
use crate::{
barometer_sensors::{BarometerI2cError, BarometerMessage, barometer::BarometerError},
i2c_bus::{SharedI2cBus, SharedI2cExt},
};
struct Reg;
impl Reg {
const PRS_B2: u8 = 0x00;
const _PSR_B1: u8 = 0x01;
const _PSR_B0: u8 = 0x02;
const TMP_B2: u8 = 0x03;
const _TMP_B1: u8 = 0x04;
const _TMP_B0: u8 = 0x05;
const _PRS_CFG: u8 = 0x06;
const _TMP_CFG: u8 = 0x07;
const _MEAS_CFG: u8 = 0x08;
const _CFG_REG: u8 = 0x09;
const RESET: u8 = 0x0C;
const ID: u8 = 0x0D;
const _COEF: u8 = 0x10;
const _COEF_SRCE: u8 = 0x28;
}
pub struct BarometerDps310 {
pub i2c_bus: &'static SharedI2cBus,
}
impl BarometerDps310 {
const I2C_ADDRESS: u8 = 0x76;
const CHIP_ID: u8 = 0x11;
const MAX_SPI_FREQUENCY_HZ: u32 = 10_000_000;
pub const fn new(i2c_bus: &'static SharedI2cBus) -> Self {
Self { i2c_bus }
}
}
impl BarometerDps310 {
async fn read_register(&self, register: u8) -> Result<u8, BarometerI2cError> {
self.i2c_bus.read_reg(Self::I2C_ADDRESS, register).await.map_err(BarometerError::I2c)
}
async fn write_register(&self, register: u8, value: u8) -> Result<(), BarometerI2cError> {
self.i2c_bus.write_reg(Self::I2C_ADDRESS, register, value).await.map_err(BarometerError::I2c)
}
async fn read_registers<const N: usize>(&self, register: u8) -> Result<[u8; N], BarometerI2cError> {
self.i2c_bus.read_regs::<N>(Self::I2C_ADDRESS, register).await.map_err(BarometerError::I2c)
}
pub async fn init(&self) -> Result<u32, BarometerI2cError> {
let chip_id = self.read_register(Reg::ID).await?;
if chip_id != Self::CHIP_ID {
return Err(BarometerError::InvalidChipId { expected: Self::CHIP_ID, actual: chip_id });
}
self.write_register(Reg::RESET, 0x89).await?;
Ok(40)
}
pub async fn read_raw_pressure(&self) -> Result<i32, BarometerI2cError> {
let data = self.read_registers::<3>(Reg::PRS_B2).await?;
let raw = (i32::from(data[0]) << 16) | (i32::from(data[1]) << 8) | i32::from(data[2]);
Ok(if raw & 0x80_0000 != 0 { raw | !0xFF_FFFF } else { raw })
}
pub async fn read_raw_temperature(&self) -> Result<i32, BarometerI2cError> {
let data = self.read_registers::<3>(Reg::TMP_B2).await?;
let raw = (i32::from(data[0]) << 16) | (i32::from(data[1]) << 8) | i32::from(data[2]);
Ok(if raw & 0x80_0000 != 0 { raw | !0xFF_FFFF } else { raw })
}
pub async fn make_reading(&mut self) {
core::future::poll_fn(|_| core::task::Poll::Ready(())).await;
}
pub fn message(&self) -> BarometerMessage {
_ = self;
BarometerMessage::default()
}
}