use crate::fb::{RTrig, StateMachine};
use super::axis::Axis;
use super::axis_view::AxisView;
#[derive(Debug, Clone)]
pub struct SeekProbe {
pub done: bool,
pub error: bool,
pub state: StateMachine,
rt_execute: RTrig,
}
impl SeekProbe {
pub fn new() -> Self {
Self {
done: false,
error: false,
state: StateMachine::new(),
rt_execute: RTrig::new(),
}
}
pub fn call(
&mut self,
axis: &mut Axis,
view: &mut impl AxisView,
execute: bool,
sensor: bool,
) {
let execute_edge = self.rt_execute.call(execute);
match self.state.index {
0 => {
self.done = false;
self.state.index = 10;
}
10 => {
if execute_edge {
self.state.clear_error();
self.done = false;
self.error = false;
self.state.index = 100;
}
}
100 => {
if axis.position > 0.0 {
let speed = axis.config().jog_speed;
let accel = axis.config().jog_accel;
let decel = axis.config().jog_decel;
axis.move_relative(view, -axis.position, speed, accel, decel);
self.state.index = 120;
} else {
self.done = false;
self.error = true;
self.state.set_error(100, "Axis position must be > 0 to start seek");
self.state.index = 10;
}
}
120 => {
if sensor {
axis.halt(view);
self.state.index = 200;
} else if axis.is_error || !axis.motor_on {
self.state.set_error(120, "Axis error or control disabled during seek");
self.state.index = 250;
}
}
200 => {
if !axis.is_busy {
if axis.is_error {
self.done = false;
self.error = true;
self.state.set_error(200, "Axis error while stopping");
} else {
self.done = true;
self.error = false;
}
self.state.index = 10;
}
}
250 => {
axis.halt(view);
self.done = false;
self.error = true;
self.state.index = 10;
}
_ => {
self.state.index = 0;
}
}
self.state.call();
}
pub fn abort(&mut self, axis: &mut Axis, view: &mut impl AxisView) {
if self.state.index > 10 {
axis.halt(view);
self.error = true;
self.state.set_error(1, "Seek aborted");
}
self.state.index = 10;
self.done = false;
}
pub fn is_busy(&self) -> bool {
self.state.index > 10
}
}
impl Default for SeekProbe {
fn default() -> Self {
Self::new()
}
}