use super::accel::AccelRange;
use super::{BMX160, Error, defs};
use embedded_hal::i2c::{I2c, SevenBitAddress};
impl<I, E> BMX160<I>
where
I: I2c<SevenBitAddress, Error = E>,
{
pub fn set_tap_interrupt_conf(&mut self, conf: TapIntConf) -> Result<(), Error<E>> {
let mut data: [u8; 2] = [0; 2];
self.read_bytes(defs::BMI160_INT_TAP_ADDR, &mut data)
.map_err(Error::I2c)?;
data[0] = (data[0] & 0b0000_1111) | ((conf.quiet as u8) << 7) | ((conf.shock as u8) << 6) | ((conf.duration as u8) & 0b111);
data[1] = conf.threshold as u8 & 0x0F;
self.write_bytes(defs::BMI160_INT_TAP_ADDR, &data)?;
Ok(())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TapQuiet {
Ms30 = 0,
Ms20 = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TapShock {
Ms50 = 0,
Ms75 = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TapDuration {
Ms50 = 0b000,
Ms100 = 0b001,
Ms150 = 0b010,
Ms200 = 0b011,
Ms250 = 0b100,
Ms375 = 0b101,
Ms500 = 0b110,
Ms700 = 0b111,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TapThreshold {
Lvl0 = 0b0000,
Lvl1 = 0b0001,
Lvl2 = 0b0010,
Lvl3 = 0b0011,
Lvl4 = 0b0100,
Lvl5 = 0b0101,
Lvl6 = 0b0110,
Lvl7 = 0b0111,
Lvl8 = 0b1000,
Lvl9 = 0b1001,
Lvl10 = 0b1010,
Lvl11 = 0b1011,
Lvl12 = 0b1100,
Lvl13 = 0b1101,
Lvl14 = 0b1110,
Lvl15 = 0b1111,
}
impl TapThreshold {
pub fn to_mg(&self, range: AccelRange) -> f32 {
let scaling_factor = match range {
AccelRange::G2 => 62.5,
AccelRange::G4 => 125.0,
AccelRange::G8 => 250.0,
AccelRange::G16 => 500.0,
};
let multiplier = if *self == TapThreshold::Lvl0 {
0.5
} else {
*self as u8 as f32
};
multiplier * scaling_factor
}
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct TapIntConf {
pub quiet: TapQuiet,
pub shock: TapShock,
pub duration: TapDuration,
pub threshold: TapThreshold,
}