use core::marker::PhantomData;
use embedded_hal_async::{digital::Wait, i2c::I2c};
use crate::{
person_sensor::{ContinuousCaptureMode, PersonSensorMode, StandbyMode},
PersonSensor,
};
pub struct PersonSensorBuilder<I2C, INT, MODE> {
i2c: I2C,
interrupt: INT,
mode: PhantomData<MODE>,
}
impl<I2C> PersonSensorBuilder<I2C, (), ()>
where
I2C: I2c,
{
pub fn new_standby(i2c: I2C) -> PersonSensorBuilder<I2C, (), StandbyMode> {
PersonSensorBuilder {
i2c,
interrupt: (),
mode: PhantomData,
}
}
pub fn new_continuous(i2c: I2C) -> PersonSensorBuilder<I2C, (), ContinuousCaptureMode> {
PersonSensorBuilder {
i2c,
interrupt: (),
mode: PhantomData,
}
}
}
impl<I2C, MODE> PersonSensorBuilder<I2C, (), MODE>
where
I2C: I2c,
{
pub fn with_interrupt<INT: Wait>(self, interrupt: INT) -> PersonSensorBuilder<I2C, INT, MODE> {
PersonSensorBuilder {
i2c: self.i2c,
interrupt,
mode: self.mode,
}
}
}
impl<I2C, INT> PersonSensorBuilder<I2C, INT, ContinuousCaptureMode>
where
I2C: I2c,
{
pub async fn build(self) -> Result<PersonSensor<I2C, INT, ContinuousCaptureMode>, I2C::Error> {
let mut sensor = PersonSensor {
i2c: self.i2c,
interrupt: self.interrupt,
mode: PhantomData,
};
sensor.set_mode(PersonSensorMode::Continuous).await?;
Ok(sensor)
}
}
impl<I2C, INT> PersonSensorBuilder<I2C, INT, StandbyMode>
where
I2C: I2c,
{
pub async fn build(self) -> Result<PersonSensor<I2C, INT, StandbyMode>, I2C::Error> {
let mut sensor = PersonSensor {
i2c: self.i2c,
interrupt: self.interrupt,
mode: PhantomData,
};
sensor.set_mode(PersonSensorMode::Standby).await?;
Ok(sensor)
}
}