use heapless::String;
use serde::Deserialize;
use super::limits::SoftLimits;
use super::units::{Degrees, DegreesPerSec, DegreesPerSecSquared, Microsteps};
#[derive(Debug, Clone, Deserialize)]
pub struct MotorConfig {
pub name: String<32>,
pub steps_per_revolution: u16,
pub microsteps: Microsteps,
#[serde(default = "default_gear_ratio")]
pub gear_ratio: f32,
#[serde(rename = "max_velocity_deg_per_sec")]
pub max_velocity: DegreesPerSec,
#[serde(rename = "max_acceleration_deg_per_sec2")]
pub max_acceleration: DegreesPerSecSquared,
#[serde(default)]
pub invert_direction: bool,
#[serde(default)]
pub limits: Option<SoftLimits>,
#[serde(default, rename = "backlash_compensation_deg")]
pub backlash_compensation: Option<Degrees>,
}
fn default_gear_ratio() -> f32 {
1.0
}
impl MotorConfig {
pub fn total_steps_per_revolution(&self) -> u32 {
(self.steps_per_revolution as f32 * self.microsteps.value() as f32 * self.gear_ratio)
as u32
}
pub fn steps_per_degree(&self) -> f32 {
self.total_steps_per_revolution() as f32 / 360.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_total_steps() {
let config = MotorConfig {
name: String::try_from("test").unwrap(),
steps_per_revolution: 200,
microsteps: Microsteps::SIXTEENTH,
gear_ratio: 2.0,
max_velocity: DegreesPerSec(360.0),
max_acceleration: DegreesPerSecSquared(720.0),
invert_direction: false,
limits: None,
backlash_compensation: None,
};
assert_eq!(config.total_steps_per_revolution(), 6400);
}
}