autocore_std/motion/
homing.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20pub enum HomingMethod {
21 HardStopPos,
25 HardStopNeg,
27 IntegratedLimitSwitchPos,
29 IntegratedLimitSwitchNeg,
31 IntegratedHomeSensorPosRt,
33 IntegratedHomeSensorNegRt,
35 IntegratedHomeSensorPosFt,
37 IntegratedHomeSensorNegFt,
39 CurrentPosition,
41 Integrated(i8),
43
44 LimitSwitchPosPnp,
48 LimitSwitchNegPnp,
50 LimitSwitchPosNpn,
52 LimitSwitchNegNpn,
54 HomeSensorPosPnp,
56 HomeSensorNegPnp,
58 HomeSensorPosNpn,
60 HomeSensorNegNpn,
62}
63
64impl HomingMethod {
65 pub fn is_integrated(&self) -> bool {
67 match self {
68 Self::HardStopPos
69 | Self::HardStopNeg
70 | Self::IntegratedLimitSwitchPos
71 | Self::IntegratedLimitSwitchNeg
72 | Self::IntegratedHomeSensorPosRt
73 | Self::IntegratedHomeSensorNegRt
74 | Self::IntegratedHomeSensorPosFt
75 | Self::IntegratedHomeSensorNegFt
76 | Self::CurrentPosition
77 | Self::Integrated(_) => true,
78
79 Self::LimitSwitchPosPnp
80 | Self::LimitSwitchNegPnp
81 | Self::LimitSwitchPosNpn
82 | Self::LimitSwitchNegNpn
83 | Self::HomeSensorPosPnp
84 | Self::HomeSensorNegPnp
85 | Self::HomeSensorPosNpn
86 | Self::HomeSensorNegNpn => false,
87 }
88 }
89
90 pub fn cia402_code(&self) -> i8 {
97 match self {
98 Self::HardStopPos => -1,
99 Self::HardStopNeg => -2,
100 Self::IntegratedLimitSwitchPos => 18,
101 Self::IntegratedLimitSwitchNeg => 17,
102 Self::IntegratedHomeSensorPosRt => 19,
103 Self::IntegratedHomeSensorNegRt => 21,
104 Self::IntegratedHomeSensorPosFt => 22,
105 Self::IntegratedHomeSensorNegFt => 20,
106 Self::CurrentPosition => 37,
107 Self::Integrated(code) => *code,
108 _ => panic!("cia402_code() called on software homing method {:?}", self),
109 }
110 }
111
112 pub fn requires_motion(&self) -> bool {
114 !matches!(self, Self::CurrentPosition)
115 }
116}
117
118#[cfg(test)]
119mod tests {
120 use super::*;
121
122 #[test]
123 fn integrated_methods_are_integrated() {
124 assert!(HomingMethod::HardStopPos.is_integrated());
125 assert!(HomingMethod::HardStopNeg.is_integrated());
126 assert!(HomingMethod::IntegratedLimitSwitchPos.is_integrated());
127 assert!(HomingMethod::IntegratedLimitSwitchNeg.is_integrated());
128 assert!(HomingMethod::IntegratedHomeSensorPosRt.is_integrated());
129 assert!(HomingMethod::IntegratedHomeSensorNegRt.is_integrated());
130 assert!(HomingMethod::IntegratedHomeSensorPosFt.is_integrated());
131 assert!(HomingMethod::IntegratedHomeSensorNegFt.is_integrated());
132 assert!(HomingMethod::CurrentPosition.is_integrated());
133 assert!(HomingMethod::Integrated(35).is_integrated());
134 }
135
136 #[test]
137 fn software_methods_are_not_integrated() {
138 assert!(!HomingMethod::LimitSwitchPosPnp.is_integrated());
139 assert!(!HomingMethod::LimitSwitchNegPnp.is_integrated());
140 assert!(!HomingMethod::LimitSwitchPosNpn.is_integrated());
141 assert!(!HomingMethod::LimitSwitchNegNpn.is_integrated());
142 assert!(!HomingMethod::HomeSensorPosPnp.is_integrated());
143 assert!(!HomingMethod::HomeSensorNegPnp.is_integrated());
144 assert!(!HomingMethod::HomeSensorPosNpn.is_integrated());
145 assert!(!HomingMethod::HomeSensorNegNpn.is_integrated());
146 }
147
148 #[test]
149 fn cia402_codes_correct() {
150 assert_eq!(HomingMethod::HardStopPos.cia402_code(), -1);
151 assert_eq!(HomingMethod::HardStopNeg.cia402_code(), -2);
152 assert_eq!(HomingMethod::IntegratedLimitSwitchPos.cia402_code(), 18);
153 assert_eq!(HomingMethod::IntegratedLimitSwitchNeg.cia402_code(), 17);
154 assert_eq!(HomingMethod::IntegratedHomeSensorPosRt.cia402_code(), 19);
155 assert_eq!(HomingMethod::IntegratedHomeSensorNegRt.cia402_code(), 21);
156 assert_eq!(HomingMethod::IntegratedHomeSensorPosFt.cia402_code(), 22);
157 assert_eq!(HomingMethod::IntegratedHomeSensorNegFt.cia402_code(), 20);
158 assert_eq!(HomingMethod::CurrentPosition.cia402_code(), 37);
159 assert_eq!(HomingMethod::Integrated(35).cia402_code(), 35);
160 }
161
162 #[test]
163 #[should_panic]
164 fn cia402_code_panics_on_software_method() {
165 HomingMethod::LimitSwitchPosPnp.cia402_code();
166 }
167
168 #[test]
169 fn requires_motion() {
170 assert!(HomingMethod::HardStopPos.requires_motion());
171 assert!(HomingMethod::IntegratedLimitSwitchPos.requires_motion());
172 assert!(HomingMethod::IntegratedHomeSensorPosRt.requires_motion());
173 assert!(!HomingMethod::CurrentPosition.requires_motion());
174 assert!(HomingMethod::LimitSwitchPosPnp.requires_motion());
175 assert!(HomingMethod::HomeSensorPosPnp.requires_motion());
176 assert!(HomingMethod::Integrated(35).requires_motion());
177 }
178}