use crate::error::AsynResult;
use crate::user::AsynUser;
#[derive(Debug, Clone)]
pub struct MotorStatus {
pub position: f64,
pub encoder_position: f64,
pub velocity: f64,
pub done: bool,
pub moving: bool,
pub high_limit: bool,
pub low_limit: bool,
pub home: bool,
pub encoder_home: bool,
pub powered: bool,
pub problem: bool,
pub direction: bool,
pub slip_stall: bool,
pub comms_error: bool,
pub homed: bool,
pub gain_support: bool,
pub has_encoder: bool,
pub vbas_supported: bool,
}
impl Default for MotorStatus {
fn default() -> Self {
Self {
position: 0.0,
encoder_position: 0.0,
velocity: 0.0,
done: true,
moving: false,
high_limit: false,
low_limit: false,
home: false,
encoder_home: false,
powered: true,
problem: false,
direction: false,
slip_stall: false,
comms_error: false,
homed: false,
gain_support: false,
has_encoder: false,
vbas_supported: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PidGainKind {
Proportional,
Integral,
Derivative,
}
pub trait AsynMotor: Send + Sync {
fn move_absolute(
&mut self,
user: &AsynUser,
position: f64,
velocity: f64,
acceleration: f64,
) -> AsynResult<()>;
fn move_relative(
&mut self,
user: &AsynUser,
distance: f64,
velocity: f64,
acceleration: f64,
) -> AsynResult<()> {
let status = self.poll(user)?;
self.move_absolute(user, status.position + distance, velocity, acceleration)
}
fn move_velocity(
&mut self,
user: &AsynUser,
velocity: f64,
acceleration: f64,
) -> AsynResult<()> {
let target = if velocity >= 0.0 { 1e9 } else { -1e9 };
self.move_absolute(user, target, velocity.abs(), acceleration)
}
fn home(&mut self, user: &AsynUser, velocity: f64, forward: bool) -> AsynResult<()>;
fn stop(&mut self, user: &AsynUser, acceleration: f64) -> AsynResult<()>;
fn set_position(&mut self, user: &AsynUser, position: f64) -> AsynResult<()>;
fn set_closed_loop(&mut self, _user: &AsynUser, _enable: bool) -> AsynResult<()> {
Ok(())
}
fn set_pid_gain(&mut self, _user: &AsynUser, _kind: PidGainKind, _gain: f64) -> AsynResult<()> {
Ok(())
}
fn set_high_limit(&mut self, _user: &AsynUser, _position: f64) -> AsynResult<()> {
Ok(())
}
fn set_low_limit(&mut self, _user: &AsynUser, _position: f64) -> AsynResult<()> {
Ok(())
}
fn set_deferred_moves(&mut self, _user: &AsynUser, _defer: bool) -> AsynResult<()> {
Ok(())
}
fn poll(&mut self, user: &AsynUser) -> AsynResult<MotorStatus>;
fn initialize_profile(&mut self, _user: &AsynUser, _max_points: usize) -> AsynResult<()> {
Ok(())
}
fn define_profile(&mut self, _user: &AsynUser, _positions: &[f64]) -> AsynResult<()> {
Ok(())
}
fn build_profile(&mut self, _user: &AsynUser) -> AsynResult<()> {
Ok(())
}
fn execute_profile(&mut self, _user: &AsynUser) -> AsynResult<()> {
Ok(())
}
fn abort_profile(&mut self, _user: &AsynUser) -> AsynResult<()> {
Ok(())
}
fn readback_profile(&mut self, _user: &AsynUser) -> AsynResult<Vec<f64>> {
Ok(vec![])
}
fn move_to_home(
&mut self,
user: &AsynUser,
position: f64,
velocity: f64,
acceleration: f64,
) -> AsynResult<()> {
self.move_absolute(user, position, velocity, acceleration)
}
fn enable_pco(&mut self, _user: &AsynUser, _enable: bool) -> AsynResult<()> {
Ok(())
}
fn set_pco_config(
&mut self,
_user: &AsynUser,
_start: f64,
_end: f64,
_increment: f64,
_pulse_width_us: f64,
) -> AsynResult<()> {
Ok(())
}
}