2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# 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()
							 | 
						
					
						
							
								
									
										
										
										
											2021-08-19 15:19:02 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        x_pos, y_pos = config.getfloatlist("home_xy_position", count=2)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.home_x_pos, self.home_y_pos = x_pos, y_pos
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.z_hop = config.getfloat("z_hop", default=0.0)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.z_hop_speed = config.getfloat('z_hop_speed', 15., above=0.)
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-13 10:28:53 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        zconfig = config.getsection('stepper_z')
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.max_z = zconfig.getfloat('position_max', note_valid=False)
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.speed = config.getfloat('speed', 50.0, above=0.)
							 | 
						
					
						
							
								
									
										
										
										
											2019-10-01 15:07:21 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        self.move_to_previous = config.getboolean('move_to_previous', False)
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-08 12:37:57 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        self.printer.load_object(config, 'homing')
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.gcode = self.printer.lookup_object('gcode')
							 | 
						
					
						
							
								
									
										
										
										
											2020-02-12 20:19:18 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        self.prev_G28 = self.gcode.register_command("G28", None)
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        self.gcode.register_command("G28", self.cmd_G28)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if config.has_section("homing_override"):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            raise config.error("homing_override and safe_z_homing cannot"
							 | 
						
					
						
							
								
									
										
										
										
											2019-09-18 15:37:33 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                               +" be used simultaneously")
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-24 22:49:13 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    def cmd_G28(self, gcmd):
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        toolhead = self.printer.lookup_object('toolhead')
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        # Perform Z Hop if necessary
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if self.z_hop != 0.0:
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-18 17:31:07 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # Check if Z axis is homed and its last known position
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-16 22:43:03 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            curtime = self.printer.get_reactor().monotonic()
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            kin_status = toolhead.get_kinematics().get_status(curtime)
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-18 17:31:07 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            pos = toolhead.get_position()
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            if 'z' not in kin_status['homed_axes']:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                # Always perform the z_hop if the Z axis is not homed
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                pos[2] = 0
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                toolhead.set_position(pos, homing_axes=[2])
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                toolhead.manual_move([None, None, self.z_hop],
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                     self.z_hop_speed)
							 | 
						
					
						
							
								
									
										
										
										
											2025-01-10 15:41:09 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                toolhead.get_kinematics().clear_homing_state((2,))
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-18 17:31:07 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            elif pos[2] < self.z_hop:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                # If the Z axis is homed, and below z_hop, lift it to z_hop
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                toolhead.manual_move([None, None, self.z_hop],
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                     self.z_hop_speed)
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        # Determine which axes we need to home
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-24 22:49:13 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        need_x, need_y, need_z = [gcmd.get(axis, None) is not None
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                  for axis in "XYZ"]
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-22 11:55:25 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        if not need_x and not need_y and not need_z:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            need_x = need_y = need_z = True
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        # Home XY axes if necessary
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        new_params = {}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if need_x:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            new_params['X'] = '0'
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if need_y:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            new_params['Y'] = '0'
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if new_params:
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-22 12:40:32 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            g28_gcmd = self.gcode.create_gcode_command("G28", "G28", new_params)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            self.prev_G28(g28_gcmd)
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-05 17:52:23 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        # Home Z axis if necessary
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if need_z:
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-05 17:52:23 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # Throw an error if X or Y are not homed
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-16 22:43:03 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            curtime = self.printer.get_reactor().monotonic()
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            kin_status = toolhead.get_kinematics().get_status(curtime)
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-05 17:52:23 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            if ('x' not in kin_status['homed_axes'] or
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                'y' not in kin_status['homed_axes']):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                raise gcmd.error("Must home X and Y axes first")
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            # Move to safe XY homing position
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-16 22:43:03 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            prevpos = toolhead.get_position()
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            toolhead.manual_move([self.home_x_pos, self.home_y_pos], self.speed)
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            # Home Z
							 | 
						
					
						
							
								
									
										
										
										
											2020-04-22 12:40:32 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            g28_gcmd = self.gcode.create_gcode_command("G28", "G28", {'Z': '0'})
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            self.prev_G28(g28_gcmd)
							 | 
						
					
						
							
								
									
										
										
										
											2019-09-18 15:37:33 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # Perform Z Hop again for pressure-based probes
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            if self.z_hop:
							 | 
						
					
						
							
								
									
										
										
										
											2022-11-22 18:55:43 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                pos = toolhead.get_position()
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                if pos[2] < self.z_hop:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                    toolhead.manual_move([None, None, self.z_hop],
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                                         self.z_hop_speed)
							 | 
						
					
						
							
								
									
										
										
										
											2019-09-18 15:37:33 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # Move XY back to previous positions
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            if self.move_to_previous:
							 | 
						
					
						
							
								
									
										
										
										
											2020-08-16 22:43:03 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                toolhead.manual_move(prevpos[:2], self.speed)
							 | 
						
					
						
							
								
									
										
										
										
											2019-09-18 15:37:33 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2019-08-06 19:03:42 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								def load_config(config):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    return SafeZHoming(config)
							 |