#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HomingMethod {
HardStopPos,
HardStopNeg,
IntegratedLimitSwitchPos,
IntegratedLimitSwitchNeg,
IntegratedHomeSensorPosRt,
IntegratedHomeSensorNegRt,
IntegratedHomeSensorPosFt,
IntegratedHomeSensorNegFt,
CurrentPosition,
Integrated(i8),
LimitSwitchPosRt,
LimitSwitchNegRt,
LimitSwitchPosFt,
LimitSwitchNegFt,
HomeSensorPosRt,
HomeSensorNegRt,
HomeSensorPosFt,
HomeSensorNegFt,
}
impl HomingMethod {
pub fn is_integrated(&self) -> bool {
match self {
Self::HardStopPos
| Self::HardStopNeg
| Self::IntegratedLimitSwitchPos
| Self::IntegratedLimitSwitchNeg
| Self::IntegratedHomeSensorPosRt
| Self::IntegratedHomeSensorNegRt
| Self::IntegratedHomeSensorPosFt
| Self::IntegratedHomeSensorNegFt
| Self::CurrentPosition
| Self::Integrated(_) => true,
Self::LimitSwitchPosRt
| Self::LimitSwitchNegRt
| Self::LimitSwitchPosFt
| Self::LimitSwitchNegFt
| Self::HomeSensorPosRt
| Self::HomeSensorNegRt
| Self::HomeSensorPosFt
| Self::HomeSensorNegFt => false,
}
}
pub fn cia402_code(&self) -> i8 {
match self {
Self::HardStopPos => -1,
Self::HardStopNeg => -2,
Self::IntegratedLimitSwitchPos => 18,
Self::IntegratedLimitSwitchNeg => 17,
Self::IntegratedHomeSensorPosRt => 19,
Self::IntegratedHomeSensorNegRt => 21,
Self::IntegratedHomeSensorPosFt => 22,
Self::IntegratedHomeSensorNegFt => 20,
Self::CurrentPosition => 37,
Self::Integrated(code) => *code,
_ => panic!("cia402_code() called on software homing method {:?}", self),
}
}
pub fn requires_motion(&self) -> bool {
!matches!(self, Self::CurrentPosition)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn integrated_methods_are_integrated() {
assert!(HomingMethod::HardStopPos.is_integrated());
assert!(HomingMethod::HardStopNeg.is_integrated());
assert!(HomingMethod::IntegratedLimitSwitchPos.is_integrated());
assert!(HomingMethod::IntegratedLimitSwitchNeg.is_integrated());
assert!(HomingMethod::IntegratedHomeSensorPosRt.is_integrated());
assert!(HomingMethod::IntegratedHomeSensorNegRt.is_integrated());
assert!(HomingMethod::IntegratedHomeSensorPosFt.is_integrated());
assert!(HomingMethod::IntegratedHomeSensorNegFt.is_integrated());
assert!(HomingMethod::CurrentPosition.is_integrated());
assert!(HomingMethod::Integrated(35).is_integrated());
}
#[test]
fn software_methods_are_not_integrated() {
assert!(!HomingMethod::LimitSwitchPosRt.is_integrated());
assert!(!HomingMethod::LimitSwitchNegRt.is_integrated());
assert!(!HomingMethod::LimitSwitchPosFt.is_integrated());
assert!(!HomingMethod::LimitSwitchNegFt.is_integrated());
assert!(!HomingMethod::HomeSensorPosRt.is_integrated());
assert!(!HomingMethod::HomeSensorNegRt.is_integrated());
assert!(!HomingMethod::HomeSensorPosFt.is_integrated());
assert!(!HomingMethod::HomeSensorNegFt.is_integrated());
}
#[test]
fn cia402_codes_correct() {
assert_eq!(HomingMethod::HardStopPos.cia402_code(), -1);
assert_eq!(HomingMethod::HardStopNeg.cia402_code(), -2);
assert_eq!(HomingMethod::IntegratedLimitSwitchPos.cia402_code(), 18);
assert_eq!(HomingMethod::IntegratedLimitSwitchNeg.cia402_code(), 17);
assert_eq!(HomingMethod::IntegratedHomeSensorPosRt.cia402_code(), 19);
assert_eq!(HomingMethod::IntegratedHomeSensorNegRt.cia402_code(), 21);
assert_eq!(HomingMethod::IntegratedHomeSensorPosFt.cia402_code(), 22);
assert_eq!(HomingMethod::IntegratedHomeSensorNegFt.cia402_code(), 20);
assert_eq!(HomingMethod::CurrentPosition.cia402_code(), 37);
assert_eq!(HomingMethod::Integrated(35).cia402_code(), 35);
}
#[test]
#[should_panic]
fn cia402_code_panics_on_software_method() {
HomingMethod::LimitSwitchPosRt.cia402_code();
}
#[test]
fn requires_motion() {
assert!(HomingMethod::HardStopPos.requires_motion());
assert!(HomingMethod::IntegratedLimitSwitchPos.requires_motion());
assert!(HomingMethod::IntegratedHomeSensorPosRt.requires_motion());
assert!(!HomingMethod::CurrentPosition.requires_motion());
assert!(HomingMethod::LimitSwitchPosRt.requires_motion());
assert!(HomingMethod::HomeSensorPosRt.requires_motion());
assert!(HomingMethod::Integrated(35).requires_motion());
}
}