use core::marker::PhantomData;
#[derive(Debug)]
pub enum Error<E> {
I2C(E),
InvalidInputData,
}
pub enum ModeChangeError<E, DEV> {
I2C(E, DEV),
}
pub mod mode {
pub struct OneShot(());
pub struct Continuous(());
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum DataRate12Bit {
Sps128,
Sps250,
Sps490,
Sps920,
#[default]
Sps1600,
Sps2400,
Sps3300,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum DataRate16Bit {
Sps8,
Sps16,
Sps32,
Sps64,
#[default]
Sps128,
Sps250,
Sps475,
Sps860,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum ComparatorMode {
#[default]
Traditional,
Window,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum ComparatorPolarity {
#[default]
ActiveLow,
ActiveHigh,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum ComparatorLatching {
#[default]
Nonlatching,
Latching,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum ComparatorQueue {
One,
Two,
#[default]
Four,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
#[allow(non_camel_case_types)]
pub enum FullScaleRange {
Within6_144V,
Within4_096V,
#[default]
Within2_048V,
Within1_024V,
Within0_512V,
Within0_256V,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub enum TargetAddr {
#[default]
Gnd,
Vdd,
Sda,
Scl,
}
impl TargetAddr {
pub(crate) const fn bits(self) -> u8 {
match self {
Self::Gnd => 0b1001000,
Self::Vdd => 0b1001001,
Self::Sda => 0b1001010,
Self::Scl => 0b1001011,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct Config {
pub(crate) bits: u16,
}
impl Config {
pub(crate) fn is_high(&self, mask: u16) -> bool {
(self.bits & mask) != 0
}
pub(crate) fn with_high(&self, mask: u16) -> Self {
Config {
bits: self.bits | mask,
}
}
pub(crate) fn with_low(&self, mask: u16) -> Self {
Config {
bits: self.bits & !mask,
}
}
}
impl Default for Config {
fn default() -> Self {
Config { bits: 0x8583 }
}
}
#[derive(Debug, Default)]
pub struct Ads1x1x<I2C, IC, CONV, MODE> {
pub(crate) i2c: I2C,
pub(crate) address: u8,
pub(crate) config: Config,
pub(crate) fsr: FullScaleRange,
pub(crate) a_conversion_was_started: bool,
pub(crate) _conv: PhantomData<CONV>,
pub(crate) _ic: PhantomData<IC>,
pub(crate) _mode: PhantomData<MODE>,
}
#[cfg(test)]
mod tests {
use crate::{FullScaleRange, TargetAddr};
#[test]
fn target_addr_default() {
assert_eq!(0b100_1000, TargetAddr::default().bits());
}
#[test]
fn target_addr_bits() {
assert_eq!(0b100_1000, TargetAddr::Gnd.bits());
assert_eq!(0b100_1001, TargetAddr::Vdd.bits());
assert_eq!(0b100_1010, TargetAddr::Sda.bits());
assert_eq!(0b100_1011, TargetAddr::Scl.bits());
}
#[test]
fn default_full_scale_range() {
assert_eq!(FullScaleRange::Within2_048V, FullScaleRange::default());
}
}