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 CurrentPosition35,
45 CurrentPosition37,
50 Integrated(i8),
52
53 LimitSwitchPosPnp,
57 LimitSwitchNegPnp,
59 LimitSwitchPosNpn,
61 LimitSwitchNegNpn,
63 HomeSensorPosPnp,
65 HomeSensorNegPnp,
67 HomeSensorPosNpn,
69 HomeSensorNegNpn,
71}
72
73impl HomingMethod {
74 pub fn is_integrated(&self) -> bool {
76 match self {
77 Self::HardStopPos
78 | Self::HardStopNeg
79 | Self::IntegratedLimitSwitchPos
80 | Self::IntegratedLimitSwitchNeg
81 | Self::IntegratedHomeSensorPosRt
82 | Self::IntegratedHomeSensorNegRt
83 | Self::IntegratedHomeSensorPosFt
84 | Self::IntegratedHomeSensorNegFt
85 | Self::CurrentPosition35
86 | Self::CurrentPosition37
87 | Self::Integrated(_) => true,
88
89 Self::LimitSwitchPosPnp
90 | Self::LimitSwitchNegPnp
91 | Self::LimitSwitchPosNpn
92 | Self::LimitSwitchNegNpn
93 | Self::HomeSensorPosPnp
94 | Self::HomeSensorNegPnp
95 | Self::HomeSensorPosNpn
96 | Self::HomeSensorNegNpn => false,
97 }
98 }
99
100 pub fn cia402_code(&self) -> i8 {
107 match self {
108 Self::HardStopPos => -1,
109 Self::HardStopNeg => -2,
110 Self::IntegratedLimitSwitchPos => 18,
111 Self::IntegratedLimitSwitchNeg => 17,
112 Self::IntegratedHomeSensorPosRt => 19,
113 Self::IntegratedHomeSensorNegRt => 21,
114 Self::IntegratedHomeSensorPosFt => 22,
115 Self::IntegratedHomeSensorNegFt => 20,
116 Self::CurrentPosition35 => 35,
117 Self::CurrentPosition37 => 37,
118 Self::Integrated(code) => *code,
119 _ => panic!("cia402_code() called on software homing method {:?}", self),
120 }
121 }
122
123 pub fn requires_motion(&self) -> bool {
125 !matches!(self, Self::CurrentPosition35 | Self::CurrentPosition37)
126 }
127}
128
129#[cfg(test)]
130mod tests {
131 use super::*;
132
133 #[test]
134 fn integrated_methods_are_integrated() {
135 assert!(HomingMethod::HardStopPos.is_integrated());
136 assert!(HomingMethod::HardStopNeg.is_integrated());
137 assert!(HomingMethod::IntegratedLimitSwitchPos.is_integrated());
138 assert!(HomingMethod::IntegratedLimitSwitchNeg.is_integrated());
139 assert!(HomingMethod::IntegratedHomeSensorPosRt.is_integrated());
140 assert!(HomingMethod::IntegratedHomeSensorNegRt.is_integrated());
141 assert!(HomingMethod::IntegratedHomeSensorPosFt.is_integrated());
142 assert!(HomingMethod::IntegratedHomeSensorNegFt.is_integrated());
143 assert!(HomingMethod::CurrentPosition35.is_integrated());
144 assert!(HomingMethod::CurrentPosition37.is_integrated());
145 assert!(HomingMethod::Integrated(35).is_integrated());
146 }
147
148 #[test]
149 fn software_methods_are_not_integrated() {
150 assert!(!HomingMethod::LimitSwitchPosPnp.is_integrated());
151 assert!(!HomingMethod::LimitSwitchNegPnp.is_integrated());
152 assert!(!HomingMethod::LimitSwitchPosNpn.is_integrated());
153 assert!(!HomingMethod::LimitSwitchNegNpn.is_integrated());
154 assert!(!HomingMethod::HomeSensorPosPnp.is_integrated());
155 assert!(!HomingMethod::HomeSensorNegPnp.is_integrated());
156 assert!(!HomingMethod::HomeSensorPosNpn.is_integrated());
157 assert!(!HomingMethod::HomeSensorNegNpn.is_integrated());
158 }
159
160 #[test]
161 fn cia402_codes_correct() {
162 assert_eq!(HomingMethod::HardStopPos.cia402_code(), -1);
163 assert_eq!(HomingMethod::HardStopNeg.cia402_code(), -2);
164 assert_eq!(HomingMethod::IntegratedLimitSwitchPos.cia402_code(), 18);
165 assert_eq!(HomingMethod::IntegratedLimitSwitchNeg.cia402_code(), 17);
166 assert_eq!(HomingMethod::IntegratedHomeSensorPosRt.cia402_code(), 19);
167 assert_eq!(HomingMethod::IntegratedHomeSensorNegRt.cia402_code(), 21);
168 assert_eq!(HomingMethod::IntegratedHomeSensorPosFt.cia402_code(), 22);
169 assert_eq!(HomingMethod::IntegratedHomeSensorNegFt.cia402_code(), 20);
170 assert_eq!(HomingMethod::CurrentPosition35.cia402_code(), 35);
171 assert_eq!(HomingMethod::CurrentPosition37.cia402_code(), 37);
172 assert_eq!(HomingMethod::Integrated(35).cia402_code(), 35);
173 }
174
175 #[test]
176 #[should_panic]
177 fn cia402_code_panics_on_software_method() {
178 HomingMethod::LimitSwitchPosPnp.cia402_code();
179 }
180
181 #[test]
182 fn requires_motion() {
183 assert!(HomingMethod::HardStopPos.requires_motion());
184 assert!(HomingMethod::IntegratedLimitSwitchPos.requires_motion());
185 assert!(HomingMethod::IntegratedHomeSensorPosRt.requires_motion());
186 assert!(!HomingMethod::CurrentPosition35.requires_motion());
187 assert!(!HomingMethod::CurrentPosition37.requires_motion());
188 assert!(HomingMethod::LimitSwitchPosPnp.requires_motion());
189 assert!(HomingMethod::HomeSensorPosPnp.requires_motion());
190 assert!(HomingMethod::Integrated(35).requires_motion());
191 }
192}