104 lines
2.5 KiB
Rust
104 lines
2.5 KiB
Rust
//! Linear acceleration sensor control register 1 (r/w).
|
|
|
|
#![allow(non_camel_case_types)]
|
|
|
|
use crate::lsm6ds3tr::{RegisterAddress, RegisterBits, RegisterConfig, RegisterValue};
|
|
|
|
/// Linear acceleration sensor control register 1 (r/w).
|
|
#[derive(Default)]
|
|
pub struct Ctrl1Xl {
|
|
/// Output data rate and power mode selection. Default value: 0000 (see Table 52).
|
|
pub sample_rate: AccelSampleRate,
|
|
/// Accelerometer full-scale selection. Default value: 00.
|
|
/// (00: ±2 g; 01: ±16 g; 10: ±4 g; 11: ±8 g)
|
|
pub scale: AccelScale,
|
|
/// Accelerometer digital LPF (LPF1) bandwidth selection. For bandwidth selection refer to CTRL8_XL (17h).
|
|
pub low_pass_filter: RegisterBits<1, 6>, // TODO
|
|
/// Accelerometer analog chain bandwidth selection (only for accelerometer ODR ≥ 1.67 kHz).
|
|
/// (0: BW @ 1.5 kHz; 1: BW @ 400 Hz)
|
|
pub analog_chain_bandwidth: RegisterBits<1, 7>, // TODO
|
|
}
|
|
|
|
impl Ctrl1Xl {
|
|
pub fn address(&self) -> u8 {
|
|
RegisterAddress::CTRL1_XL.address()
|
|
}
|
|
|
|
pub fn value(&self) -> u8 {
|
|
self.sample_rate.shifted()
|
|
| self.scale.shifted()
|
|
| self.low_pass_filter.shifted()
|
|
| self.analog_chain_bandwidth.shifted()
|
|
}
|
|
|
|
pub fn config(&self) -> RegisterConfig {
|
|
RegisterConfig {
|
|
address: self.address(),
|
|
value: self.value(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Default, Clone, Copy)]
|
|
pub enum AccelScale {
|
|
#[default]
|
|
_2G = 0b00,
|
|
_16G = 0b01,
|
|
_4G = 0b10,
|
|
_8G = 0b11,
|
|
}
|
|
|
|
impl AccelScale {
|
|
pub fn sensitivity(self) -> f32 {
|
|
use AccelScale::*;
|
|
match self {
|
|
_2G => 0.000_061,
|
|
_4G => 0.000_122,
|
|
_8G => 0.000_244,
|
|
_16G => 0.000_488,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl RegisterValue for AccelScale {
|
|
fn shifted(&self) -> u8 {
|
|
(*self as u8) << 2
|
|
}
|
|
}
|
|
|
|
#[derive(Default, Clone, Copy)]
|
|
pub enum AccelSampleRate {
|
|
/// Power Down (disabled)
|
|
#[default]
|
|
PowerDown = 0b0000,
|
|
/// 12.5 Hz
|
|
_12_5Hz = 0b0001,
|
|
/// 26 Hz
|
|
_26Hz = 0b0010,
|
|
/// 52 Hz
|
|
_52Hz = 0b0011,
|
|
/// 104 Hz
|
|
_104Hz = 0b0100,
|
|
/// 208 Hz
|
|
_208Hz = 0b0101,
|
|
/// 416 Hz
|
|
_416Hz = 0b0110,
|
|
/// 833 Hz
|
|
_833Hz = 0b0111,
|
|
/// 1.66 kHz
|
|
_1660Hz = 0b1000,
|
|
/// 3.33 kHz
|
|
_3330Hz = 0b1001,
|
|
/// 6.66 kHz
|
|
_6660Hz = 0b1010,
|
|
/// 1.6 Hz in low power mode; 12.5 Hz in high performance mode
|
|
_1_6Hz_LP_or_12_5Hz_HP = 0b1011,
|
|
// Not allowed = [0b1100..0b1111]
|
|
}
|
|
|
|
impl RegisterValue for AccelSampleRate {
|
|
fn shifted(&self) -> u8 {
|
|
(*self as u8) << 4
|
|
}
|
|
}
|