mcp4725_async/
types.rs

1#[cfg(feature = "defmt-03")]
2use defmt_03 as defmt;
3
4#[derive(Copy, Clone, Debug, Eq, PartialEq)]
5#[cfg_attr(feature = "defmt-03", derive(defmt::Format))]
6#[repr(u8)]
7/// Power down modes
8pub enum PowerDownMode {
9    /// Normal mode
10    Normal = 0b00,
11    /// 1k ohm resistor to ground
12    OneK = 0b01,
13    /// 100k ohm resistor to ground
14    OneHundredK = 0b10,
15    /// 500k ohm resistor to ground
16    FiveHundredK = 0b11,
17}
18
19#[derive(Copy, Clone, Debug)]
20#[cfg_attr(feature = "defmt-03", derive(defmt::Format))]
21/// The DAC register status
22pub struct RegisterStatus {
23    /// Data registers
24    data: u8,
25    /// DAC value
26    dac: u16,
27}
28
29impl RegisterStatus {
30    pub(crate) fn new(data: [u8; 3]) -> Self {
31        let dac = u16::from_be_bytes([data[1], data[2]]);
32        Self {
33            data: data[0],
34            dac: dac >> 4,
35        }
36    }
37    
38    /// Get the raw read data
39    #[inline(always)]
40    pub fn read_data(&self) -> u8 {
41        self.data
42    }
43
44    /// Is the EEPROM ready? Returns:
45    /// * `true` if the previous EEPROM write has completed and it is ready for a new write
46    /// * `false` if the previous EEPROM write has not completed and it is not ready for a new write
47    #[inline(always)]
48    pub fn eeprom_ready(&self) -> bool {
49        self.data & 0b1000_0000 != 0
50    }
51
52    /// Get the power on reset state
53    #[inline(always)]
54    pub fn por(&self) -> bool {
55        self.data & 0b0100_0000 != 0
56    }
57
58    /// Get the power down mode
59    #[inline(always)]
60    pub fn power_down_mode(&self) -> PowerDownMode {
61        match (self.data & 0b0000_0110) >> 1 {
62            0b00 => PowerDownMode::Normal,
63            0b01 => PowerDownMode::OneK,
64            0b10 => PowerDownMode::OneHundredK,
65            0b11 => PowerDownMode::FiveHundredK,
66            _ => unreachable!(), // Should never happen, since we've taken care of all 4 bit patterns
67        }
68    }
69
70    /// Get the DAC value
71    #[inline(always)]
72    pub fn dac(&self) -> u16 {
73        self.dac
74    }
75}
76
77#[derive(Copy, Clone, Debug)]
78#[cfg_attr(feature = "defmt-03", derive(defmt::Format))]
79/// The EEPROM status
80pub struct EEPROMStatus {
81    power_down_mode: PowerDownMode,
82    dac: u16,
83}
84
85impl EEPROMStatus {
86    pub(crate) fn new(data: [u8; 2]) -> Self {
87        let power_down_mode = match (data[0] & 0b0110_0000) >> 5 {
88            0b00 => PowerDownMode::Normal,
89            0b01 => PowerDownMode::OneK,
90            0b10 => PowerDownMode::OneHundredK,
91            0b11 => PowerDownMode::FiveHundredK,
92            _ => unreachable!(), // Should never happen, since we've taken care of all 4 bit patterns
93        };
94        let dac = u16::from_be_bytes(data) & 0xFFF;
95        
96        Self { power_down_mode, dac }
97    }
98
99    /// Get the power down mode
100    #[inline(always)]
101    pub fn power_down_mode(&self) -> PowerDownMode {
102        self.power_down_mode
103    }
104    
105    /// Get the DAC value
106    #[inline(always)]
107    pub fn dac(&self) -> u16 {
108        self.dac
109    }
110}