use std::time::Duration;
use vexide::{math::Angle, prelude::InertialSensor};
use crate::utils::units::Length;
pub mod pid;
pub mod legacy_pid;
pub trait DriveControl {
fn travel(&mut self, target: Length, timeout: Duration) -> impl Future<Output = ()> + '_;
fn rotate(&mut self, angle: Angle, timeout: Duration) -> impl Future<Output = ()> + '_;
fn pivot(&mut self, angle: Angle, timeout: Duration) -> impl Future<Output = ()> + '_;
fn imu_rotate<'a>(
&'a mut self,
angle: Angle,
timeout: Duration,
imu: &'a InertialSensor,
angle_tolerance: Angle,
) -> impl Future<Output = ()> + 'a;
fn imu_pivot<'a>(
&'a mut self,
angle: Angle,
timeout: Duration,
imu: &'a InertialSensor,
angle_tolerance: Angle,
) -> impl Future<Output = ()> + 'a;
}