use crate::{
error::SensorError,
register::{Bank0, Register},
};
pub(crate) trait Bitfield {
const BITMASK: u8;
type Reg: Register;
const REGISTER: Self::Reg;
fn bits(self) -> u8;
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Address {
Primary = 0x68,
Secondary = 0x69,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AccelRange {
G2 = 3,
G4 = 2,
G8 = 1,
G16 = 0,
}
impl AccelRange {
pub fn scale_factor(&self) -> f32 {
use AccelRange::*;
match self {
G2 => 16_384.0,
G4 => 8_192.0,
G8 => 4_096.0,
G16 => 2_048.0,
}
}
}
impl Bitfield for AccelRange {
const BITMASK: u8 = 0b0110_0000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::ACCEL_CONFIG0;
fn bits(self) -> u8 {
(self as u8) << 5
}
}
impl Default for AccelRange {
fn default() -> Self {
Self::G16
}
}
impl TryFrom<u8> for AccelRange {
type Error = SensorError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
use AccelRange::*;
match value {
0 => Ok(G16),
1 => Ok(G8),
2 => Ok(G4),
3 => Ok(G2),
_ => Err(SensorError::InvalidDiscriminant),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum GyroRange {
Deg250 = 3,
Deg500 = 2,
Deg1000 = 1,
Deg2000 = 0,
}
impl GyroRange {
pub fn scale_factor(&self) -> f32 {
use GyroRange::*;
match self {
Deg250 => 131.0,
Deg500 => 65.5,
Deg1000 => 32.8,
Deg2000 => 16.4,
}
}
}
impl Bitfield for GyroRange {
const BITMASK: u8 = 0b0110_0000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::GYRO_CONFIG0;
fn bits(self) -> u8 {
(self as u8) << 5
}
}
impl Default for GyroRange {
fn default() -> Self {
Self::Deg2000
}
}
impl TryFrom<u8> for GyroRange {
type Error = SensorError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
use GyroRange::*;
match value {
0 => Ok(Deg2000),
1 => Ok(Deg1000),
2 => Ok(Deg500),
3 => Ok(Deg250),
_ => Err(SensorError::InvalidDiscriminant),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum PowerMode {
Sleep = 0b0000,
Standby = 0b0100,
AccelLowPower = 0b0010,
AccelLowNoise = 0b0011,
GyroLowNoise = 0b1100,
SixAxisLowNoise = 0b1111,
}
impl Bitfield for PowerMode {
const BITMASK: u8 = 0b0000_1111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::PWR_MGMT0;
fn bits(self) -> u8 {
self as u8
}
}
impl Default for PowerMode {
fn default() -> Self {
PowerMode::Sleep
}
}
impl TryFrom<u8> for PowerMode {
type Error = SensorError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
use PowerMode::*;
match value {
0b0000 => Ok(Sleep),
0b0100 => Ok(Standby),
0b0010 => Ok(AccelLowPower),
0b0011 => Ok(AccelLowNoise),
0b1100 => Ok(GyroLowNoise),
0b1111 => Ok(SixAxisLowNoise),
_ => Err(SensorError::InvalidDiscriminant),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AccelOdr {
Hz1600 = 0b0101,
Hz800 = 0b0110,
Hz400 = 0b0111,
Hz200 = 0b1000,
Hz100 = 0b1001,
Hz50 = 0b1010,
Hz25 = 0b1011,
Hz12_5 = 0b1100,
Hz6_25 = 0b1101,
Hz3_125 = 0b1110,
Hz1_5625 = 0b1111,
}
impl AccelOdr {
pub fn as_f32(self) -> f32 {
use AccelOdr::*;
match self {
Hz1600 => 1600.0,
Hz800 => 800.0,
Hz400 => 400.0,
Hz200 => 200.0,
Hz100 => 100.0,
Hz50 => 50.0,
Hz25 => 25.0,
Hz12_5 => 12.5,
Hz6_25 => 6.25,
Hz3_125 => 3.125,
Hz1_5625 => 1.5625,
}
}
}
impl Bitfield for AccelOdr {
const BITMASK: u8 = 0b0000_1111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::ACCEL_CONFIG0;
fn bits(self) -> u8 {
self as u8
}
}
impl Default for AccelOdr {
fn default() -> Self {
Self::Hz800
}
}
impl TryFrom<u8> for AccelOdr {
type Error = SensorError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
use AccelOdr::*;
match value {
0b0101 => Ok(Hz1600),
0b0110 => Ok(Hz800),
0b0111 => Ok(Hz400),
0b1000 => Ok(Hz200),
0b1001 => Ok(Hz100),
0b1010 => Ok(Hz50),
0b1011 => Ok(Hz25),
0b1100 => Ok(Hz12_5),
0b1101 => Ok(Hz6_25),
0b1110 => Ok(Hz3_125),
0b1111 => Ok(Hz1_5625),
_ => Err(SensorError::InvalidDiscriminant),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AccLpAvg {
X2 = 0b000,
X4 = 0b001,
X8 = 0b010,
X16 = 0b011,
X32 = 0b100,
X64 = 0b101,
}
impl Bitfield for AccLpAvg {
const BITMASK: u8 = 0b0111_0000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::ACCEL_CONFIG1;
fn bits(self) -> u8 {
(self as u8) << 4
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AccelDlpfBw {
Bypassed = 0b000,
Hz180 = 0b001,
Hz121 = 0b010,
Hz73 = 0b011,
Hz53 = 0b100,
Hz34 = 0b101,
Hz25 = 0b110,
Hz16 = 0b111,
}
impl Bitfield for AccelDlpfBw {
const BITMASK: u8 = 0b0000_0111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::ACCEL_CONFIG1;
fn bits(self) -> u8 {
self as u8
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum TempDlpfBw {
Bypassed = 0b000,
Hz180 = 0b001,
Hz72 = 0b010,
Hz34 = 0b011,
Hz16 = 0b100,
Hz8 = 0b101,
Hz4 = 0b110,
}
impl Bitfield for TempDlpfBw {
const BITMASK: u8 = 0b0111_0000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::TEMP_CONFIG0;
fn bits(self) -> u8 {
(self as u8) << 4
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum GyroLpFiltBw {
Bypassed = 0b000,
Hz180 = 0b001,
Hz121 = 0b010,
Hz73 = 0b011,
Hz53 = 0b100,
Hz34 = 0b101,
Hz25 = 0b110,
Hz16 = 0b111,
}
impl Bitfield for GyroLpFiltBw {
const BITMASK: u8 = 0b0000_0111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::GYRO_CONFIG1;
fn bits(self) -> u8 {
self as u8
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum GyroOdr {
Hz1600 = 0b0101,
Hz800 = 0b0110,
Hz400 = 0b0111,
Hz200 = 0b1000,
Hz100 = 0b1001,
Hz50 = 0b1010,
Hz25 = 0b1011,
Hz12_5 = 0b1100,
}
impl GyroOdr {
pub fn as_f32(self) -> f32 {
use GyroOdr::*;
match self {
Hz1600 => 1600.0,
Hz800 => 800.0,
Hz400 => 400.0,
Hz200 => 200.0,
Hz100 => 100.0,
Hz50 => 50.0,
Hz25 => 25.0,
Hz12_5 => 12.5,
}
}
}
impl Bitfield for GyroOdr {
const BITMASK: u8 = 0b0000_1111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::GYRO_CONFIG0;
fn bits(self) -> u8 {
self as u8
}
}
impl Default for GyroOdr {
fn default() -> Self {
Self::Hz800
}
}
impl TryFrom<u8> for GyroOdr {
type Error = SensorError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
use GyroOdr::*;
match value {
0b0101 => Ok(Hz1600),
0b0110 => Ok(Hz800),
0b0111 => Ok(Hz400),
0b1000 => Ok(Hz200),
0b1001 => Ok(Hz100),
0b1010 => Ok(Hz50),
0b1011 => Ok(Hz25),
0b1100 => Ok(Hz12_5),
_ => Err(SensorError::InvalidDiscriminant),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum SoftReset {
Enabled = 0b0,
_Disabled = 0b1,
}
impl Bitfield for SoftReset {
const BITMASK: u8 = 0b0001_0000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::SIGNAL_PATH_RESET;
fn bits(self) -> u8 {
(self as u8) << 4
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum MClkReady {
Running = 0b0,
NotRunning = 0b1,
}
impl Bitfield for MClkReady {
const BITMASK: u8 = 0b0000_1000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::MCLK_RDY;
fn bits(self) -> u8 {
(self as u8) << 3
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum SpiWireCount {
ThreeWire = 0b0,
FourWire = 0b1,
}
impl Bitfield for SpiWireCount {
const BITMASK: u8 = 0b0000_0100;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DEVICE_CONFIG;
fn bits(self) -> u8 {
(self as u8) << 2
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum SpiMode {
Mode0And3 = 0b0,
Mode1And2 = 0b1,
}
impl Bitfield for SpiMode {
const BITMASK: u8 = 0b0000_0001;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DEVICE_CONFIG;
fn bits(self) -> u8 {
self as u8
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum I3CDdrSlewRate {
M20T40M60 = 0b000,
M12T24M36 = 0b001,
M6T12M19 = 0b010,
M4T8M14 = 0b011,
M2T4M8 = 0b100,
M2 = 0b101,
}
impl Bitfield for I3CDdrSlewRate {
const BITMASK: u8 = 0b0011_1000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DRIVE_CONFIG1;
fn bits(self) -> u8 {
(self as u8) << 3
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum I3CSdrSlewRate {
M20T40M60 = 0b000,
M12T24M36 = 0b001,
M6T12M19 = 0b010,
M4T8M14 = 0b011,
M2T4M8 = 0b100,
M2 = 0b101,
}
impl Bitfield for I3CSdrSlewRate {
const BITMASK: u8 = 0b0000_0111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DRIVE_CONFIG1;
fn bits(self) -> u8 {
self as u8
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum I2CSlewRate {
M20T40M60 = 0b000,
M12T24M36 = 0b001,
M6T12M19 = 0b010,
M4T8M14 = 0b011,
M2T4M8 = 0b100,
M2 = 0b101,
}
impl Bitfield for I2CSlewRate {
const BITMASK: u8 = 0b0011_1000;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DRIVE_CONFIG2;
fn bits(self) -> u8 {
(self as u8) << 3
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum AllSlewRate {
M20T40M60 = 0b000,
M12T24M36 = 0b001,
M6T12M19 = 0b010,
M4T8M14 = 0b011,
M2T4M8 = 0b100,
M2 = 0b101,
}
impl Bitfield for AllSlewRate {
const BITMASK: u8 = 0b0000_0111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DRIVE_CONFIG2;
fn bits(self) -> u8 {
self as u8
}
}
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum SpiSlewRate {
M20T40M60 = 0b000,
M12T24M36 = 0b001,
M6T12M19 = 0b010,
M4T8M14 = 0b011,
M2T4M8 = 0b100,
M2 = 0b101,
}
impl Bitfield for SpiSlewRate {
const BITMASK: u8 = 0b0000_0111;
type Reg = Bank0;
const REGISTER: Self::Reg = Self::Reg::DRIVE_CONFIG2;
fn bits(self) -> u8 {
self as u8
}
}