From 01e53aa3f68161db7a4694be76cd8876caa024f0 Mon Sep 17 00:00:00 2001 From: Oleksandr Shyshatskyi Date: Mon, 31 Aug 2026 20:49:34 +0300 Subject: [PATCH] Drop the PARK= opt-out from TOOL_LOCATE_SENSOR The station pass needs an empty carriage, so with a toolchanger it always parks: PARK=0 only said "I docked it by hand", which the sensor check right below already decides for itself. Without [ff_toolchange] there is no TOOLCHANGE_PARK to call and no sensor to ask, so the pass just runs -- where it used to demand PARK=0 before it would. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01UfsqVZ3aXL3qxr3BFDS35x --- docs/how-calibration-works.md | 9 +++++---- .../klipper/klippy/extras/ff_tool_offset.py | 18 ++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/how-calibration-works.md b/docs/how-calibration-works.md index 5637d4e..0539c0d 100644 --- a/docs/how-calibration-works.md +++ b/docs/how-calibration-works.md @@ -86,9 +86,9 @@ difference between a first layer that sticks and one that does not. #### `TOOL_LOCATE_SENSOR` — the reference -`[PARK=1] [SAVE=1]` +`[SAVE=1]` -1. Parks the mounted tool (`PARK=0` if you docked it by hand) and verifies +1. Homes if any axis is unhomed, parks the mounted tool, and verifies the carriage really is empty, from the dock and grab sensors. 2. Plate check: probes station Z with the bare carriage, then sideways for the bore edge. @@ -107,8 +107,9 @@ carriage** — select the tool first. `[SAVE=1]` -1. Plate check. It needs an empty carriage, so it parks your tool and picks - it straight back up — that is expected, not a fault. +1. Homes if any axis is unhomed, then the plate check. Both need an empty + carriage, so your tool is parked and picked straight back up — that is + expected, not a fault. 2. Zeroes the G-code offset and works in raw machine coordinates. 3. Same two passes as above, from `cylinder_x − 12.5` (16.0 stock), with the nozzle doing the touching. diff --git a/pkgs/klipper/payload/klipper/klippy/extras/ff_tool_offset.py b/pkgs/klipper/payload/klipper/klippy/extras/ff_tool_offset.py index 0632842..3071f76 100644 --- a/pkgs/klipper/payload/klipper/klippy/extras/ff_tool_offset.py +++ b/pkgs/klipper/payload/klipper/klippy/extras/ff_tool_offset.py @@ -785,20 +785,18 @@ class FFToolOffset: cmd_TOOL_LOCATE_SENSOR_help = ( "Locate the station with an EMPTY carriage (station_x/y/z) " - "([PARK=1] [SAVE=1] [PLATE_CHECK=1] [SAMPLES=] [SAMPLES_TOLERANCE=]" + "([SAVE=1] [PLATE_CHECK=1] [SAMPLES=] [SAMPLES_TOLERANCE=]" " [SAMPLES_TOLERANCE_RETRIES=] [SAMPLES_RESULT=]" " [SAMPLE_RETRACT_DIST=] [PROBE_SPEED=])") def cmd_TOOL_LOCATE_SENSOR(self, gcmd): - park = gcmd.get_int('PARK', 1, minval=0, maxval=1) save = gcmd.get_int('SAVE', 1, minval=0, maxval=1) try: self._check_homed(gcmd) if self.toolchange is not None: - if park: - # releaseFourExtruder: the carriage must be empty for TS. - self._run('TOOLCHANGE_PARK') - self._wait_moves() + # releaseFourExtruder: the carriage must be empty for TS. + self._run('TOOLCHANGE_PARK') + self._wait_moves() carriage = self.toolchange.get_status(self.reactor.monotonic()) if carriage.get('current_tool', -1) != -1 \ or not carriage.get('state_ok'): @@ -806,10 +804,10 @@ class FFToolOffset: "%s: carriage is not verifiably empty (%s) -- the" " station pass must run with no tool mounted" % (self.name, carriage.get('state_reason'))) - elif park: - raise gcmd.error("%s: [ff_toolchange] not loaded -- park" - " the tool by hand and pass PARK=0." - % self.name) + # With no [ff_toolchange] there is no TOOLCHANGE_PARK to call and + # no sensor that can confirm the carriage is empty. Emptying it is + # the operator's job then, as it is on any printer without a + # toolchanger. self._run_plate_check(gcmd) cylinder_x, cylinder_y = self._cylinder() gcmd.respond_info("station calibration, start %.3f, %.3f"