#![no_std]
pub mod sensor;
use sensor::*;
pub mod register;
use register::*;
pub mod fifo;
use fifo::*;
pub mod config;
use config::*;
pub mod interrupt;
use interrupt::*;
pub mod interface;
use interface::Interface;
const WHOAMI: u8 = 0b10111101;
const TEMP_SCALE: f32 = 480.0;
const TEMP_OFFSET: f32 = 42.5;
const PRESS_SCALE: f32 = 4096.0;
pub struct LPS25HB<T> {
interface: T,
}
impl<T, E> LPS25HB<T>
where
T: Interface<Error = E>,
{
pub fn new(interface: T) -> Self {
LPS25HB { interface }
}
pub fn destroy(self) -> T {
self.interface
}
fn read_register(&mut self, address: Registers) -> Result<u8, T::Error> {
let mut reg_data = [0u8];
self.interface.read(address.addr(), &mut reg_data)?;
Ok(reg_data[0])
}
fn clear_register_bit_flag(&mut self, address: Registers, bitmask: u8) -> Result<(), T::Error> {
let mut reg_data = [0u8];
self.interface.read(address.addr(), &mut reg_data)?;
let payload: u8 = reg_data[0] & !bitmask;
self.interface.write(address.addr(), payload)?;
Ok(())
}
fn set_register_bit_flag(&mut self, address: Registers, bitmask: u8) -> Result<(), T::Error> {
let mut reg_data = [0u8];
self.interface.read(address.addr(), &mut reg_data)?;
let payload: u8 = reg_data[0] | bitmask;
self.interface.write(address.addr(), payload)?;
Ok(())
}
fn is_register_bit_flag_high(
&mut self,
address: Registers,
bitmask: u8,
) -> Result<bool, T::Error> {
let data = self.read_register(address)?;
Ok((data & bitmask) != 0)
}
}
#[derive(Debug, Clone, Copy)]
pub enum ODR {
OneShot = 0b000,
_1Hz = 0b001,
_7Hz = 0b010,
_12_5Hz = 0b011,
_25Hz = 0b100,
}
impl ODR {
pub fn value(self) -> u8 {
(self as u8) << 4 }
}
#[derive(Debug, Clone, Copy)]
pub enum SPI_Mode {
_4wire,
_3wire,
}
#[derive(Debug, Clone, Copy)]
pub enum FIFO_MODE {
Bypass = 0b000,
FIFO = 0b001,
Stream = 0b010,
Stream_to_FIFO = 0b011,
Bypass_to_stream = 0b100,
FIFO_Mean = 0b110,
Bypass_to_FIFO = 0b111,
}
impl FIFO_MODE {
pub fn value(self) -> u8 {
(self as u8) << 5 }
}
#[derive(Debug, Clone, Copy)]
pub enum FIFO_MEAN {
_2sample = 0b00001,
_4sample = 0b00011,
_8sample = 0b00111,
_16sample = 0b01111,
_32sample = 0b11111,
}
impl FIFO_MEAN {
pub fn value(self) -> u8 {
self as u8 }
}
#[derive(Debug, Clone, Copy)]
pub enum INT_DRDY {
DataSignal = 0b00,
P_high = 0b01,
P_low = 0b10,
P_low_or_high = 0b011,
}
impl INT_DRDY {
pub fn value(self) -> u8 {
self as u8 }
}
#[derive(Debug, Clone, Copy)]
pub enum INT_ACTIVE {
High,
Low,
}
#[derive(Debug, Clone, Copy)]
pub enum INT_PIN {
PushPull,
OpenDrain,
}
#[derive(Debug, Clone, Copy)]
pub enum TEMP_RES {
_8 = 0b00,
_16 = 0b01,
_32 = 0b10,
_64 = 0b11,
}
impl TEMP_RES {
pub fn value(self) -> u8 {
(self as u8) << 2 }
}
#[derive(Debug, Clone, Copy)]
pub enum PRESS_RES {
_8 = 0b00,
_32 = 0b01,
_128 = 0b10,
_512 = 0b11,
}
impl PRESS_RES {
pub fn value(self) -> u8 {
self as u8 }
}