#![no_std]
pub mod sensor;
use sensor::*;
pub mod config;
use config::*;
pub mod fifo;
use fifo::*;
pub mod interrupt;
use interrupt::*;
pub mod register;
use register::*;
pub mod interface;
use interface::Interface;
const WHOAMI: u8 = 0b10110001;
const TEMP_SCALE: f32 = 100.0;
const PRESS_SCALE: f32 = 4096.0;
pub struct LPS22HB<T> {
interface: T,
}
impl<T, E> LPS22HB<T>
where
T: Interface<Error = E>,
{
pub fn new(interface: T) -> Self {
LPS22HB { 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; 1];
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; 1];
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 {
PowerDown = 0b000,
_1Hz = 0b001,
_10Hz = 0b010,
_25Hz = 0b011,
_50Hz = 0b100,
_75Hz = 0b101,
}
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,
Dynamic_Stream = 0b110,
Bypass_to_FIFO = 0b111,
}
impl FIFO_MODE {
pub fn value(self) -> u8 {
(self as u8) << 5 }
}
#[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,
}