syact/
data.rs

1// ####################
2// #    SUBMODULES    #
3// ####################
4    mod comp;
5
6    /// Servo motor data
7    pub mod servo;
8    
9    /// All data and parameters related to stepper motors
10    pub mod stepper;
11    use core::ops::Mul;
12    use core::str::FromStr;
13
14    use serde::{Serialize, Deserialize};
15    pub use stepper::{StepperConfig, StepperConst};
16
17    /// Crate for variables read and written during runtime
18    mod var;
19    pub use var::ActuatorVars;
20//
21
22/// Microsteps used for stepper motors
23#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
24pub struct MicroSteps(u8);
25
26impl MicroSteps {
27    /// Get the representing `u8` value
28    pub fn as_u8(self) -> u8 {
29        self.0
30    }
31}
32
33impl From<u8> for MicroSteps {
34    fn from(value: u8) -> Self {
35        if (value & value.wrapping_sub(1)) == 0 {   // Check if power of 2
36            Self(value)
37        } else {
38            panic!("Number of microsteps must be a power of 2! ({} given)", value)
39        }
40    }
41}
42
43impl FromStr for MicroSteps {
44    type Err = <u8 as FromStr>::Err;
45
46    fn from_str(s: &str) -> Result<Self, Self::Err> {
47        Ok(Self(u8::from_str(s)?))
48    }
49}
50
51impl From<MicroSteps> for u8 {
52    fn from(value: MicroSteps) -> Self {
53        value.0
54    }
55}
56
57impl Default for MicroSteps {
58    fn default() -> Self {
59        Self(1)
60    }
61}
62
63impl Mul<MicroSteps> for u64 {
64    type Output = u64;
65
66    fn mul(self, rhs: MicroSteps) -> Self::Output {
67        self * (rhs.as_u8() as u64)
68    }
69}