use super::super::{
BusOperation, DelayNs, Error, Lis2dux12, RegisterOperation, SensorOperation, bisync,
register::EmbBank,
};
use bitfield_struct::bitfield;
use derive_more::TryFrom;
use st_mem_bank_macro::register;
#[repr(u8)]
#[derive(Clone, Copy, PartialEq)]
pub enum EmbReg {
PageSel = 0x02,
EmbFuncEnA = 0x04,
EmbFuncEnB = 0x05,
EmbFuncExecStatus = 0x07,
PageAddress = 0x08,
PageValue = 0x09,
EmbFuncInt1 = 0x0A,
FsmInt1 = 0x0B,
MlcInt1 = 0x0D,
EmbFuncInt2 = 0x0E,
FsmInt2 = 0x0F,
MlcInt2 = 0x11,
EmbFuncStatus = 0x12,
FsmStatus = 0x13,
MlcStatus = 0x15,
PageRw = 0x17,
EmbFuncFifoEn = 0x18,
FsmEnable = 0x1A,
FsmLongCounterL = 0x1C,
FsmLongCounterH = 0x1D,
IntAckMask = 0x1F,
FsmOuts1 = 0x20,
FsmOuts2 = 0x21,
FsmOuts3 = 0x22,
FsmOuts4 = 0x23,
FsmOuts5 = 0x24,
FsmOuts6 = 0x25,
FsmOuts7 = 0x26,
FsmOuts8 = 0x27,
StepCounterL = 0x28,
StepCounterH = 0x29,
EmbFuncSrc = 0x2A,
EmbFuncInitA = 0x2C,
EmbFuncInitB = 0x2D,
Mlc1Src = 0x34,
Mlc2Src = 0x35,
Mlc3Src = 0x36,
Mlc4Src = 0x37,
FsmOdr = 0x39,
MlcOdr = 0x3A,
}
#[register(address = EmbReg::PageSel, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct PageSel {
#[bits(4, access = RO, default = 1)]
not_used0: u8,
#[bits(4)]
pub page_sel: u8,
}
#[register(address = EmbReg::EmbFuncEnA, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncEnA {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub pedo_en: u8,
#[bits(1)]
pub tilt_en: u8,
#[bits(1)]
pub sign_motion_en: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1)]
pub mlc_before_fsm_en: u8,
}
#[register(address = EmbReg::EmbFuncEnB, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncEnB {
#[bits(1)]
pub fsm_en: u8,
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub mlc_en: u8,
#[bits(3, access = RO, default = 0)]
not_used1: u8,
}
#[register(address = EmbReg::EmbFuncExecStatus, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncExecStatus {
#[bits(1, access = RO)]
pub emb_func_endop: u8,
#[bits(1, access = RO)]
pub emb_func_exec_ovr: u8,
#[bits(6, access = RO)]
not_used0: u8,
}
#[register(address = EmbReg::PageAddress, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct PageAddress {
#[bits(8)]
pub page_addr: u8,
}
#[register(address = EmbReg::PageValue, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct PageValue {
#[bits(8)]
pub page_value: u8,
}
#[register(address = EmbReg::EmbFuncInt1, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncInt1 {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub int1_step_det: u8,
#[bits(1)]
pub int1_tilt: u8,
#[bits(1)]
pub int1_sig_mot: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1)]
pub int1_fsm_lc: u8,
}
#[register(address = EmbReg::FsmInt1, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmInt1 {
#[bits(1)]
pub int1_fsm1: u8,
#[bits(1)]
pub int1_fsm2: u8,
#[bits(1)]
pub int1_fsm3: u8,
#[bits(1)]
pub int1_fsm4: u8,
#[bits(1)]
pub int1_fsm5: u8,
#[bits(1)]
pub int1_fsm6: u8,
#[bits(1)]
pub int1_fsm7: u8,
#[bits(1)]
pub int1_fsm8: u8,
}
#[register(address = EmbReg::MlcInt1, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct MlcInt1 {
#[bits(1)]
pub int1_mlc1: u8,
#[bits(1)]
pub int1_mlc2: u8,
#[bits(1)]
pub int1_mlc3: u8,
#[bits(1)]
pub int1_mlc4: u8,
#[bits(4, access = RO, default = 0)]
not_used0: u8,
}
#[register(address = EmbReg::EmbFuncInt2, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncInt2 {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub int2_step_det: u8,
#[bits(1)]
pub int2_tilt: u8,
#[bits(1)]
pub int2_sig_mot: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1)]
pub int2_fsm_lc: u8,
}
#[register(address = EmbReg::FsmInt2, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmInt2 {
#[bits(1)]
pub int2_fsm1: u8,
#[bits(1)]
pub int2_fsm2: u8,
#[bits(1)]
pub int2_fsm3: u8,
#[bits(1)]
pub int2_fsm4: u8,
#[bits(1)]
pub int2_fsm5: u8,
#[bits(1)]
pub int2_fsm6: u8,
#[bits(1)]
pub int2_fsm7: u8,
#[bits(1)]
pub int2_fsm8: u8,
}
#[register(address = EmbReg::MlcInt2, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct MlcInt2 {
#[bits(1)]
pub int2_mlc1: u8,
#[bits(1)]
pub int2_mlc2: u8,
#[bits(1)]
pub int2_mlc3: u8,
#[bits(1)]
pub int2_mlc4: u8,
#[bits(4, access = RO, default = 0)]
not_used0: u8,
}
#[register(address = EmbReg::EmbFuncStatus, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncStatus {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1, access = RO)]
pub is_step_det: u8,
#[bits(1, access = RO)]
pub is_tilt: u8,
#[bits(1, access = RO)]
pub is_sigmot: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1, access = RO)]
pub is_fsm_lc: u8,
}
#[register(address = EmbReg::FsmStatus, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmStatus {
#[bits(1, access = RO)]
pub is_fsm1: u8,
#[bits(1, access = RO)]
pub is_fsm2: u8,
#[bits(1, access = RO)]
pub is_fsm3: u8,
#[bits(1, access = RO)]
pub is_fsm4: u8,
#[bits(1, access = RO)]
pub is_fsm5: u8,
#[bits(1, access = RO)]
pub is_fsm6: u8,
#[bits(1, access = RO)]
pub is_fsm7: u8,
#[bits(1, access = RO)]
pub is_fsm8: u8,
}
#[register(address = EmbReg::MlcStatus, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct MlcStatus {
#[bits(1, access = RO)]
pub is_mlc1: u8,
#[bits(1, access = RO)]
pub is_mlc2: u8,
#[bits(1, access = RO)]
pub is_mlc3: u8,
#[bits(1, access = RO)]
pub is_mlc4: u8,
#[bits(4, access = RO, default = 0)]
not_used0: u8,
}
#[register(address = EmbReg::PageRw, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct PageRw {
#[bits(5, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub page_read: u8,
#[bits(1)]
pub page_write: u8,
#[bits(1)]
pub emb_func_lir: u8,
}
#[register(address = EmbReg::EmbFuncFifoEn, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncFifoEn {
#[bits(1)]
pub step_counter_fifo_en: u8,
#[bits(1)]
pub mlc_fifo_en: u8,
#[bits(1)]
pub mlc_filter_feature_fifo_en: u8,
#[bits(1)]
pub fsm_fifo_en: u8,
#[bits(4, access = RO, default = 0)]
not_used0: u8,
}
#[register(address = EmbReg::FsmEnable, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmEnable {
#[bits(1)]
pub fsm1_en: u8,
#[bits(1)]
pub fsm2_en: u8,
#[bits(1)]
pub fsm3_en: u8,
#[bits(1)]
pub fsm4_en: u8,
#[bits(1)]
pub fsm5_en: u8,
#[bits(1)]
pub fsm6_en: u8,
#[bits(1)]
pub fsm7_en: u8,
#[bits(1)]
pub fsm8_en: u8,
}
#[register(address = EmbReg::FsmLongCounterL, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
pub struct FsmLongCounter {
#[bits(16, default = 0)]
pub fsm_lc: u16,
}
#[register(address = EmbReg::IntAckMask, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct IntAckMask {
#[bits(1)]
pub iack_mask0: u8,
#[bits(1)]
pub iack_mask1: u8,
#[bits(1)]
pub iack_mask2: u8,
#[bits(1)]
pub iack_mask3: u8,
#[bits(1)]
pub iack_mask4: u8,
#[bits(1)]
pub iack_mask5: u8,
#[bits(1)]
pub iack_mask6: u8,
#[bits(1)]
pub iack_mask7: u8,
}
#[register(address = EmbReg::FsmOuts1, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmOuts {
#[bits(1, access = RO)]
pub n_v: u8,
#[bits(1, access = RO)]
pub p_v: u8,
#[bits(1, access = RO)]
pub n_z: u8,
#[bits(1, access = RO)]
pub p_z: u8,
#[bits(1, access = RO)]
pub n_y: u8,
#[bits(1, access = RO)]
pub p_y: u8,
#[bits(1, access = RO)]
pub n_x: u8,
#[bits(1, access = RO)]
pub p_x: u8,
}
#[register(address = EmbReg::StepCounterL, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
pub struct StepCounter {
#[bits(16, access = RO)]
pub step: u16,
}
#[register(address = EmbReg::EmbFuncSrc, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncSrc {
#[bits(2, access = RO, default = 0)]
not_used0: u8,
#[bits(1, access = RO)]
pub stepcounter_bit_set: u8,
#[bits(1, access = RO)]
pub step_overflow: u8,
#[bits(1, access = RO)]
pub step_count_delta_ia: u8,
#[bits(1, access = RO)]
pub step_detected: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1)]
pub pedo_rst_step: u8,
}
#[register(address = EmbReg::EmbFuncInitA, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncInitA {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub step_det_init: u8,
#[bits(1)]
pub tilt_init: u8,
#[bits(1)]
pub sig_mot_init: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
#[bits(1)]
pub mlc_before_fsm_init: u8,
}
#[register(address = EmbReg::EmbFuncInitB, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct EmbFuncInitB {
#[bits(1)]
pub fsm_init: u8,
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(1)]
pub mlc_init: u8,
#[bits(3, access = RO, default = 0)]
not_used1: u8,
}
#[register(address = EmbReg::Mlc1Src, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct MlcSrc {
#[bits(8, access = RO)]
pub mlc_src: u8,
}
#[register(address = EmbReg::FsmOdr, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct FsmOdr {
#[bits(3, access = RO, default = 0)]
not_used0: u8,
#[bits(3, default = 0b001)]
pub fsm_odr: u8,
#[bits(2, access = RO, default = 0b01)]
not_used1: u8,
}
#[register(address = EmbReg::MlcOdr, access_type = "Lis2dux12<B, T, EmbBank>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct MlcOdr {
#[bits(4, access = RO, default = 0b0001)]
not_used0: u8,
#[bits(3, default = 0b001)]
pub mlc_odr: u8,
#[bits(1, access = RO, default = 0)]
not_used1: u8,
}
pub struct EmbeddedStatus {
pub is_step_det: u8,
pub is_tilt: u8,
pub is_sigmot: u8,
}
#[derive(Default)]
pub struct EmbPinIntRoute {
pub step_det: u8,
pub tilt: u8,
pub sig_mot: u8,
pub fsm_lc: u8,
}
#[derive(Default)]
pub struct StpcntMode {
pub false_step_rej: u8,
pub step_counter_enable: u8,
pub step_counter_in_fifo: u8,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default)]
pub enum EmbeddedIntConfig {
#[default]
Level = 0x0,
Latched = 0x1,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum FsmValOdr {
_12_5hz = 0,
#[default]
_25hz = 1,
_50hz = 2,
_100hz = 3,
_200hz = 4,
_400hz = 5,
_800hz = 6,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq)]
pub enum MlcMode {
Off = 0,
On = 1,
OnBeforeFsm = 2,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum MlcOdrVal {
_12_5hz = 0,
#[default]
_25hz = 1,
_50hz = 2,
_100hz = 3,
_200hz = 4,
}