#[allow(unused_imports)]
#[allow(dead_code)]
use log::debug;
#[allow(unused_imports)]
use bitfield::bitfield;
#[derive(Debug, PartialEq, Clone, Copy)]
pub struct Measurements {
pub presence_value: Option<i16>,
pub motion_value: Option<i16>,
pub ambient_shock_value: Option<i16>,
}
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum AverageTrimT1Flag {
AVG_T8 = 0x00,
AVG_T4 = 0x01,
AVG_T2 = 0x02,
AVG_T1 = 0x03,
}
impl From<u8> for AverageTrimT1Flag {
fn from(v: u8) -> Self {
match v {
0x00 => Self::AVG_T8,
0x01 => Self::AVG_T4,
0x02 => Self::AVG_T2,
0x03 => Self::AVG_T1,
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum AverageTrimTMOSFlag {
AVG_TMOS2 = 0x00,
AVG_TMOS8 = 0x01,
AVG_TMOS32 = 0x02,
AVG_TMOS128 = 0x03, AVG_TMOS256 = 0x04,
AVG_TMOS512 = 0x05,
AVG_TMOS1024 = 0x06,
AVG_TMOS2048 = 0x07,
}
impl From<u8> for AverageTrimTMOSFlag {
fn from(v: u8) -> Self {
match v {
0x00 => Self::AVG_TMOS2,
0x01 => Self::AVG_TMOS8,
0x02 => Self::AVG_TMOS32,
0x03 => Self::AVG_TMOS128,
0x04 => Self::AVG_TMOS256,
0x05 => Self::AVG_TMOS512,
0x06 => Self::AVG_TMOS1024,
0x07 => Self::AVG_TMOS2048,
_ => unreachable!(),
}
}
}
bitfield! {
pub struct Avg_trim(u8);
impl Debug;
pub into AverageTrimT1Flag, average_trim_t1_flags, set_trim_t1: 5,4;
pub into AverageTrimTMOSFlag, average_trim_tmos_flag, set_trim_tmos: 2,0;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)]
#[repr(u8)]
pub enum Odr {
ODR_POWERDOWN = 0x00,
ODR_HZ025 = 0x01,
ODR_HZ050 = 0x02,
ODR_HZ1 = 0x03,
ODR_HZ2 = 0x04,
ODR_HZ4 = 0x05,
ODR_HZ8 = 0x06,
ODR_HZ15 = 0x07,
ODR_HZ30 = 0x08,
}
impl From<u8> for Odr {
fn from(v: u8) -> Self {
match v {
0x00 => Self::ODR_POWERDOWN,
0x01 => Self::ODR_HZ025,
0x02 => Self::ODR_HZ050,
0x03 => Self::ODR_HZ1,
0x04 => Self::ODR_HZ2,
0x05 => Self::ODR_HZ4,
0x06 => Self::ODR_HZ8,
0x07 => Self::ODR_HZ15,
0x08 => Self::ODR_HZ30,
_ => Self::ODR_HZ30,
}
}
}
bitfield! {
#[derive(Clone, Copy)]
pub struct CTRL1(u8);
impl Debug;
pub bool, bdu, set_bdu: 4;
pub into Odr, odr, set_odr: 3,0; }
bitfield! {
pub struct FuncStatus(u8);
impl Debug;
pub bool, tamb_shock_flag, set_shock_flag: 0; pub bool, mot_flag, set_mot_flag: 1; pub bool, presence_flag, set_presence_flag: 2; }
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum Gain {
GainWideMode = 0x00,
GainDefault = 0x07,
}
impl From<u8> for Gain {
fn from(v: u8) -> Self {
match v {
0x00 => Self::GainWideMode,
0x07 => Self::GainDefault,
_ => unreachable!(),
}
}
}
bitfield! {
#[derive(Clone, Copy)]
pub struct CTRL0(u8);
impl Debug;
u8;
pub bool, bit7, _: 7;
pub into Gain, gain, set_gain: 6,4; pub bool, bit0, _: 0; }
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum LPF_DIV {
STHS34PF80_LPF_ODR_DIV_9 = 0x00,
STHS34PF80_LPF_ODR_DIV_20 = 0x01,
STHS34PF80_LPF_ODR_DIV_50 = 0x02,
STHS34PF80_LPF_ODR_DIV_100 = 0x03,
STHS34PF80_LPF_ODR_DIV_200 = 0x04,
STHS34PF80_LPF_ODR_DIV_400 = 0x05,
STHS34PF80_LPF_ODR_DIV_800 = 0x06,
}
impl From<u8> for LPF_DIV {
fn from(v: u8) -> Self {
match v {
0x00 => Self::STHS34PF80_LPF_ODR_DIV_9,
0x01 => Self::STHS34PF80_LPF_ODR_DIV_20,
0x02 => Self::STHS34PF80_LPF_ODR_DIV_50,
0x03 => Self::STHS34PF80_LPF_ODR_DIV_100,
0x04 => Self::STHS34PF80_LPF_ODR_DIV_200,
0x05 => Self::STHS34PF80_LPF_ODR_DIV_400,
0x06 => Self::STHS34PF80_LPF_ODR_DIV_800,
_ => unreachable!(),
}
}
}
bitfield! {
#[derive(Clone, Copy)]
pub struct LPF1(u8);
impl Debug;
u8;
pub into LPF_DIV, lpf_m_p, set_lpf_m_p: 5,3; pub into LPF_DIV, lpf_m, set_lpf_m: 2,0; }
bitfield! {
#[derive(Clone, Copy)]
pub struct LPF2(u8);
impl Debug;
u8;
pub into LPF_DIV, lpf_p, set_lpf_p: 5,3; pub into LPF_DIV, lpf_a_t, set_lpf_a_t: 2,0; }
#[derive(Debug)]
pub struct InterruptPinConfig(pub u8);
impl InterruptPinConfig {
pub fn builder() -> InterruptPinConfig {
InterruptPinConfig(0x00)
}
pub fn get_u8_value(&self) -> u8 {
self.0
}
pub fn active_high(mut self) -> Self {
self.0 |= 0b10000000;
self
}
pub fn active_low(mut self) -> Self {
self.0 &= 0b01111111;
self
}
pub fn open_drain(mut self) -> Self {
self.0 |= 0b01000000;
self
}
pub fn push_pull(mut self) -> Self {
self.0 &= 0b10111111;
self
}
pub fn on_new_presence(mut self) -> Self {
self.0 |= 0b00100000;
self
}
pub fn not_new_presence(mut self) -> Self {
self.0 &= 0b11011111;
self
}
pub fn on_new_motion(mut self) -> Self {
self.0 |= 0b00010000;
self
}
pub fn not_new_motion(mut self) -> Self {
self.0 &= 0b11101111;
self
}
pub fn on_new_shock_temp(mut self) -> Self {
self.0 |= 0b00001000;
self
}
pub fn not_new_shock_temp(mut self) -> Self {
self.0 &= 0b11110111;
self
}
pub fn on_new_any(mut self) -> Self {
self.0 |= 0b00111000;
self
}
pub fn pulsed_pin(mut self) -> Self {
self.0 &= 0b11111101;
self
}
pub fn latched_pin(mut self) -> Self {
self.0 |= 0b00000010;
self
}
pub fn ien_high_z(mut self) -> Self {
self.0 &= 0b11111100;
self
}
pub fn ien_drdy(mut self) -> Self {
self.0 |= 0b00000001;
self
}
pub fn ien_int_or(mut self) -> Self {
self.0 |= 0b00000010;
self.0 &= 0b11111011; self
}
pub fn build(self) -> u8 {
self.0 as u8
}
}