#![allow(missing_docs)]
use syunit::metric::KgMeter2;
use syunit::metric::NewtonMeters;
use crate::ActuatorError;
use crate::AdvancedActuator;
use crate::SyncActuator;
use crate::data::ActuatorVars;
use crate::units::*;
#[derive(Clone, Debug, Default)]
pub struct DemoActuator {
_pos : PositionRad,
_velocity_max : Option<RadPerSecond>,
_acceleration_max : Option<RadPerSecond2>,
_jolt_max : Option<RadPerSecond3>,
_limit_min : Option<PositionRad>,
_limit_max : Option<PositionRad>,
dir : Direction,
vars : ActuatorVars
}
impl DemoActuator {
pub fn new() -> Self {
Self::default()
}
}
impl SyncActuator<Rotary> for DemoActuator {
fn pos(&self) -> PositionRad {
self._pos
}
fn overwrite_abs_pos(&mut self, pos : PositionRad) {
self._pos = pos;
}
fn velocity_max(&self) -> Option<RadPerSecond> {
self._velocity_max
}
fn set_velocity_max(&mut self, velocity_opt : Option<RadPerSecond>) -> Result<(), ActuatorError<Rotary>> {
self._velocity_max = velocity_opt;
Ok(())
}
fn acceleration_max(&self) -> Option<RadPerSecond2> {
self._acceleration_max
}
fn set_acceleration_max(&mut self, acceleration_opt : Option<RadPerSecond2>) -> Result<(), ActuatorError<Rotary>> {
self._acceleration_max = acceleration_opt;
Ok(())
}
fn jolt_max(&self) -> Option<RadPerSecond3> {
self._jolt_max
}
fn set_jolt_max(&mut self, jolt_opt : Option<RadPerSecond3>) -> Result<(), ActuatorError<Rotary>> {
self._jolt_max = jolt_opt;
Ok(())
}
fn limit_min(&self) -> Option<PositionRad> {
self._limit_min
}
fn limit_max(&self) -> Option<PositionRad> {
self._limit_max
}
fn set_endpos(&mut self, overwrite_abs_pos : PositionRad) {
self.overwrite_abs_pos(overwrite_abs_pos);
let dir = self.dir.as_bool();
self.set_pos_limits(
if dir { None } else { Some(overwrite_abs_pos) },
if dir { Some(overwrite_abs_pos) } else { None }
)
}
fn set_pos_limits(&mut self, min : Option<PositionRad>, max : Option<PositionRad>) {
if let Some(min) = min {
self._limit_min = Some(min)
}
if let Some(max) = max {
self._limit_max = Some(max);
}
}
fn overwrite_pos_limits(&mut self, min : Option<PositionRad>, max : Option<PositionRad>) {
self._limit_min = min;
self._limit_max = max;
}
}
impl AdvancedActuator for DemoActuator {
fn force_gen(&self) -> <Rotary as UnitSet>::Force {
self.vars.force_load_gen
}
fn force_dir(&self) -> <Rotary as UnitSet>::Force {
self.vars.force_load_dir
}
fn apply_gen_force(&mut self, force : NewtonMeters) -> Result<(), ActuatorError<Rotary>> {
self.vars.force_load_gen = force;
Ok(())
}
fn apply_dir_force(&mut self, force : NewtonMeters) -> Result<(), ActuatorError<Rotary>> {
self.vars.force_load_dir = force;
Ok(())
}
fn inertia(&self) -> KgMeter2 {
self.vars.inertia_load
}
fn apply_inertia(&mut self, inertia : KgMeter2) -> Result<(), ActuatorError<Rotary>> {
self.vars.inertia_load = inertia;
Ok(())
}
}