use defmt::Format;
#[derive(Debug, Clone, Copy, PartialEq, Format)]
#[repr(u8)]
#[allow(non_camel_case_types)]
pub enum Register {
CHIP_ID = 0x00,
REV_ID = 0x01,
ERR_REG = 0x02,
STATUS = 0x03,
DATA_0 = 0x04,
DATA_1 = 0x05,
DATA_2 = 0x06,
DATA_3 = 0x07,
DATA_4 = 0x08,
DATA_5 = 0x09,
SENSORTIME_0 = 0x0C,
SENSORTIME_1 = 0x0D,
SENSORTIME_2 = 0x0E,
EVENT = 0x10,
INT_STATUS = 0x11,
FIFO_LENGTH_0 = 0x12,
FIFO_LENGTH_1 = 0x13,
FIFO_DATA = 0x14,
FIFO_WTM_0 = 0x15,
FIFO_WTM_1 = 0x16,
FIFO_CONFIG_1 = 0x17,
FIFO_CONFIG_2 = 0x18,
INT_CTRL = 0x19,
IF_CONF = 0x1A,
PWR_CTRL = 0x1B,
OSR = 0x1C,
ODR = 0x1D,
CONFIG = 0x1F,
NVM_PAR_T1_0 = 0x31,
NVM_PAR_T1_1 = 0x32,
NVM_PAR_T2_0 = 0x33,
NVM_PAR_T2_1 = 0x34,
NVM_PAR_T3 = 0x35,
NVM_PAR_P1_0 = 0x36,
NVM_PAR_P1_1 = 0x37,
NVM_PAR_P2_0 = 0x38,
NVM_PAR_P2_1 = 0x39,
NVM_PAR_P3 = 0x3A,
NVM_PAR_P4 = 0x3B,
NVM_PAR_P5_0 = 0x3C,
NVM_PAR_P5_1 = 0x3D,
NVM_PAR_P6_0 = 0x3E,
NVM_PAR_P6_1 = 0x3F,
NVM_PAR_P7 = 0x40,
NVM_PAR_P8 = 0x41,
NVM_PAR_P9_0 = 0x42,
NVM_PAR_P9_1 = 0x43,
NVM_PAR_P10 = 0x44,
NVM_PAR_P11 = 0x45,
CMD = 0x7E,
}
impl From<Register> for u8 {
fn from(register: Register) -> u8 {
register as u8
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct ErrReg {
pub fatal_err: bool,
pub cmd_err: bool,
pub conf_err: bool,
}
impl From<u8> for ErrReg {
fn from(value: u8) -> ErrReg {
ErrReg {
fatal_err: (value & 0b01) != 0,
cmd_err: (value & 0b10) != 0,
conf_err: (value & 0b100) != 0,
}
}
}
impl From<ErrReg> for u8 {
fn from(err_reg: ErrReg) -> u8 {
let mut value = 0;
if err_reg.fatal_err {
value |= 1 << 0;
}
if err_reg.cmd_err {
value |= 1 << 1;
}
if err_reg.conf_err {
value |= 1 << 2;
}
value
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Status {
pub cmd_ready: bool,
pub drdy_press: bool,
pub drdy_temp: bool,
}
impl From<u8> for Status {
fn from(value: u8) -> Status {
Status {
cmd_ready: (value & (1 << 4)) != 0,
drdy_press: (value & (1 << 5)) != 0,
drdy_temp: (value & (1 << 6)) != 0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Event {
pub por_detected: bool,
pub itf_act_pt: bool,
}
impl From<u8> for Event {
fn from(value: u8) -> Event {
Event {
por_detected: (value & 0b01) != 0,
itf_act_pt: (value & 0b10) != 0,
}
}
}
impl From<Event> for u8 {
fn from(event: Event) -> u8 {
let mut value = 0;
if event.por_detected {
value |= 1 << 0;
}
if event.itf_act_pt {
value |= 1 << 1;
}
value
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct IntStatus {
pub fwm_int: bool,
pub ffull_int: bool,
pub drdy: bool,
}
impl From<u8> for IntStatus {
fn from(value: u8) -> IntStatus {
IntStatus {
fwm_int: (value & 0b01) != 0,
ffull_int: (value & 0b10) != 0,
drdy: (value & 0b1000) != 0,
}
}
}
impl From<IntStatus> for u8 {
fn from(int_status: IntStatus) -> u8 {
let mut value = 0;
if int_status.fwm_int {
value |= 1 << 0;
}
if int_status.ffull_int {
value |= 1 << 1;
}
if int_status.drdy {
value |= 1 << 3;
}
value
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub enum IntOd {
OpenDrain = 1,
PushPull = 0,
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub enum IntLevel {
High = 1,
Low = 0,
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct IntControl {
pub output: IntOd,
pub level: IntLevel,
pub latch: bool,
pub fifo_watermark: bool,
pub fifo_full: bool,
pub int_ds: bool,
pub drdy_en: bool,
}
impl From<IntControl> for u8 {
fn from(control: IntControl) -> u8 {
let mut value = 0;
if control.output == IntOd::OpenDrain {
value |= 1 << 0;
}
if control.level == IntLevel::High {
value |= 1 << 1;
}
if control.latch {
value |= 1 << 2;
}
if control.fifo_watermark {
value |= 1 << 3;
}
if control.fifo_full {
value |= 1 << 4;
}
if control.int_ds {
value |= 1 << 5;
}
if control.drdy_en {
value |= 1 << 6;
}
value
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub enum PowerMode {
Sleep = 0b00,
Forced = 0b01,
Normal = 0b11,
}
impl From<PowerMode> for u8 {
fn from(mode: PowerMode) -> u8 {
mode as u8
}
}
impl From<u8> for PowerMode {
fn from(value: u8) -> PowerMode {
match value & 0b11 {
0b00 => PowerMode::Sleep,
0b01 | 0b10 => PowerMode::Forced,
0b11 => PowerMode::Normal,
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct PowerControl {
pub enable_pressure: bool,
pub enable_temperature: bool,
pub mode: PowerMode,
}
impl From<PowerControl> for u8 {
fn from(control: PowerControl) -> u8 {
let mut value = (control.mode as u8) << 4;
if control.enable_pressure {
value |= 1 << 0;
}
if control.enable_temperature {
value |= 1 << 1;
}
value
}
}
impl From<u8> for PowerControl {
fn from(value: u8) -> PowerControl {
let enable_pressure = (value & 0b01) != 0; let enable_temperature = (value & 0b10) != 0; let mode = (value >> 4).into();
PowerControl {
mode,
enable_pressure,
enable_temperature,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub enum Oversampling {
None = 0b000,
X2 = 0b001,
X4 = 0b010,
X8 = 0b011,
X16 = 0b100,
X32 = 0b101,
}
impl Oversampling {
pub const X1: Oversampling = Oversampling::None;
}
impl From<Oversampling> for u8 {
fn from(oversampling: Oversampling) -> u8 {
oversampling as u8
}
}
impl TryFrom<u8> for Oversampling {
type Error = u8;
fn try_from(value: u8) -> Result<Oversampling, Self::Error> {
match value & 0b111 {
0b000 => Ok(Oversampling::None),
0b001 => Ok(Oversampling::X2),
0b010 => Ok(Oversampling::X4),
0b011 => Ok(Oversampling::X8),
0b100 => Ok(Oversampling::X16),
0b101 => Ok(Oversampling::X32),
value => Err(value),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Osr {
pub pressure: Oversampling,
pub temperature: Oversampling,
}
impl From<Osr> for u8 {
fn from(osr: Osr) -> u8 {
(osr.pressure as u8) | ((osr.temperature as u8) << 3)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Odr {
pub odr_sel: OdrSel,
}
impl From<Odr> for u8 {
fn from(odr: Odr) -> u8 {
odr.odr_sel as u8
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
#[allow(non_camel_case_types)]
pub enum OdrSel {
ODR_200 = 0x00,
ODR_100 = 0x01,
ODR_50 = 0x02,
ODR_25 = 0x03,
ODR_12p5 = 0x04,
ODR_6p25 = 0x05,
ODR_3p1 = 0x06,
ODR_1p5 = 0x07,
ODR_0p78 = 0x08,
ODR_0p39 = 0x09,
ODR_0p2 = 0x0A,
ODR_0p1 = 0x0B,
ODR_0p05 = 0x0C,
ODR_0p02 = 0x0D,
ODR_0p01 = 0x0E,
ODR_0p006 = 0x0F,
ODR_0p003 = 0x10,
ODR_0p0015 = 0x11,
}
impl From<OdrSel> for u8 {
fn from(odr: OdrSel) -> u8 {
odr as u8
}
}
#[cfg(feature = "embassy-time")]
impl From<OdrSel> for embassy_time::Duration {
fn from(odr: OdrSel) -> embassy_time::Duration {
match odr {
OdrSel::ODR_200 => embassy_time::Duration::from_millis(5),
OdrSel::ODR_100 => embassy_time::Duration::from_millis(10),
OdrSel::ODR_50 => embassy_time::Duration::from_millis(20),
OdrSel::ODR_25 => embassy_time::Duration::from_millis(40),
OdrSel::ODR_12p5 => embassy_time::Duration::from_millis(80),
OdrSel::ODR_6p25 => embassy_time::Duration::from_millis(160),
OdrSel::ODR_3p1 => embassy_time::Duration::from_millis(320),
OdrSel::ODR_1p5 => embassy_time::Duration::from_millis(640),
OdrSel::ODR_0p78 => embassy_time::Duration::from_millis(1_280),
OdrSel::ODR_0p39 => embassy_time::Duration::from_millis(2_560),
OdrSel::ODR_0p2 => embassy_time::Duration::from_millis(5_120),
OdrSel::ODR_0p1 => embassy_time::Duration::from_millis(10_240),
OdrSel::ODR_0p05 => embassy_time::Duration::from_millis(20_480),
OdrSel::ODR_0p02 => embassy_time::Duration::from_millis(40_960),
OdrSel::ODR_0p01 => embassy_time::Duration::from_millis(81_920),
OdrSel::ODR_0p006 => embassy_time::Duration::from_millis(163_840),
OdrSel::ODR_0p003 => embassy_time::Duration::from_millis(327_680),
OdrSel::ODR_0p0015 => embassy_time::Duration::from_millis(655_360),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
#[allow(non_camel_case_types)]
pub enum IirFilter {
coef_0 = 0b000,
coef_1 = 0b001,
coef_3 = 0b010,
coef_7 = 0b011,
coef_15 = 0b100,
coef_31 = 0b101,
coef_63 = 0b110,
coef_127 = 0b111,
}
impl IirFilter {
pub const BYPASS: IirFilter = IirFilter::coef_0;
}
impl From<IirFilter> for u8 {
fn from(filter: IirFilter) -> u8 {
filter as u8
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Config {
pub iir_filter: IirFilter,
}
impl From<Config> for u8 {
fn from(config: Config) -> u8 {
(config.iir_filter as u8) << 1
}
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub enum Command {
Nop = 0x00,
FifoFlush = 0xB0,
SoftReset = 0xB6,
}
#[derive(Debug, Clone, Copy, PartialEq, Format)]
pub struct Cmd {
pub command: Command,
}
impl From<Cmd> for u8 {
fn from(cmd: Cmd) -> u8 {
cmd.command as u8
}
}