use embedded_hal::delay::DelayNs;
use crate::driver::StepperMotor;
pub struct Stepper<M: StepperMotor, D: DelayNs> {
pub(crate) motor: M,
pub(crate) delay: D,
step_number: u32,
direction: u32,
step_delay: u32,
number_of_steps: u32,
}
impl<M: StepperMotor, D: DelayNs> Stepper<M, D> {
pub fn new(number_of_steps: u32, motor: M, delay: D) -> Self {
Self {
motor,
delay,
step_number: 0,
direction: 0,
step_delay: 0,
number_of_steps,
}
}
pub fn set_speed(&mut self, speed: u32) {
if speed != 0 && self.number_of_steps != 0 {
self.step_delay = 60 * 1_000_000 / self.number_of_steps / speed;
} else {
self.step_delay = 0;
}
}
pub fn deenergise(&mut self) -> Result<(), M::Error> {
self.motor.clear()
}
pub fn step(&mut self, steps_to_move: i32) -> Result<(), M::Error> {
let mut steps_left = if steps_to_move < 0 {
self.direction = 0;
-steps_to_move as u32
} else {
self.direction = 1;
steps_to_move as u32
};
while steps_left > 0 {
self.delay.delay_us(self.step_delay);
if self.direction == 1 {
self.step_number += 1;
if self.step_number == self.number_of_steps {
self.step_number = 0;
}
} else {
if self.step_number == 0 {
self.step_number = self.number_of_steps;
}
self.step_number -= 1;
}
steps_left -= 1;
self.motor.step(self.step_number)?;
}
Ok(())
}
}