use serde::{Serialize, Deserialize};
use crate::{SyncActuator, Setup};
use crate::act::parent::{ActuatorParent, RatioActuatorParent};
use syunit::*;
#[derive(Debug, Serialize, Deserialize)]
pub struct LinearAxis<A : SyncActuator> {
pub actuator : A,
pub rte_ratio : f32
}
impl<A : SyncActuator> LinearAxis<A> {
pub fn new(device : A, rte_ratio : f32) -> Self {
return LinearAxis {
actuator: device,
rte_ratio
};
}
}
impl<A : SyncActuator> Setup for LinearAxis<A> {
fn setup(&mut self) -> Result<(), crate::Error> {
self.actuator.setup()
}
}
impl<A : SyncActuator> ActuatorParent for LinearAxis<A> {
type Child = A;
fn child(&self) -> &Self::Child {
&self.actuator
}
fn child_mut(&mut self) -> &mut Self::Child {
&mut self.actuator
}
}
impl<A : SyncActuator> RatioActuatorParent for LinearAxis<A> {
fn ratio(&self) -> f32 {
self.rte_ratio
}
fn force_for_child(&self, parent_force : Force) -> Force {
parent_force * (self.ratio() / 1000.0) }
fn force_for_parent(&self, child_force : Force) -> Force {
child_force / (self.ratio() / 1000.0) }
fn inertia_for_child(&self, parent_inertia : Inertia) -> Inertia {
parent_inertia * (self.ratio() / 1000.0) * (self.ratio() / 1000.0)
}
fn inertia_for_parent(&self, child_intertia : Inertia) -> Inertia {
child_intertia / (self.ratio() / 1000.0) / (self.ratio() / 1000.0)
}
}