use syunit::*;
#[derive(Debug, Clone, Default)]
pub struct Limits {
pub min : Option<Gamma>,
pub max : Option<Gamma>
}
impl Limits {
const NONE : Self = Self { min: None, max: None };
}
#[derive(Clone, Debug, Default)]
pub struct ActuatorVars {
pub force_load_gen : Force,
pub force_load_dir : Force,
pub inertia_load : Inertia,
pub lim : Limits
}
impl ActuatorVars {
pub const ZERO : Self = Self {
force_load_gen: Force::ZERO,
force_load_dir: Force::ZERO,
inertia_load: Inertia::ZERO,
lim: Limits::NONE
};
pub fn force_after_load(&self, force : Force, direction : Direction) -> Option<Force> {
let mut force = force - self.force_load_gen;
if direction.as_bool() {
force -= self.force_load_dir;
} else {
force += self.force_load_dir;
}
if force > Force::ZERO {
Some(force)
} else {
None
}
}
pub fn force_after_load_lower(&self, force : Force) -> Option<Force> {
let force = force - self.force_load_gen - self.force_load_dir.abs();
if force > Force::ZERO {
Some(force)
} else {
None
}
}
#[inline]
pub fn inertia_after_load(&self, inertia : Inertia) -> Inertia {
inertia + self.inertia_load
}
}