use crate::{
BitFlags, Error, Register, RgbCGain, RgbCInterruptPersistence, Tcs3472, DEVICE_ADDRESS,
};
#[cfg(not(feature = "async"))]
use embedded_hal::i2c::I2c;
#[cfg(feature = "async")]
use embedded_hal_async::i2c::I2c as AsyncI2c;
#[maybe_async_cfg::maybe(
sync(
cfg(not(feature = "async")),
self = "Tcs3472",
idents(AsyncI2c(sync = "I2c"))
),
async(feature = "async", keep_self)
)]
impl<I2C, E> Tcs3472<I2C>
where
I2C: AsyncI2c<Error = E>,
{
pub async fn enable(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable | BitFlags::POWER_ON).await
}
pub async fn disable(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable & !BitFlags::POWER_ON).await
}
pub async fn enable_rgbc(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable | BitFlags::RGBC_EN).await
}
pub async fn disable_rgbc(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable & !BitFlags::RGBC_EN).await
}
pub async fn enable_rgbc_interrupts(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable | BitFlags::RGBC_INT_EN).await
}
pub async fn disable_rgbc_interrupts(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable & !BitFlags::RGBC_INT_EN).await
}
pub async fn enable_wait(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable | BitFlags::WAIT_EN).await
}
pub async fn disable_wait(&mut self) -> Result<(), Error<E>> {
let enable = self.enable;
self.write_enable(enable & !BitFlags::WAIT_EN).await
}
async fn write_enable(&mut self, enable: u8) -> Result<(), Error<E>> {
self.write_register(Register::ENABLE, enable).await?;
self.enable = enable;
Ok(())
}
pub async fn set_wait_cycles(&mut self, cycles: u16) -> Result<(), Error<E>> {
if cycles > 256 || cycles == 0 {
return Err(Error::InvalidInputData);
}
self.write_register(Register::WTIME, (256_u16 - cycles) as u8)
.await
}
pub async fn enable_wait_long(&mut self) -> Result<(), Error<E>> {
self.write_register(Register::CONFIG, BitFlags::WLONG).await
}
pub async fn disable_wait_long(&mut self) -> Result<(), Error<E>> {
self.write_register(Register::CONFIG, 0).await
}
pub async fn set_rgbc_gain(&mut self, gain: RgbCGain) -> Result<(), Error<E>> {
match gain {
RgbCGain::_1x => self.write_register(Register::CONTROL, 0).await,
RgbCGain::_4x => self.write_register(Register::CONTROL, 1).await,
RgbCGain::_16x => self.write_register(Register::CONTROL, 2).await,
RgbCGain::_60x => self.write_register(Register::CONTROL, 3).await,
}
}
pub async fn set_integration_cycles(&mut self, cycles: u16) -> Result<(), Error<E>> {
if cycles > 256 || cycles == 0 {
return Err(Error::InvalidInputData);
}
self.write_register(Register::ATIME, (256_u16 - cycles) as u8)
.await
}
pub async fn set_rgbc_interrupt_low_threshold(
&mut self,
threshold: u16,
) -> Result<(), Error<E>> {
self.write_registers(Register::AILTL, threshold as u8, (threshold >> 8) as u8)
.await
}
pub async fn set_rgbc_interrupt_high_threshold(
&mut self,
threshold: u16,
) -> Result<(), Error<E>> {
self.write_registers(Register::AIHTL, threshold as u8, (threshold >> 8) as u8)
.await
}
pub async fn set_rgbc_interrupt_persistence(
&mut self,
persistence: RgbCInterruptPersistence,
) -> Result<(), Error<I2C::Error>> {
use crate::RgbCInterruptPersistence as IP;
match persistence {
IP::Every => self.write_register(Register::APERS, 0).await,
IP::_1 => self.write_register(Register::APERS, 1).await,
IP::_2 => self.write_register(Register::APERS, 2).await,
IP::_3 => self.write_register(Register::APERS, 3).await,
IP::_5 => self.write_register(Register::APERS, 4).await,
IP::_10 => self.write_register(Register::APERS, 5).await,
IP::_15 => self.write_register(Register::APERS, 6).await,
IP::_20 => self.write_register(Register::APERS, 7).await,
IP::_25 => self.write_register(Register::APERS, 8).await,
IP::_30 => self.write_register(Register::APERS, 9).await,
IP::_35 => self.write_register(Register::APERS, 10).await,
IP::_40 => self.write_register(Register::APERS, 11).await,
IP::_45 => self.write_register(Register::APERS, 12).await,
IP::_50 => self.write_register(Register::APERS, 13).await,
IP::_55 => self.write_register(Register::APERS, 14).await,
IP::_60 => self.write_register(Register::APERS, 15).await,
}
}
async fn write_register(&mut self, register: u8, value: u8) -> Result<(), Error<E>> {
let command = BitFlags::CMD | register;
self.i2c
.write(DEVICE_ADDRESS, &[command, value])
.await
.map_err(Error::I2C)
}
async fn write_registers(
&mut self,
register: u8,
value0: u8,
value1: u8,
) -> Result<(), Error<E>> {
let command = BitFlags::CMD | BitFlags::CMD_AUTO_INC | register;
self.i2c
.write(DEVICE_ADDRESS, &[command, value0, value1])
.await
.map_err(Error::I2C)
}
}