use uom::si::{f32::Time, time::microsecond};
use crate::modes::{LedMode, ThreeLedsMode, TwoLedsMode};
#[derive(Copy, Clone, Debug)]
pub struct MeasurementWindowConfiguration<MODE: LedMode> {
period: Time,
active_timing_configuration: ActiveTiming<MODE>,
inactive_timing_configuration: PowerDownTiming,
}
impl<MODE> MeasurementWindowConfiguration<MODE>
where
MODE: LedMode,
{
pub fn new(
period: Time,
active_timing_configuration: ActiveTiming<MODE>,
inactive_timing_configuration: PowerDownTiming,
) -> MeasurementWindowConfiguration<MODE> {
MeasurementWindowConfiguration {
period,
active_timing_configuration,
inactive_timing_configuration,
}
}
pub fn period(&self) -> &Time {
&self.period
}
pub fn active_timing_configuration(&self) -> &ActiveTiming<MODE> {
&self.active_timing_configuration
}
pub fn inactive_timing_configuration(&self) -> &PowerDownTiming {
&self.inactive_timing_configuration
}
pub fn period_mut(&mut self) -> &mut Time {
&mut self.period
}
pub fn active_timing_configuration_mut(&mut self) -> &mut ActiveTiming<MODE> {
&mut self.active_timing_configuration
}
pub fn inactive_timing_configuration_mut(&mut self) -> &mut PowerDownTiming {
&mut self.inactive_timing_configuration
}
}
#[derive(Copy, Clone, Debug)]
pub struct ActiveTiming<MODE: LedMode> {
led1: LedTiming,
led2: LedTiming,
led3: LedTiming,
ambient1: AmbientTiming,
ambient2: AmbientTiming,
mode: core::marker::PhantomData<MODE>,
}
impl<MODE> ActiveTiming<MODE>
where
MODE: LedMode,
{
pub fn led1(&self) -> &LedTiming {
&self.led1
}
pub fn led2(&self) -> &LedTiming {
&self.led2
}
pub fn led1_mut(&mut self) -> &mut LedTiming {
&mut self.led1
}
pub fn led2_mut(&mut self) -> &mut LedTiming {
&mut self.led2
}
}
impl ActiveTiming<ThreeLedsMode> {
pub fn new(led1: LedTiming, led2: LedTiming, led3: LedTiming, ambient: AmbientTiming) -> Self {
ActiveTiming {
led1,
led2,
led3,
ambient1: ambient,
ambient2: AmbientTiming::default(),
mode: core::marker::PhantomData,
}
}
pub fn led3(&self) -> &LedTiming {
&self.led3
}
pub fn ambient(&self) -> &AmbientTiming {
&self.ambient1
}
pub fn led3_mut(&mut self) -> &mut LedTiming {
&mut self.led3
}
pub fn ambient_mut(&mut self) -> &mut AmbientTiming {
&mut self.ambient1
}
}
impl ActiveTiming<TwoLedsMode> {
pub fn new(
led1: LedTiming,
led2: LedTiming,
ambient1: AmbientTiming,
ambient2: AmbientTiming,
) -> Self {
ActiveTiming {
led1,
led2,
led3: LedTiming::default(),
ambient1,
ambient2,
mode: core::marker::PhantomData,
}
}
pub fn ambient1(&self) -> &AmbientTiming {
&self.ambient1
}
pub fn ambient2(&self) -> &AmbientTiming {
&self.ambient2
}
pub fn ambient1_mut(&mut self) -> &mut AmbientTiming {
&mut self.ambient1
}
pub fn ambient2_mut(&mut self) -> &mut AmbientTiming {
&mut self.ambient2
}
}
#[derive(Copy, Clone, Debug, Default)]
pub struct LedTiming {
pub lighting_st: Time,
pub lighting_end: Time,
pub sample_st: Time,
pub sample_end: Time,
pub reset_st: Time,
pub reset_end: Time,
pub conv_st: Time,
pub conv_end: Time,
}
#[derive(Copy, Clone, Debug, Default)]
pub struct AmbientTiming {
pub sample_st: Time,
pub sample_end: Time,
pub reset_st: Time,
pub reset_end: Time,
pub conv_st: Time,
pub conv_end: Time,
}
impl From<AmbientTiming> for LedTiming {
fn from(other: AmbientTiming) -> Self {
Self {
lighting_st: Time::new::<microsecond>(0.0),
lighting_end: Time::new::<microsecond>(0.0),
sample_st: other.sample_st,
sample_end: other.sample_end,
reset_st: other.reset_st,
reset_end: other.reset_end,
conv_st: other.conv_st,
conv_end: other.conv_end,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct PowerDownTiming {
pub power_down_st: Time,
pub power_down_end: Time,
}
impl PowerDownTiming {
pub fn new(power_down_st: Time, power_down_end: Time) -> Self {
PowerDownTiming {
power_down_st,
power_down_end,
}
}
}