use anyhow::{Context, Result};
use rppal::i2c::I2c;
use crate::{pin::PinType, utils::init_i2c};
#[derive(Debug)]
pub struct ADC {
reg: u8,
bus: I2c,
}
impl ADC {
pub fn new(adc_pin: PinType) -> Result<Self> {
let channel = 7 - adc_pin.adc_channel();
let reg = channel | 16;
let bus = init_i2c().context("I2C INIT FAILED")?;
let adc = Self { reg, bus };
Ok(adc)
}
pub fn read_value(&mut self) -> Result<u16> {
self.bus
.smbus_write_word(self.reg, 0)
.context("ADC READ INIT FAILED")?;
let value_h = self
.bus
.smbus_read_byte(self.reg)
.context("ADC READ (MSByte) FAILED")? as u16;
let value_l = self
.bus
.smbus_read_byte(self.reg)
.context("ADC READ (LSByte) FAILED")? as u16;
let value = ((value_h) << 8) + value_l;
Ok(value)
}
pub fn read_voltage(&mut self) -> Result<f32> {
let value = self.read_value()?;
let value = (value as f32) * 3.3 / 4095.0;
Ok(value)
}
}