use crate::fb::StateMachine;
use super::axis::Axis;
use super::axis_view::{AxisView, AxisHandle};
impl<'a, V: AxisView> AxisHandle for (&'a mut Axis, &'a mut V) {
fn position(&self) -> f64 { self.0.position }
fn config(&self) -> &super::axis_config::AxisConfig { self.0.config() }
fn move_relative(&mut self, distance: f64, vel: f64, accel: f64, decel: f64) {
self.0.move_relative(self.1, distance, vel, accel, decel);
}
fn halt(&mut self) { self.0.halt(self.1); }
fn is_busy(&self) -> bool { self.0.is_busy }
fn is_error(&self) -> bool { self.0.is_error }
fn motor_on(&self) -> bool { self.0.motor_on }
}
#[derive(Debug, Clone)]
pub struct SeekProbe {
pub done: bool,
pub error: bool,
pub state: StateMachine,
}
impl SeekProbe {
pub fn new() -> Self {
Self {
done: false,
error: false,
state: StateMachine::new(),
}
}
pub fn is_busy(&self) -> bool {
self.state.index > 10
}
pub fn is_error(&self) -> bool {
self.error || self.state.is_error()
}
pub fn error_code(&self) -> i32 {
self.state.error_code
}
pub fn start(&mut self) {
self.state.clear_error();
self.done = false;
self.error = false;
self.state.index = 100;
}
pub fn reset(&mut self, handle: &mut impl AxisHandle) {
if self.state.index > 10 {
handle.halt();
}
self.done = false;
self.error = false;
self.state.index = 10;
}
pub fn tick(
&mut self,
handle: &mut impl AxisHandle,
sensor: bool,
) {
match self.state.index {
0 => {
self.done = false;
self.state.index = 10;
}
10 => {
}
100 => {
if handle.position() > 0.0 {
let speed = handle.config().jog_speed;
let accel = handle.config().jog_accel;
let decel = handle.config().jog_decel;
handle.move_relative(-handle.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 {
handle.halt();
self.state.index = 200;
} else if handle.is_error() || !handle.motor_on() {
self.state.set_error(120, "Axis error or control disabled during seek");
self.state.index = 250;
}
}
200 => {
if !handle.is_busy() {
if handle.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 => {
handle.halt();
self.done = false;
self.error = true;
self.state.index = 10;
}
_ => {
self.state.index = 0;
}
}
self.state.call();
}
pub fn abort(&mut self, handle: &mut impl AxisHandle) {
self.reset(handle);
self.error = true;
self.state.set_error(1, "Seek aborted");
}
}
impl Default for SeekProbe {
fn default() -> Self {
Self::new()
}
}