use hal::blocking::i2c;
use {register::GStatus, Apds9960, BitFlags, Error, Register};
impl<I2C, E> Apds9960<I2C>
where
I2C: i2c::WriteRead<Error = E>,
{
pub fn read_gesture_data_level(&mut self) -> Result<u8, Error<E>> {
self.read_register(Register::GFLVL)
}
#[allow(clippy::wrong_self_convention)]
pub fn is_gesture_data_valid(&mut self) -> Result<bool, Error<E>> {
let status = self.read_register(Register::GSTATUS)?;
Ok(GStatus::new(status).is(GStatus::GVALID, true))
}
#[allow(clippy::wrong_self_convention)]
pub fn has_gesture_data_overflown(&mut self) -> Result<bool, Error<E>> {
let status = self.read_register(Register::GSTATUS)?;
Ok(GStatus::new(status).is(GStatus::GFOV, true))
}
pub fn read_gesture_data(&mut self, data: &mut [u8]) -> nb::Result<(), Error<E>> {
if !self.is_gesture_data_valid().map_err(nb::Error::Other)? {
return Err(nb::Error::WouldBlock);
}
let level = self.read_gesture_data_level().map_err(nb::Error::Other)?;
let byte_count = core::cmp::min(data.len(), 4 * level as usize);
self.read_data(Register::GFIFO_U, &mut data[..byte_count])
.map_err(nb::Error::Other)?;
Ok(())
}
}