aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/safe_z_home.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/extras/safe_z_home.py')
-rw-r--r--klippy/extras/safe_z_home.py50
1 files changed, 35 insertions, 15 deletions
diff --git a/klippy/extras/safe_z_home.py b/klippy/extras/safe_z_home.py
index dc3fbf5d..6f52b3ca 100644
--- a/klippy/extras/safe_z_home.py
+++ b/klippy/extras/safe_z_home.py
@@ -9,7 +9,7 @@ class SafeZHoming:
self.printer = config.get_printer()
try:
x_pos, y_pos = config.get("home_xy_position",
- default=",").split(',')
+ default=",").split(',')
self.home_x_pos, self.home_y_pos = float(x_pos), float(y_pos)
except:
raise config.error("Unable to parse home_xy_position in %s" % (
@@ -19,36 +19,35 @@ class SafeZHoming:
self.z_hop_speed = config.getfloat('z_hop_speed', 15., above=0.)
self.max_z = config.getsection('stepper_z').getfloat('position_max')
self.speed = config.getfloat('speed', 50.0, above=0.)
+ self.move_to_previous = config.getboolean('move_to_previous', True)
self.gcode = self.printer.lookup_object('gcode')
self.gcode.register_command("G28", None)
self.gcode.register_command("G28", self.cmd_G28)
if config.has_section("homing_override"):
raise config.error("homing_override and safe_z_homing cannot"
- +" be used simultaneously")
+ +" be used simultaneously")
def cmd_G28(self, params):
-
toolhead = self.printer.lookup_object('toolhead')
kinematics = toolhead.get_kinematics()
# Perform Z Hop if necessary
if self.z_hop != 0.0:
- # Check if the zhop would exceed the printer limits
pos = toolhead.get_position()
kin_status = kinematics.get_status()
- if ('Z' in kin_status['homed_axes'] and
- pos[2] + self.z_hop > self.max_z):
- self.gcode.respond_info(
- "No zhop performed, target Z out of bounds: " +
- str(pos[2] + self.z_hop)
- )
+ # Check if Z axis is homed or has a known position
+ if 'Z' in kin_status['homed_axes']:
+ # Check if the zhop would exceed the printer limits
+ if pos[2] + self.z_hop > self.max_z:
+ self.gcode.respond_info(
+ "No zhop performed, target Z out of bounds: " +
+ str(pos[2] + self.z_hop)
+ )
+ elif pos[2] < self.z_hop:
+ self._perform_z_hop(pos)
else:
- # Perform the Z-Hop
- toolhead.set_position(pos, homing_axes=[2])
- pos[2] = pos[2] + self.z_hop
- toolhead.move(pos, self.z_hop_speed)
- self.gcode.reset_last_position()
+ self._perform_z_hop(pos)
# Determine which axes we need to home
if not any([axis in params.keys() for axis in ['X', 'Y', 'Z']]):
@@ -69,6 +68,8 @@ class SafeZHoming:
if need_z:
# Move to safe XY homing position
pos = toolhead.get_position()
+ prev_x = pos[0]
+ prev_y = pos[1]
if self.home_x_pos:
pos[0] = self.home_x_pos
if self.home_y_pos:
@@ -77,6 +78,25 @@ class SafeZHoming:
self.gcode.reset_last_position()
# Home Z
self.gcode.cmd_G28({'Z': '0'})
+ # Perform Z Hop again for pressure-based probes
+ pos = toolhead.get_position()
+ if self.z_hop:
+ pos[2] = self.z_hop
+ toolhead.move(pos, self.z_hop_speed)
+ # Move XY back to previous positions
+ if self.move_to_previous:
+ pos[0] = prev_x
+ pos[1] = prev_y
+ toolhead.move(pos, self.speed)
+ self.gcode.reset_last_position()
+
+ def _perform_z_hop(self, pos):
+ toolhead = self.printer.lookup_object('toolhead')
+ # Perform the Z-Hop
+ toolhead.set_position(pos, homing_axes=[2])
+ pos[2] = pos[2] + self.z_hop
+ toolhead.move(pos, self.z_hop_speed)
+ self.gcode.reset_last_position()
def load_config(config):
return SafeZHoming(config)