use super::super::{
BusOperation, DelayNs, Error, Iis2mdc, RegisterOperation, SensorOperation, bisync,
register::OnState,
};
use bitfield_struct::bitfield;
use derive_more::TryFrom;
use st_mem_bank_macro::{named_register, register};
#[repr(u8)]
#[derive(Clone, Copy, PartialEq)]
pub enum Reg {
OffsetXRegL = 0x45,
OffsetXRegH = 0x46,
OffsetYRegL = 0x47,
OffsetYRegH = 0x48,
OffsetZRegL = 0x49,
OffsetZRegH = 0x4A,
WhoAmI = 0x4F,
CfgRegA = 0x60,
CfgRegB = 0x61,
CfgRegC = 0x62,
IntCtrlReg = 0x63,
IntSourceReg = 0x64,
IntThsLReg = 0x65,
IntThsHReg = 0x66,
StatusReg = 0x67,
OutxLReg = 0x68,
OutxHReg = 0x69,
OutyLReg = 0x6A,
OutyHReg = 0x6B,
OutzLReg = 0x6C,
OutzHReg = 0x6D,
TempOutLReg = 0x6E,
TempOutHReg = 0x6F,
}
#[register(address = Reg::CfgRegA, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct CfgRegA {
#[bits(2, default = 0b11)]
pub md: u8,
#[bits(2)]
pub odr: u8,
#[bits(1)]
pub lp: u8,
#[bits(1)]
pub soft_rst: u8,
#[bits(1)]
pub reboot: u8,
#[bits(1)]
pub comp_temp_en: u8,
}
#[register(address = Reg::CfgRegB, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct CfgRegB {
#[bits(1)]
pub lpf: u8,
#[bits(2)]
pub set_rst: u8,
#[bits(1)]
pub int_on_dataoff: u8,
#[bits(1)]
pub off_canc_one_shot: u8,
#[bits(3, access = RO)]
not_used_01: u8,
}
#[register(address = Reg::CfgRegC, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct CfgRegC {
#[bits(1)]
pub drdy_on_pin: u8,
#[bits(1)]
pub self_test: u8,
#[bits(1, access = RO, default = 0x0)]
not_used_01: u8,
#[bits(1)]
pub ble: u8,
#[bits(1)]
pub bdu: u8,
#[bits(1)]
pub i2c_dis: u8,
#[bits(1)]
pub int_on_pin: u8,
#[bits(1, access = RO)]
not_used_02: u8,
}
#[register(address = Reg::IntCtrlReg, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct IntCtrlReg {
#[bits(1)]
pub ien: u8,
#[bits(1)]
pub iel: u8,
#[bits(1)]
pub iea: u8,
#[bits(2, access = RO, default = 0x00)]
not_used_01: u8,
#[bits(1, default = 0x1)]
pub zien: u8,
#[bits(1, default = 0x1)]
pub yien: u8,
#[bits(1, default = 0x1)]
pub xien: u8,
}
#[register(address = Reg::IntSourceReg, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct IntSourceReg {
#[bits(1, access = RO)]
pub int: u8,
#[bits(1, access = RO)]
pub mroi: u8,
#[bits(1, access = RO)]
pub n_th_s_z: u8,
#[bits(1, access = RO)]
pub n_th_s_y: u8,
#[bits(1, access = RO)]
pub n_th_s_x: u8,
#[bits(1, access = RO)]
pub p_th_s_z: u8,
#[bits(1, access = RO)]
pub p_th_s_y: u8,
#[bits(1, access = RO)]
pub p_th_s_x: u8,
}
#[register(address = Reg::StatusReg, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
pub struct StatusReg {
#[bits(1, access = RO)]
pub xda: u8,
#[bits(1, access = RO)]
pub yda: u8,
#[bits(1, access = RO)]
pub zda: u8,
#[bits(1, access = RO)]
pub zyxda: u8,
#[bits(1, access = RO)]
pub xor: u8,
#[bits(1, access = RO)]
pub yor: u8,
#[bits(1, access = RO)]
pub zor: u8,
#[bits(1, access = RO)]
pub zyxor: u8,
}
#[named_register(address = Reg::OffsetXRegL, access_type = "Iis2mdc<B, T, OnState>")]
pub struct OffsetXYZ {
pub x: i16,
pub y: i16,
pub z: i16,
}
#[named_register(address = Reg::OutxLReg, access_type = "Iis2mdc<B, T, OnState>")]
pub struct OutXYZ {
pub x: i16,
pub y: i16,
pub z: i16,
}
#[register(address = Reg::TempOutLReg, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
pub struct TempOutReg {
#[bits(16, access = RO)]
pub temp_out: i16,
}
#[register(address = Reg::IntThsLReg, access_type = "Iis2mdc<B, T, OnState>")]
#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
pub struct IntThsReg {
#[bits(16)]
pub int_ths: i16,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum Md {
#[default]
ContinuousMode = 0,
SingleTrigger = 1,
PowerDown = 2,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum Odr {
#[default]
_10hz = 0,
_20hz = 1,
_50hz = 2,
_100hz = 3,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum Lp {
#[default]
HighResolution = 0,
LowPower = 1,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum Lpf {
#[default]
OdrDiv2 = 0,
OdrDiv4 = 1,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum SetRst {
#[default]
SetSensOdrDiv63 = 0,
SensOffCancEveryOdr = 1,
SetSensOnlyAtPowerOn = 2,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum Ble {
#[default]
LsbAtLowAdd = 0,
MsbAtLowAdd = 1,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum IntOnDataOff {
#[default]
CheckBefore = 0,
CheckAfter = 1,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
#[try_from(repr)]
pub enum I2cDis {
#[default]
Enable = 0,
Disable = 1,
}