diff options
author | Dmitry Butyugin <dmbutyugin@google.com> | 2025-05-23 01:44:47 +0200 |
---|---|---|
committer | KevinOConnor <kevin@koconnor.net> | 2025-06-04 13:40:58 -0400 |
commit | 4d4b9684a53fa7e776914b222cdab21f870dad76 (patch) | |
tree | 1293fe6e5bbc52d01d502cdbfff625a5821e0e7d /klippy/extras | |
parent | 14cbb8dd2db14a473fe0a01c626d9bbecc420144 (diff) | |
download | kutter-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.py | 41 |
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() |