#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
use syunit::*;
use syunit::metric::Millimeters;
use crate::SyncActuator;
use crate::parent::{ActuatorParent, RatioActuatorParent};
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct LinearAxis<A : SyncActuator> {
pub actuator : A,
pub effective_radius : Millimeters
}
impl<A : SyncActuator> LinearAxis<A> {
pub fn new_belt_axis(actuator : A, radius : Millimeters) -> Self {
return LinearAxis {
actuator,
effective_radius: radius
};
}
pub fn new_spindle_axis(actuator : A, pitch : Millimeters) -> Self {
return LinearAxis {
actuator,
effective_radius: pitch / 2.0 / core::f32::consts::PI }
}
}
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> {
type Input = MetricMM;
type Output = Rotary;
type Ratio = Millimeters;
fn ratio(&self) -> Self::Ratio {
self.effective_radius
}
}