#![no_std]
pub mod device;
mod interface;
mod registers;
pub use registers::Register;
mod types;
pub use types::{
AverageNum, AxisEnableDisable, Bandwidth, CtrlUser, DataRate, Error, I2cWdtEnable,
I2cWdtSelect, InterruptDrive, InterruptEnableDisable, InterruptLatch, InterruptMap,
InterruptPolarity, MagCompensation, PerformanceMode, PowerMode, SelfTestMode, Sensor3DData,
Sensor3DDataScaled,
};
mod sensor_data;
pub use sensor_data::*;
pub struct Bmm350<DI, D> {
iface: DI,
delay: D,
mag_range: f32,
var_id: u8,
mag_comp: MagCompensation,
}
#[derive(Debug, Clone, Copy)]
pub struct MagConfig {
pub odr: DataRate,
pub performance: PerformanceMode,
pub bw: Bandwidth,
pub mode: PowerMode,
}
impl MagConfig {
pub fn builder() -> MagConfigBuilder {
MagConfigBuilder::default()
}
}
#[derive(Debug, Clone, Copy)]
pub struct MagConfigBuilder {
odr: Option<DataRate>,
performance: Option<PerformanceMode>,
bw: Option<Bandwidth>,
mode: Option<PowerMode>,
}
impl Default for MagConfigBuilder {
fn default() -> Self {
Self {
odr: None,
performance: None,
bw: None,
mode: None,
}
}
}
impl MagConfigBuilder {
pub fn odr(mut self, odr: DataRate) -> Self {
self.odr = Some(odr);
self
}
pub fn performance(mut self, performance: PerformanceMode) -> Self {
self.performance = Some(performance);
self
}
pub fn bw(mut self, bw: Bandwidth) -> Self {
self.bw = Some(bw);
self
}
pub fn mode(mut self, mode: PowerMode) -> Self {
self.mode = Some(mode);
self
}
pub fn build(self) -> MagConfig {
MagConfig {
odr: self.odr.unwrap_or(DataRate::ODR100Hz),
performance: self.performance.unwrap_or(PerformanceMode::Regular),
bw: self.bw.unwrap_or(Bandwidth::Normal),
mode: self.mode.unwrap_or(PowerMode::Normal),
}
}
}
impl From<MagConfig> for u16 {
fn from(config: MagConfig) -> Self {
(config.odr as u16 & 0x0F)
| ((config.performance as u16 & 0x03) << 4)
| ((config.bw as u16 & 0x01) << 7)
| ((config.mode as u16 & 0x07) << 12)
}
}