aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras
diff options
context:
space:
mode:
authorDmitry Butyugin <dmbutyugin@google.com>2025-05-23 01:44:47 +0200
committerKevinOConnor <kevin@koconnor.net>2025-06-04 13:40:58 -0400
commit4d4b9684a53fa7e776914b222cdab21f870dad76 (patch)
tree1293fe6e5bbc52d01d502cdbfff625a5821e0e7d /klippy/extras
parent14cbb8dd2db14a473fe0a01c626d9bbecc420144 (diff)
downloadkutter-4d4b9684a53fa7e776914b222cdab21f870dad76.tar.gz
kutter-4d4b9684a53fa7e776914b222cdab21f870dad76.tar.xz
kutter-4d4b9684a53fa7e776914b222cdab21f870dad76.zip
input_shaper: Track kinematics updates by dual_carriage
Signed-off-by: Dmitry Butyugin <dmbutyugin@google.com>
Diffstat (limited to 'klippy/extras')
-rw-r--r--klippy/extras/input_shaper.py41
1 files changed, 33 insertions, 8 deletions
diff --git a/klippy/extras/input_shaper.py b/klippy/extras/input_shaper.py
index 82d63572..a2117b44 100644
--- a/klippy/extras/input_shaper.py
+++ b/klippy/extras/input_shaper.py
@@ -69,6 +69,8 @@ class AxisInputShaper:
ffi_lib.input_shaper_set_shaper_params(
sk, self.axis.encode(), self.n, self.A, self.T)
return success
+ def is_enabled(self):
+ return self.n > 0
def disable_shaping(self):
if self.saved is None and self.n:
self.saved = (self.n, self.A, self.T)
@@ -89,6 +91,8 @@ class InputShaper:
def __init__(self, config):
self.printer = config.get_printer()
self.printer.register_event_handler("klippy:connect", self.connect)
+ self.printer.register_event_handler("dual_carriage:update_kinematics",
+ self._update_kinematics)
self.toolhead = None
self.shapers = [AxisInputShaper('x', config),
AxisInputShaper('y', config)]
@@ -101,23 +105,25 @@ class InputShaper:
desc=self.cmd_SET_INPUT_SHAPER_help)
def get_shapers(self):
return self.shapers
- def init_for_steppers(self, steppers):
- ffi_main, ffi_lib = chelper.get_ffi()
- for s in steppers:
- self._get_input_shaper_stepper_kinematics(s)
def connect(self):
self.toolhead = self.printer.lookup_object("toolhead")
+ dual_carriage = self.printer.lookup_object('dual_carriage', None)
+ if dual_carriage is not None:
+ for shaper in self.shapers:
+ if shaper.is_enabled():
+ raise printer.config_error(
+ 'Input shaper parameters cannot be configured via'
+ ' [input_shaper] section with dual_carriage(s) '
+ ' enabled. Refer to Klipper documentation on how '
+ ' to configure input shaper for dual_carriage(s).')
+ return
# Configure initial values
self._update_input_shaping(error=self.printer.config_error)
def _get_input_shaper_stepper_kinematics(self, stepper):
# Lookup stepper kinematics
sk = stepper.get_stepper_kinematics()
- if sk in self.orig_stepper_kinematics:
- # Already processed this stepper kinematics unsuccessfully
- return None
if sk in self.input_shaper_stepper_kinematics:
return sk
- self.orig_stepper_kinematics.append(sk)
ffi_main, ffi_lib = chelper.get_ffi()
is_sk = ffi_main.gc(ffi_lib.input_shaper_alloc(), ffi_lib.free)
stepper.set_stepper_kinematics(is_sk)
@@ -125,8 +131,27 @@ class InputShaper:
if res < 0:
stepper.set_stepper_kinematics(sk)
return None
+ self.orig_stepper_kinematics.append(sk)
self.input_shaper_stepper_kinematics.append(is_sk)
return is_sk
+ def _update_kinematics(self):
+ if self.toolhead is None:
+ # Klipper initialization is not yet completed
+ return
+ ffi_main, ffi_lib = chelper.get_ffi()
+ kin = self.toolhead.get_kinematics()
+ for s in kin.get_steppers():
+ if s.get_trapq() is None:
+ continue
+ is_sk = self._get_input_shaper_stepper_kinematics(s)
+ if is_sk is None:
+ continue
+ old_delay = ffi_lib.input_shaper_get_step_generation_window(is_sk)
+ ffi_lib.input_shaper_update_sk(is_sk)
+ new_delay = ffi_lib.input_shaper_get_step_generation_window(is_sk)
+ if old_delay != new_delay:
+ self.toolhead.note_step_generation_scan_time(new_delay,
+ old_delay)
def _update_input_shaping(self, error=None):
self.toolhead.flush_step_generation()
ffi_main, ffi_lib = chelper.get_ffi()