use glam::DVec2 as Vec2;
use ozton_math::desaturate;
mod differential;
mod mecanum;
pub use differential::Differential;
pub use mecanum::Mecanum;
pub trait DrivetrainModel {
type Error;
}
pub trait Holonomic: DrivetrainModel {
fn drive_vector(&mut self, vector: Vec2, turn: f64) -> Result<(), Self::Error>;
}
pub trait Arcade: DrivetrainModel {
fn drive_arcade(&mut self, throttle: f64, steer: f64) -> Result<(), Self::Error>;
}
pub trait Tank: DrivetrainModel {
fn drive_tank(&mut self, left: f64, right: f64) -> Result<(), Self::Error>;
}
impl<T: Tank> Arcade for T {
fn drive_arcade(&mut self, throttle: f64, steer: f64) -> Result<(), Self::Error> {
let [left, right] = desaturate([throttle + steer, throttle - steer], 1.0);
self.drive_tank(left, right)
}
}