#[cfg(topend = "ASM")]
use gmt_dos_clients_fem::fem_io::actors_outputs::M2EdgeSensors;
use gmt_dos_clients_fem::{
DiscreteStateSpace, fem_io::actors_outputs::OSSM1EdgeSensors, solvers::ExponentialMatrix,
};
use nalgebra as na;
use super::Include;
#[derive(Debug, Clone, Default)]
struct M1EdgeSensor {
transform: Option<na::DMatrix<f64>>,
}
#[cfg(topend = "ASM")]
#[derive(Debug, Clone, Default)]
struct M2EdgeSensor {
transform: Option<na::DMatrix<f64>>,
}
#[derive(Debug, Default, Clone)]
pub struct EdgeSensors {
m1: Option<M1EdgeSensor>,
#[cfg(topend = "ASM")]
m2: Option<M2EdgeSensor>,
}
impl EdgeSensors {
pub fn none() -> Self {
Self {
m1: None,
#[cfg(topend = "ASM")]
m2: None,
}
}
pub fn both() -> Self {
Self {
m1: Some(M1EdgeSensor::default()),
#[cfg(topend = "ASM")]
m2: Some(M2EdgeSensor::default()),
}
}
pub fn m1() -> Self {
Self {
m1: Some(M1EdgeSensor::default()),
#[cfg(topend = "ASM")]
m2: None,
}
}
pub fn m1_with(mut self, transform: na::DMatrix<f64>) -> Self {
self.m1 = Some(M1EdgeSensor {
transform: Some(transform),
});
self
}
#[cfg(topend = "ASM")]
pub fn m2() -> Self {
Self {
m1: None,
m2: Some(M2EdgeSensor::default()),
}
}
#[cfg(topend = "ASM")]
pub fn m2_with(mut self, transform: na::DMatrix<f64>) -> Self {
self.m2 = Some(M2EdgeSensor {
transform: Some(transform),
});
self
}
}
#[cfg(topend = "ASM")]
impl<'a> Include<'a, EdgeSensors> for DiscreteStateSpace<'a, ExponentialMatrix> {
fn including(
self,
edge_sensors: Option<&'a mut EdgeSensors>,
) -> Result<Self, gmt_dos_clients_fem::StateSpaceError> {
let Some(edge_sensors) = edge_sensors else {
return Ok(self);
};
let mut state_space = self;
state_space = match edge_sensors.m1.as_ref() {
Some(M1EdgeSensor {
transform: Some(transform),
}) => state_space.outs_with::<OSSM1EdgeSensors>(transform.as_view()),
Some(M1EdgeSensor { transform: None }) => state_space.outs::<OSSM1EdgeSensors>(),
_ => state_space,
};
state_space = match edge_sensors.m2.as_ref() {
Some(M2EdgeSensor {
transform: Some(transform),
}) => state_space.outs_with::<M2EdgeSensors>(transform.as_view()),
Some(M2EdgeSensor { transform: None }) => state_space.outs::<M2EdgeSensors>(),
_ => state_space,
};
Ok(state_space)
}
}
#[cfg(topend = "FSM")]
impl<'a> Include<'a, EdgeSensors> for DiscreteStateSpace<'a, ExponentialMatrix> {
fn including(
self,
edge_sensors: Option<&'a mut EdgeSensors>,
) -> Result<Self, gmt_dos_clients_fem::StateSpaceError> {
let Some(edge_sensors) = edge_sensors else {
return Ok(self);
};
let mut state_space = self;
state_space = match edge_sensors.m1.as_ref() {
Some(M1EdgeSensor {
transform: Some(transform),
}) => state_space.outs_with::<OSSM1EdgeSensors>(transform.as_view()),
Some(M1EdgeSensor { transform: None }) => state_space.outs::<OSSM1EdgeSensors>(),
_ => state_space,
};
Ok(state_space)
}
}