1use syunit::*;
2
3use crate::data::MicroSteps;
4use crate::math::movements::DefinedActuator;
5use crate::{StepperConst, SyncActuator, SyncActuatorGroup, StepperConfig};
6
7pub use syact_macros::StepperActuatorGroup;
9mod builder;
13 pub use builder::{BuilderError, DriveMode, StepperBuilder, StartStopBuilder, ComplexBuilder};
14
15 mod ctrl;
16 pub use ctrl::{StepperController, GenericPWM, ControllerError};
17
18 mod motor;
19pub type Stepper<S, D> = motor::StepperMotor<StartStopBuilder, GenericPWM<S, D>>;
26
27 pub type ComplexStepper<S, D> = motor::StepperMotor<ComplexBuilder, GenericPWM<S, D>>;
29pub trait StepperActuator : SyncActuator + DefinedActuator {
34 fn consts(&self) -> &StepperConst;
36
37 fn config(&self) -> &StepperConfig;
40
41 fn set_config(&mut self, config : StepperConfig) -> Result<(), BuilderError>;
43 fn microsteps(&self) -> MicroSteps;
48
49 fn set_microsteps(&mut self, micro : MicroSteps) -> Result<(), BuilderError>;
51 fn step_ang(&self) -> Delta;
56 }
58
59 pub trait StepperActuatorGroup<T, const C : usize> : SyncActuatorGroup<T, C>
61 where
62 T: StepperActuator + ?Sized + 'static
63 {
64 fn set_config(&mut self, config : StepperConfig) {
66 self.for_each_mut(|comp, _| {
67 comp.set_config(config.clone())
68 });
69 }
70
71 fn microsteps(&self) -> [MicroSteps; C] {
73 self.for_each(|comp, _| {
74 comp.microsteps()
75 })
76 }
77
78 fn set_micro(&mut self, micro : [MicroSteps; C]) -> Result<(), BuilderError> {
80 self.try_for_each_mut(|comp, index| {
81 comp.set_microsteps(micro[index])
82 })?;
83 Ok(())
84 }
85 }
86