use embedded_hal_async::{delay::DelayNs, i2c::I2c};
use crate::{
Bmp5xx,
error::{Error::WriteError, Result},
register::{DSP_CONFIG, DSP_IIR},
};
pub struct Iir {
enabled: bool,
iir_t: Filter,
iir_p: Filter,
}
impl Default for Iir {
fn default() -> Self {
Self {
enabled: false,
iir_t: Filter::Bypass,
iir_p: Filter::Bypass,
}
}
}
impl Iir {
pub fn enable(mut self, enable: bool) -> Self {
self.enabled = enable;
self
}
pub fn temp(mut self, filter: Filter) -> Self {
self.iir_t = filter;
self
}
pub fn pres(mut self, filter: Filter) -> Self {
self.iir_p = filter;
self
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[repr(u8)]
pub enum Filter {
Bypass = 0x00,
Coeff1 = 0x01,
Coeff3 = 0x02,
Coeff7 = 0x03,
Coeff15 = 0x04,
Coeff31 = 0x05,
Coeff63 = 0x06,
Coeff127 = 0x07,
}
impl<I2C, D> Bmp5xx<I2C, D>
where
I2C: I2c,
D: DelayNs,
{
pub async fn iir(&mut self, iir: Iir) -> Result<()> {
self.i2c
.write(
self.addr,
&[DSP_IIR, (iir.iir_p as u8) << 3 | iir.iir_t as u8],
)
.await
.map_err(|_| WriteError)?;
self.i2c
.write(
self.addr,
&[DSP_CONFIG, if iir.enabled { 0xFF } else { 0x03 }],
)
.await
.map_err(|_| WriteError)
}
}