#[derive(Debug, Clone)]
pub struct AxisConfig {
counts_per_rev: f64,
user_per_rev: f64,
pub invert_direction: bool,
pub jog_speed: f64,
pub jog_accel: f64,
pub jog_decel: f64,
pub home_position: f64,
pub homing_speed: f64,
pub homing_accel: f64,
pub homing_decel: f64,
pub operation_timeout_secs: f64,
pub homing_timeout_secs: f64,
pub enable_max_position_limit: bool,
pub enable_min_position_limit: bool,
pub max_position_limit: f64,
pub min_position_limit: f64,
}
impl AxisConfig {
pub fn new(counts_per_rev: u32) -> Self {
Self {
counts_per_rev: counts_per_rev as f64,
user_per_rev: 1.0,
invert_direction: false,
jog_speed: 0.0,
jog_accel: 0.0,
jog_decel: 0.0,
home_position: 0.0,
homing_speed: 0.0,
homing_accel: 0.0,
homing_decel: 0.0,
operation_timeout_secs: 7.0,
homing_timeout_secs: 30.0,
enable_max_position_limit: false,
enable_min_position_limit: false,
max_position_limit: 0.0,
min_position_limit: 0.0,
}
}
pub fn with_user_scale(mut self, user_per_rev: f64) -> Self {
self.user_per_rev = user_per_rev;
self
}
pub fn to_counts(&self, user_units: f64) -> f64 {
let sign = if self.invert_direction { -1.0 } else { 1.0 };
user_units * self.counts_per_user() * sign
}
pub fn to_user(&self, counts: f64) -> f64 {
let sign = if self.invert_direction { -1.0 } else { 1.0 };
counts * sign / self.counts_per_user()
}
pub fn counts_per_user(&self) -> f64 {
self.counts_per_rev / self.user_per_rev
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basic_conversion_degrees() {
let cfg = AxisConfig::new(12_800).with_user_scale(360.0);
assert!((cfg.to_counts(45.0) - 1600.0).abs() < 0.01);
assert!((cfg.to_counts(360.0) - 12800.0).abs() < 0.01);
assert!((cfg.to_user(1600.0) - 45.0).abs() < 0.01);
assert!((cfg.to_user(12800.0) - 360.0).abs() < 0.01);
}
#[test]
fn basic_conversion_mm() {
let cfg = AxisConfig::new(12_800).with_user_scale(5.0);
assert!((cfg.to_counts(5.0) - 12800.0).abs() < 0.01);
assert!((cfg.to_counts(2.5) - 6400.0).abs() < 0.01);
}
#[test]
fn counts_per_user() {
let cfg = AxisConfig::new(12_800).with_user_scale(360.0);
let cpu = cfg.counts_per_user();
assert!((cpu - 12800.0 / 360.0).abs() < 1e-9);
}
#[test]
fn default_revolutions() {
let cfg = AxisConfig::new(12_800);
assert!((cfg.to_counts(1.0) - 12800.0).abs() < 0.01);
assert!((cfg.to_counts(0.125) - 1600.0).abs() < 0.01);
}
#[test]
fn round_trip() {
let cfg = AxisConfig::new(12_800).with_user_scale(360.0);
let original = 45.0;
let counts = cfg.to_counts(original);
let back = cfg.to_user(counts);
assert!((back - original).abs() < 1e-9);
}
#[test]
fn defaults() {
let cfg = AxisConfig::new(12_800);
assert_eq!(cfg.jog_speed, 0.0);
assert_eq!(cfg.home_position, 0.0);
assert!(!cfg.enable_max_position_limit);
assert!(!cfg.enable_min_position_limit);
}
}