use embedded_hal::i2c::I2c;
use embedded_hal::i2c::SevenBitAddress;
use crate::{device::AFE4404, errors::AfeError, modes::LedMode, register_structs::R00h};
pub use configuration::{DynamicConfiguration, State};
mod configuration;
impl<I2C, MODE> AFE4404<I2C, MODE>
where
I2C: I2c<SevenBitAddress>,
MODE: LedMode,
{
pub fn sw_reset(&mut self) -> Result<(), AfeError<I2C::Error>> {
self.registers.r00h.write(R00h::new().with_sw_reset(true))?;
Ok(())
}
pub fn sw_power_down(&mut self) -> Result<(), AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
self.registers.r23h.write(r23h_prev.with_pdnafe(true))?;
Ok(())
}
pub fn sw_power_up(&mut self) -> Result<(), AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
self.registers.r23h.write(r23h_prev.with_pdnafe(false))?;
Ok(())
}
pub fn sw_power_down_rx(&mut self) -> Result<(), AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
self.registers.r23h.write(r23h_prev.with_pdnrx(true))?;
Ok(())
}
pub fn sw_power_up_rx(&mut self) -> Result<(), AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
self.registers.r23h.write(r23h_prev.with_pdnrx(false))?;
Ok(())
}
pub fn set_dynamic(
&mut self,
configuration: &DynamicConfiguration,
) -> Result<DynamicConfiguration, AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
self.registers.r23h.write(
r23h_prev
.with_dynamic1(configuration.transmitter.into())
.with_dynamic2(configuration.adc.into())
.with_dynamic3(configuration.tia.into())
.with_dynamic4(configuration.rest_of_adc.into()),
)?;
Ok(*configuration)
}
pub fn get_dynamic(&mut self) -> Result<DynamicConfiguration, AfeError<I2C::Error>> {
let r23h_prev = self.registers.r23h.read()?;
Ok(DynamicConfiguration {
transmitter: r23h_prev.dynamic1().into(),
adc: r23h_prev.dynamic2().into(),
tia: r23h_prev.dynamic3().into(),
rest_of_adc: r23h_prev.dynamic4().into(),
})
}
pub fn set_photodiode(&mut self, state: State) -> Result<State, AfeError<I2C::Error>> {
let r31h_prev = self.registers.r31h.read()?;
self.registers
.r31h
.write(r31h_prev.with_pd_disconnect(state.into()))?;
Ok(state)
}
pub fn get_photodiode(&mut self) -> Result<State, AfeError<I2C::Error>> {
let r31h_prev = self.registers.r31h.read()?;
Ok(r31h_prev.pd_disconnect().into())
}
}