use crate::register::Stat;
#[allow(non_camel_case_types)]
#[derive(Clone, Copy)]
pub(crate) struct u24([u8; 3]);
impl u24 {
pub(crate) const fn from_be_bytes(bytes: [u8; 3]) -> Self {
Self(bytes)
}
}
impl From<u24> for u32 {
fn from(n: u24) -> Self {
let [b2, b1, b0] = n.0;
Self::from_be_bytes([0, b2, b1, b0])
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConversionRate {
Hz0_95 = 0b0000,
Hz1_9 = 0b0001,
Hz3_9 = 0b0010,
Hz7_8 = 0b0011,
Hz15_6 = 0b0100,
Hz31_25 = 0b0101,
Hz62_5 = 0b0110,
Hz125 = 0b0111,
Hz250 = 0b1000,
Hz500 = 0b1001,
Hz1000 = 0b1010,
Hz2000 = 0b1011,
Hz4000 = 0b1100,
Hz8000 = 0b1101,
Hz16000 = 0b1110,
Hz32000 = 0b1111,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Format {
OffsetBinary,
TwosComplement,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ClockSource {
External,
Internal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Pga {
X1,
X2,
X4,
X8,
X16,
X32,
X64,
X128,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Status {
pub(crate) status: Stat,
}
impl Status {
pub const fn data_ready(&self) -> bool {
self.status.contains(Stat::RDY)
}
pub const fn modulator_busy(&self) -> bool {
self.status.contains(Stat::MSTAT)
}
pub const fn data_overrange(&self) -> bool {
self.status.contains(Stat::DOR)
}
pub const fn system_gain_overrange(&self) -> bool {
self.status.contains(Stat::DOR)
}
pub const fn data_rate(&self) -> ConversionRate {
self.status.rate()
}
pub const fn analog_overrange(&self) -> bool {
self.status.contains(Stat::AOR)
}
pub const fn data_read_error(&self) -> bool {
self.status.contains(Stat::RDERR)
}
pub const fn state(&self) -> State {
match self.status.intersection(Stat::PDSTAT).bits() >> 10 {
0b00 => State::Conversion,
0b01 => State::PowerDown,
0b10 => State::Standby,
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum State {
Conversion,
PowerDown,
Standby,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Calibration {
SelfCalibration,
SystemOffsetCalibration,
SystemFullScaleCalibration,
}