aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/safe_z_home.py
diff options
context:
space:
mode:
authorFlorian Heilmann <Florian.Heilmann@gmx.net>2019-08-06 19:03:42 +0000
committerKevinOConnor <kevin@koconnor.net>2019-08-09 20:49:17 -0400
commit3d38211b8ab0b4736cdcd7e4b3f3a05bb598db3e (patch)
tree8bc0c145db72fb6b1540859c1324cf4dc8dab3fa /klippy/extras/safe_z_home.py
parentf958542ebb70ec1138aac2e9acf3b80f2e32aa19 (diff)
downloadkutter-3d38211b8ab0b4736cdcd7e4b3f3a05bb598db3e.tar.gz
kutter-3d38211b8ab0b4736cdcd7e4b3f3a05bb598db3e.tar.xz
kutter-3d38211b8ab0b4736cdcd7e4b3f3a05bb598db3e.zip
extra: Add Safe Z home extra
Signed-off-by: Florian Heilmann <Florian.Heilmann@gmx.net>
Diffstat (limited to 'klippy/extras/safe_z_home.py')
-rw-r--r--klippy/extras/safe_z_home.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/klippy/extras/safe_z_home.py b/klippy/extras/safe_z_home.py
new file mode 100644
index 00000000..dc3fbf5d
--- /dev/null
+++ b/klippy/extras/safe_z_home.py
@@ -0,0 +1,82 @@
+# Perform Z Homing at specific XY coordinates.
+#
+# Copyright (C) 2019 Florian Heilmann <Florian.Heilmann@gmx.net>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+
+class SafeZHoming:
+ def __init__(self, config):
+ self.printer = config.get_printer()
+ try:
+ x_pos, y_pos = config.get("home_xy_position",
+ 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" % (
+ config.get_name()))
+
+ self.z_hop = config.getfloat("z_hop", default=0.0)
+ 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.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")
+
+ 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)
+ )
+ 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()
+
+ # Determine which axes we need to home
+ if not any([axis in params.keys() for axis in ['X', 'Y', 'Z']]):
+ need_x, need_y, need_z = [True] * 3
+ else:
+ need_x, need_y, need_z = tuple(axis in params
+ for axis in ['X', 'Y', 'Z'])
+
+ # Home XY axes if necessary
+ new_params = {}
+ if need_x:
+ new_params['X'] = '0'
+ if need_y:
+ new_params['Y'] = '0'
+ if new_params:
+ self.gcode.cmd_G28(new_params)
+ # Home Z axis if necessary
+ if need_z:
+ # Move to safe XY homing position
+ pos = toolhead.get_position()
+ if self.home_x_pos:
+ pos[0] = self.home_x_pos
+ if self.home_y_pos:
+ pos[1] = self.home_y_pos
+ toolhead.move(pos, self.speed)
+ self.gcode.reset_last_position()
+ # Home Z
+ self.gcode.cmd_G28({'Z': '0'})
+
+def load_config(config):
+ return SafeZHoming(config)