#![allow(non_camel_case_types, clippy::unreadable_literal)]
use bitflags::bitflags;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum Register {
DEVID = 0x00,
THRESH_TAP = 0x1D,
OFSX = 0x1E,
OFSY = 0x1F,
OFSZ = 0x20,
DUR = 0x21,
LATENT = 0x22,
WINDOW = 0x23,
THRESH_ACT = 0x24,
THRESH_INACT = 0x25,
TIME_INACT = 0x26,
ACT_INACT_CTL = 0x27,
THRESH_FF = 0x28,
TIME_FF = 0x29,
TAP_AXES = 0x2A,
ACT_TAP_STATUS = 0x2B,
BW_RATE = 0x2C,
POWER_CTL = 0x2D,
INT_ENABLE = 0x2E,
INT_MAP = 0x2F,
INT_SOURCE = 0x30,
DATA_FORMAT = 0x31,
DATAX0 = 0x32,
DATAX1 = 0x33,
DATAY0 = 0x34,
DATAY1 = 0x35,
DATAZ0 = 0x36,
DATAZ1 = 0x37,
FIFO_CTL = 0x38,
FIFO_STATUS = 0x39,
}
impl Register {
pub fn addr(self) -> u8 {
self as u8
}
pub fn read_only(self) -> bool {
match self {
Register::DEVID
| Register::ACT_TAP_STATUS
| Register::INT_SOURCE
| Register::DATAX0
| Register::DATAX1
| Register::DATAY0
| Register::DATAY1
| Register::DATAZ0
| Register::DATAZ1
| Register::FIFO_STATUS => true,
_ => false,
}
}
}
bitflags! {
pub struct DataFormatFlags: u8 {
const SELF_TEST = 0b10000000;
const SPI = 0b01000000;
const INT_INVERT = 0b00100000;
const FULL_RES = 0b00001000;
const JUSTIFY = 0b00000100;
const RANGE_HI = 0b00000010;
const RANGE_LO = 0b00000001;
}
}
impl DataFormatFlags {
pub fn range(self) -> DataFormatRange {
if self.contains(DataFormatFlags::RANGE_HI) {
if self.contains(DataFormatFlags::RANGE_LO) {
DataFormatRange::PLUSMINUS_16G
} else {
DataFormatRange::PLUSMINUS_8G
}
} else if self.contains(DataFormatFlags::RANGE_LO) {
DataFormatRange::PLUSMINUS_4G
} else {
DataFormatRange::PLUSMINUS_2G
}
}
}
impl Default for DataFormatFlags {
fn default() -> Self {
DataFormatFlags::empty()
}
}
impl From<DataFormatRange> for DataFormatFlags {
fn from(range: DataFormatRange) -> DataFormatFlags {
range.bits()
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum DataFormatRange {
PLUSMINUS_2G = 0b00,
PLUSMINUS_4G = 0b01,
PLUSMINUS_8G = 0b10,
PLUSMINUS_16G = 0b11,
}
impl DataFormatRange {
pub fn bits(self) -> DataFormatFlags {
match self {
DataFormatRange::PLUSMINUS_2G => DataFormatFlags::empty(),
DataFormatRange::PLUSMINUS_4G => DataFormatFlags::RANGE_LO,
DataFormatRange::PLUSMINUS_8G => DataFormatFlags::RANGE_HI,
DataFormatRange::PLUSMINUS_16G => DataFormatFlags::RANGE_HI | DataFormatFlags::RANGE_LO,
}
}
}
impl From<DataFormatRange> for f32 {
fn from(range: DataFormatRange) -> f32 {
match range {
DataFormatRange::PLUSMINUS_2G => 2.0,
DataFormatRange::PLUSMINUS_4G => 4.0,
DataFormatRange::PLUSMINUS_8G => 8.0,
DataFormatRange::PLUSMINUS_16G => 16.0,
}
}
}