use crate::async_impl::interface::{AsyncImplError, InterfaceAsync};
use crate::core::nunchuk::*;
use crate::core::ControllerType;
use embedded_hal_async;
pub struct Nunchuk<I2C, Delay> {
interface: InterfaceAsync<I2C, Delay>,
calibration: CalibrationData,
}
impl<I2C, Delay> Nunchuk<I2C, Delay>
where
I2C: embedded_hal_async::i2c::I2c,
Delay: embedded_hal_async::delay::DelayNs,
{
pub fn new(i2cdev: I2C, delay: Delay) -> Self {
let interface = InterfaceAsync::new(i2cdev, delay);
Self {
interface,
calibration: CalibrationData::default(),
}
}
pub fn destroy(self) -> (I2C, Delay) {
self.interface.destroy()
}
pub async fn update_calibration(&mut self) -> Result<(), AsyncImplError> {
let data = self.read_report().await?;
self.calibration = CalibrationData {
joystick_x: data.joystick_x,
joystick_y: data.joystick_y,
};
Ok(())
}
pub async fn init(&mut self) -> Result<(), AsyncImplError> {
self.interface.init().await?;
self.update_calibration().await?;
Ok(())
}
async fn read_report(&mut self) -> Result<NunchukReading, AsyncImplError> {
let buf = self.interface.read_ext_report().await?;
NunchukReading::from_data(&buf).ok_or(AsyncImplError::InvalidInputData)
}
pub async fn read(&mut self) -> Result<NunchukReadingCalibrated, AsyncImplError> {
Ok(NunchukReadingCalibrated::new(
self.read_report().await?,
&self.calibration,
))
}
pub async fn identify_controller(&mut self) -> Result<Option<ControllerType>, AsyncImplError> {
self.interface.identify_controller().await
}
}