use crate::error::SensorError;
pub(crate) trait Bitfield {
const BITMASK: u8;
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;
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;
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;
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;
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 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;
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),
}
}
}