max170xx/
max17043_44.rs

1use crate::{Command, Error, Register, ADDR};
2use embedded_hal::i2c;
3
4impl_common!(Max17043);
5impl_common!(Max17044);
6
7macro_rules! impl_common_4x {
8    ($ic:ident) => {
9        impl<I2C, E> $ic<I2C>
10        where
11            I2C: i2c::I2c<Error = E>,
12        {
13            /// Get state of charge of the cell as calculated by the ModelGauge
14            /// algorithm as a percentage.
15            pub fn soc(&mut self) -> Result<f32, Error<E>> {
16                let soc = self.read_register(Register::SOC)?;
17                Ok(f32::from((soc & 0xFF00) >> 8) + f32::from(soc & 0xFF) / 256.0)
18            }
19
20            /// Software reset
21            pub fn reset(&mut self) -> Result<(), Error<E>> {
22                self.write_register(Register::COMMAND, Command::POR_43_44)
23            }
24        }
25    };
26}
27impl_common_4x!(Max17043);
28impl_common_4x!(Max17044);
29
30impl<I2C, E> Max17043<I2C>
31where
32    I2C: i2c::I2c<Error = E>,
33{
34    /// Get battery voltage
35    pub fn voltage(&mut self) -> Result<f32, Error<E>> {
36        let vcell = self.read_register(Register::VCELL)?;
37        Ok(f32::from(vcell >> 4) / 800.0)
38    }
39}
40
41impl<I2C, E> Max17044<I2C>
42where
43    I2C: i2c::I2c<Error = E>,
44{
45    /// Get battery voltage
46    pub fn voltage(&mut self) -> Result<f32, Error<E>> {
47        let vcell = self.read_register(Register::VCELL)?;
48        Ok(f32::from(vcell >> 4) / 400.0)
49    }
50}