use crate::{
INT1_6D, INT1_DIFF5, INT1_DRDY, INT1_FF, INT1_FTH, INT1_SINGLE_TAP, INT1_TAP, INT1_WU,
INT2_BOOT, INT2_DIFF5, INT2_DRDY, INT2_DRDY_T, INT2_FTH, INT2_OVR, INT2_SLEEP_CHG,
INT2_SLEEP_STATE,
};
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Mode {
HighPerformance = 0b0100,
ContinuousLowPower4 = 0b0011,
ContinuousLowPower3 = 0b0010,
ContinuousLowPower2 = 0b0001,
#[default]
ContinuousLowPower1 = 0b0000,
SingleConversionLowPower4 = 0b1011,
SingleConversionLowPower3 = 0b1010,
SingleConversionLowPower2 = 0b1001,
SingleConversionLowPower1 = 0b1000,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum OutputDataRate {
PowerDown = 0b0000,
Hz1_6 = 0b0001,
#[default]
Hz12_5 = 0b0010,
Hz25 = 0b0011,
Hz50 = 0b0100,
Hz100 = 0b0101,
Hz200 = 0b0110,
Hz400 = 0b0111,
Hz800 = 0b1000,
Hz1600 = 0b1001,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum BandwidthSelection {
#[default]
OdrDiv2 = 0b00,
OdrDiv4 = 0b01,
OdrDiv10 = 0b10,
OdrDiv20 = 0b11,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FullScale {
#[default]
G2 = 0b00,
G4 = 0b01,
G8 = 0b10,
G16 = 0b11,
}
impl FullScale {
pub(crate) fn convert_raw_i16_to_mg(self, raw: i16, set_mode: Mode) -> f32 {
let factor = match set_mode {
Mode::ContinuousLowPower1 | Mode::SingleConversionLowPower1 => match self {
FullScale::G2 => 0.976,
FullScale::G4 => 1.952,
FullScale::G8 => 3.904,
FullScale::G16 => 7.808,
},
_ => match self {
FullScale::G2 => 0.244,
FullScale::G4 => 0.488,
FullScale::G8 => 0.976,
FullScale::G16 => 1.952,
},
};
raw as f32 * factor
}
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FifoMode {
#[default]
Bypass = 0b000,
StopOnFifoFull = 0b001,
ContinuousToFifo = 0b011,
BypassToContinuous = 0b100,
Continuous = 0b110,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Threshold6D {
#[default]
Deg80 = 0b00,
Deg70 = 0b01,
Deg60 = 0b10,
Deg50 = 0b11,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TapPriority {
#[default]
XYZ = 0b000,
YXZ = 0b001,
XZY = 0b010,
ZYX = 0b011,
XYZAlt = 0b100,
YZX = 0b101,
ZXY = 0b110,
ZYXAlt = 0b111,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FreeFallThreshold {
#[default]
Ths5 = 0b000,
Ths7 = 0b001,
Ths8 = 0b010,
Ths10 = 0b011,
Ths11 = 0b100,
Ths13 = 0b101,
Ths15 = 0b110,
Ths16 = 0b111,
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Int1PadConfig {
pub int1_6d: bool,
pub int1_single_tap: bool,
pub int1_wu: bool,
pub int1_ff: bool,
pub int1_tap: bool,
pub int1_diff5: bool,
pub int1_fth: bool,
pub int1_drdy: bool,
}
impl From<u8> for Int1PadConfig {
fn from(value: u8) -> Self {
Self {
int1_6d: value & INT1_6D != 0,
int1_single_tap: value & INT1_SINGLE_TAP != 0,
int1_wu: value & INT1_WU != 0,
int1_ff: value & INT1_FF != 0,
int1_tap: value & INT1_TAP != 0,
int1_diff5: value & INT1_DIFF5 != 0,
int1_fth: value & INT1_FTH != 0,
int1_drdy: value & INT1_DRDY != 0,
}
}
}
impl From<Int1PadConfig> for u8 {
fn from(value: Int1PadConfig) -> Self {
let mut result = 0;
if value.int1_6d {
result |= INT1_6D;
}
if value.int1_single_tap {
result |= INT1_SINGLE_TAP;
}
if value.int1_wu {
result |= INT1_WU;
}
if value.int1_ff {
result |= INT1_FF;
}
if value.int1_tap {
result |= INT1_TAP;
}
if value.int1_diff5 {
result |= INT1_DIFF5;
}
if value.int1_fth {
result |= INT1_FTH;
}
if value.int1_drdy {
result |= INT1_DRDY;
}
result
}
}
#[derive(Debug, Copy, Clone, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Int2PadConfig {
pub int2_sleep_state: bool,
pub int2_sleep_chg: bool,
pub int2_boot: bool,
pub int2_drdy_t: bool,
pub int2_ovr: bool,
pub int2_diff5: bool,
pub int2_fth: bool,
pub int2_drdy: bool,
}
impl From<u8> for Int2PadConfig {
fn from(value: u8) -> Self {
Self {
int2_sleep_state: value & INT2_SLEEP_STATE != 0,
int2_sleep_chg: value & INT2_SLEEP_CHG != 0,
int2_boot: value & INT2_BOOT != 0,
int2_drdy_t: value & INT2_DRDY_T != 0,
int2_ovr: value & INT2_OVR != 0,
int2_diff5: value & INT2_DIFF5 != 0,
int2_fth: value & INT2_FTH != 0,
int2_drdy: value & INT2_DRDY != 0,
}
}
}
impl From<Int2PadConfig> for u8 {
fn from(value: Int2PadConfig) -> Self {
let mut result = 0;
if value.int2_sleep_state {
result |= INT2_SLEEP_STATE;
}
if value.int2_sleep_chg {
result |= INT2_SLEEP_CHG;
}
if value.int2_boot {
result |= INT2_BOOT;
}
if value.int2_drdy_t {
result |= INT2_DRDY_T;
}
if value.int2_ovr {
result |= INT2_OVR;
}
if value.int2_diff5 {
result |= INT2_DIFF5;
}
if value.int2_fth {
result |= INT2_FTH;
}
if value.int2_drdy {
result |= INT2_DRDY;
}
result
}
}