tmc: Hold a mutex during enable/disable checking

It's possible for a motor disable request to occur while processing a
previous motor enable.  Use a reactor mutex to ensure the two events
are processed serially.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2025-12-29 14:09:38 -05:00
parent d5ef924751
commit 8ea7be5dd7

View file

@ -330,6 +330,7 @@ class TMCCommandHelper:
# Stepper enable/disable tracking
self.toff = None
self.stepper_enable = self.printer.load_object(config, "stepper_enable")
self.enable_mutex = self.printer.get_reactor().mutex()
# DUMP_TMC support
self.read_registers = self.read_translate = None
# Common tmc helpers
@ -469,10 +470,11 @@ class TMCCommandHelper:
def _handle_stepper_enable(self, print_time, is_enable):
def enable_disable_cb(eventtime):
try:
if is_enable:
self._do_enable(print_time)
else:
self._do_disable(print_time)
with self.enable_mutex:
if is_enable:
self._do_enable(print_time)
else:
self._do_disable(print_time)
except self.printer.command_error as e:
self.printer.invoke_shutdown(str(e))
self.printer.get_reactor().register_callback(enable_disable_cb)