use crate::error::MotorError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Motor {
Motor1,
Motor2,
Motor3,
Motor4,
}
pub trait MotorDriver: Send + Sync {
fn set_motor_speed(&self, motor: Motor, speed: u16, forward: bool) -> Result<(), MotorError>;
fn stop_motor(&self, motor: Motor) -> Result<(), MotorError>;
fn stop_all(&self) -> Result<(), MotorError> {
let mut failures = Vec::new();
for motor in [Motor::Motor1, Motor::Motor2, Motor::Motor3, Motor::Motor4] {
if let Err(error) = self.stop_motor(motor) {
failures.push(format!("{motor:?} stop_motor: {error}"));
}
}
if failures.is_empty() {
Ok(())
} else {
Err(MotorError::Pwm(format!(
"stop_all failed: {}",
failures.join("; ")
)))
}
}
}