use std::time::Duration;
use glam::DVec2 as Vec2;
use ozton_control::{Tolerances, loops::Feedback};
use ozton_drivetrain::{Drivetrain, model::Arcade};
use ozton_tracking::{TracksHeading, TracksPosition, TracksVelocity};
mod boomerang;
mod move_to_point;
pub use boomerang::BoomerangFuture;
pub use move_to_point::MoveToPointFuture;
#[derive(PartialEq)]
pub struct Seeking<L, A>
where
L: Feedback<State = f64, Signal = f64> + Unpin + Clone,
A: Feedback<State = f64, Signal = f64> + Unpin + Clone,
{
pub linear_controller: L,
pub lateral_controller: A,
pub tolerances: Tolerances,
pub timeout: Option<Duration>,
}
impl<L, A> Seeking<L, A>
where
L: Feedback<State = f64, Signal = f64> + Unpin + Clone,
A: Feedback<State = f64, Signal = f64> + Unpin + Clone,
{
pub fn move_to_point<'a, M: Arcade, T: TracksPosition + TracksHeading + TracksVelocity>(
&mut self,
drivetrain: &'a mut Drivetrain<M, T>,
point: impl Into<Vec2>,
) -> MoveToPointFuture<'a, M, L, A, T> {
MoveToPointFuture {
drivetrain,
reverse: false,
target_point: point.into(),
timeout: self.timeout,
tolerances: self.tolerances,
linear_controller: self.linear_controller.clone(),
lateral_controller: self.lateral_controller.clone(),
state: None,
}
}
}