use embedded_hal::blocking::i2c;
pub const PCF8591_DEFAULT_ADDRESS: u8 = 0x48;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum PCFADCNum {
A0,
A1,
A2,
A3,
}
pub struct PCF8591<C: i2c::WriteRead> {
channel: C,
addr: u8,
}
impl<C: i2c::WriteRead> PCF8591<C> {
pub fn new(channel: C, addr: u8) -> PCF8591<C> {
PCF8591 { channel, addr }
}
pub fn read(&mut self, adc: PCFADCNum) -> Result<u8, C::Error> {
self.half_read(adc)?;
self.half_read(adc)
}
fn half_read(&mut self, adc: PCFADCNum) -> Result<u8, C::Error> {
let adc: u8 = match adc {
PCFADCNum::A0 => 0,
PCFADCNum::A1 => 1,
PCFADCNum::A2 => 2,
PCFADCNum::A3 => 3,
};
let command: [u8; 2] = [adc, 0];
let mut buffer: [u8; 2] = [0, 0];
self.channel
.write_read(self.addr, &command[..], &mut buffer[..])?;
Ok(buffer[1])
}
pub fn into_inner(self) -> C {
self.channel
}
}