use beet_core::prelude::*;
use strum_macros::Display;
use strum_macros::EnumIter;
#[derive(
Debug, Default, Copy, Clone, PartialEq, Reflect, EnumIter, Display,
)]
pub enum MotorDirection {
#[default]
Forward,
Backward,
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Reflect, Component)]
pub struct MotorValue {
pub speed: u8,
pub direction: MotorDirection,
}
impl MotorValue {
pub fn new(speed: u8, direction: MotorDirection) -> Self {
Self { speed, direction }
}
pub fn to_signed_normal(&self) -> f32 {
let normalized = self.speed as f32 / u8::MAX as f32;
match self.direction {
MotorDirection::Forward => normalized,
MotorDirection::Backward => -normalized,
}
}
pub fn from_signed_normal(normal: f32) -> Self {
let value = (normal.abs() * u8::MAX as f32) as u8;
let direction = if normal >= 0.0 {
MotorDirection::Forward
} else {
MotorDirection::Backward
};
Self::new(value, direction)
}
pub fn stop() -> Self { Self::new(0, MotorDirection::Forward) }
pub fn forward(speed: u8) -> Self {
Self::new(speed, MotorDirection::Forward)
}
pub fn backward(speed: u8) -> Self {
Self::new(speed, MotorDirection::Backward)
}
pub fn forward_max() -> Self { Self::forward(u8::MAX) }
pub fn backward_max() -> Self { Self::backward(u8::MAX) }
}