use core::default::Default;
use core::marker::PhantomData;
use super::types;
#[derive(Copy, Clone, Debug)]
pub enum GyroTempDataRate {
FChoice0, FChoice1, DlpfConf(Dlpf),
}
impl Default for GyroTempDataRate {
fn default() -> Self {
GyroTempDataRate::DlpfConf(Dlpf::default())
}
}
impl GyroTempDataRate {
pub(crate) fn fchoice_b_bits(&self) -> u8 {
match self {
GyroTempDataRate::FChoice0 => 0b01,
GyroTempDataRate::FChoice1 => 0b10,
GyroTempDataRate::DlpfConf(_) => 0b00,
}
}
pub(crate) fn dlpf_bits(&self) -> u8 {
match self {
GyroTempDataRate::FChoice0 => 0b000,
GyroTempDataRate::FChoice1 => 0b000,
GyroTempDataRate::DlpfConf(dlpf) => *dlpf as u8,
}
}
}
#[derive(Copy, Clone, Debug)]
pub enum AccelDataRate {
FChoice0, DlpfConf(Dlpf),
}
impl Default for AccelDataRate {
fn default() -> Self {
AccelDataRate::DlpfConf(Dlpf::default())
}
}
impl AccelDataRate {
pub(crate) fn accel_config_bits(&self) -> u8 {
match self {
AccelDataRate::FChoice0 => 0b00010000,
AccelDataRate::DlpfConf(dlpf) => 0b00000000 | (*dlpf as u8),
}
}
}
#[derive(Copy, Clone, Debug)]
pub enum Dlpf {
_0 = 0,
_1 = 1,
_2 = 2,
_3 = 3,
_4 = 4,
_5 = 5,
_6 = 6,
_7 = 7,
}
impl Default for Dlpf {
fn default() -> Self {
Dlpf::_0
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug)]
pub enum GyroScale {
_250DPS = 0,
_500DPS,
_1000DPS,
_2000DPS,
}
impl GyroScale {
pub(crate) fn resolution(&self) -> f32 {
match self {
GyroScale::_250DPS => 250.0 / 32768.0,
GyroScale::_500DPS => 500.0 / 32768.0,
GyroScale::_1000DPS => 1000.0 / 32768.0,
GyroScale::_2000DPS => 2000.0 / 32768.0,
}
}
}
impl Default for GyroScale {
fn default() -> Self {
GyroScale::_250DPS
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug)]
pub enum AccelScale {
_2G = 0,
_4G,
_8G,
_16G,
}
impl AccelScale {
pub(crate) fn resolution(&self) -> f32 {
match self {
AccelScale::_2G => 2.0 / 32768.0,
AccelScale::_4G => 4.0 / 32768.0,
AccelScale::_8G => 8.0 / 32768.0,
AccelScale::_16G => 16.0 / 32768.0,
}
}
}
impl Default for AccelScale {
fn default() -> Self {
AccelScale::_2G
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug)]
pub enum MagScale {
_14BITS = 0,
_16BITS,
}
impl MagScale {
pub(crate) fn resolution(&self) -> f32 {
match self {
MagScale::_14BITS => 10. * 4912. / 8190.,
MagScale::_16BITS => 10. * 4912. / 32760.0,
}
}
}
impl Default for MagScale {
fn default() -> Self {
MagScale::_14BITS
}
}
#[derive(Copy, Clone, Debug)]
pub struct MpuConfig<MODE> {
pub(crate) gyro_scale: Option<GyroScale>,
pub(crate) accel_scale: Option<AccelScale>,
pub(crate) mag_scale: Option<MagScale>,
pub(crate) accel_data_rate: Option<AccelDataRate>,
pub(crate) gyro_temp_data_rate: Option<GyroTempDataRate>,
pub(crate) sample_rate_divisor: Option<u8>,
_mode: PhantomData<MODE>,
}
impl MpuConfig<types::Imu> {
pub fn imu() -> Self {
MpuConfig { gyro_scale: None,
accel_scale: None,
mag_scale: None,
accel_data_rate: None,
gyro_temp_data_rate: None,
sample_rate_divisor: None,
_mode: PhantomData }
}
}
impl MpuConfig<types::Marg> {
pub fn marg() -> Self {
MpuConfig { gyro_scale: None,
accel_scale: None,
mag_scale: None,
accel_data_rate: None,
gyro_temp_data_rate: None,
sample_rate_divisor: None,
_mode: PhantomData }
}
}
impl<MODE> MpuConfig<MODE> {
pub fn gyro_scale(&mut self, scale: GyroScale) -> &mut Self {
self.gyro_scale = Some(scale);
self
}
pub fn accel_scale(&mut self, scale: AccelScale) -> &mut Self {
self.accel_scale = Some(scale);
self
}
pub fn accel_data_rate(&mut self, data_rate: AccelDataRate) -> &mut Self {
self.accel_data_rate = Some(data_rate);
self
}
pub fn gyro_temp_data_rate(&mut self,
data_rate: GyroTempDataRate)
-> &mut Self {
self.gyro_temp_data_rate = Some(data_rate);
self
}
pub fn sample_rate_divisor(&mut self, smplrt_div: u8) -> &mut Self {
self.sample_rate_divisor = Some(smplrt_div);
self
}
}
impl MpuConfig<types::Marg> {
pub fn mag_scale(&mut self, scale: MagScale) -> &mut Self {
self.mag_scale = Some(scale);
self
}
}
bitflags! {
#[allow(non_camel_case_types)]
pub struct InterruptEnable: u8 {
const WOM_EN = 0b0100_0000;
const FIFO_OVERFLOW_EN = 0b0001_0000;
const FSYNC_INT_EN = 0b0000_1000;
const RAW_RDY_EN = 0b0000_0001;
}
}