#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HomingMethod {
HardStopPos,
HardStopNeg,
IntegratedLimitSwitchPos,
IntegratedLimitSwitchNeg,
IntegratedHomeSensorPosRt,
IntegratedHomeSensorNegRt,
IntegratedHomeSensorPosFt,
IntegratedHomeSensorNegFt,
CurrentPosition,
Integrated(i8),
LimitSwitchPosPnp,
LimitSwitchNegPnp,
LimitSwitchPosNpn,
LimitSwitchNegNpn,
HomeSensorPosPnp,
HomeSensorNegPnp,
HomeSensorPosNpn,
HomeSensorNegNpn,
}
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::LimitSwitchPosPnp
| Self::LimitSwitchNegPnp
| Self::LimitSwitchPosNpn
| Self::LimitSwitchNegNpn
| Self::HomeSensorPosPnp
| Self::HomeSensorNegPnp
| Self::HomeSensorPosNpn
| Self::HomeSensorNegNpn => 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::LimitSwitchPosPnp.is_integrated());
assert!(!HomingMethod::LimitSwitchNegPnp.is_integrated());
assert!(!HomingMethod::LimitSwitchPosNpn.is_integrated());
assert!(!HomingMethod::LimitSwitchNegNpn.is_integrated());
assert!(!HomingMethod::HomeSensorPosPnp.is_integrated());
assert!(!HomingMethod::HomeSensorNegPnp.is_integrated());
assert!(!HomingMethod::HomeSensorPosNpn.is_integrated());
assert!(!HomingMethod::HomeSensorNegNpn.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::LimitSwitchPosPnp.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::LimitSwitchPosPnp.requires_motion());
assert!(HomingMethod::HomeSensorPosPnp.requires_motion());
assert!(HomingMethod::Integrated(35).requires_motion());
}
}