use enum_dispatch::enum_dispatch;
use crate::{
base::{Float, Observer, Pose, SensorOutput, Source, Transform},
sensors::{
Sensor,
hall_effect::{HallLatch, HallSwitch, LinearHallSensor},
},
};
#[derive(Debug, Clone)]
#[enum_dispatch(Observer<T>, Transform<T>)]
pub enum ObserverComponent<T: Float = f64> {
Sensor(Sensor<T>),
Custom(Box<dyn Observer<T>>),
}
impl<T: Float> PartialEq for ObserverComponent<T> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Sensor(l0), Self::Sensor(r0)) => l0 == r0,
(Self::Custom(_), Self::Custom(_)) => false,
_ => false,
}
}
}
macro_rules! impl_transitive_from {
($($primitive:ident),*) => {
$(
impl<T: Float> From<$primitive<T>> for ObserverComponent<T> {
fn from(p: $primitive<T>) -> Self {
let intermediate: Sensor<T> = p.into();
intermediate.into()
}
}
)*
};
}
impl_transitive_from!(LinearHallSensor, HallLatch, HallSwitch);
impl<T: Float> Eq for ObserverComponent<T> {}