aboutsummaryrefslogtreecommitdiffstats
path: root/klippy
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2021-02-20 20:14:45 -0500
committerKevin O'Connor <kevin@koconnor.net>2021-02-27 10:39:47 -0500
commit53b10d3ae7e4bdbcb82f20971600f56b9e01dfeb (patch)
tree85836fcb2fa60e4a3f2a3716097d15fc8fd3c0de /klippy
parentaf8bfee21059751d81d9615d40c51c9f7055d08c (diff)
downloadkutter-53b10d3ae7e4bdbcb82f20971600f56b9e01dfeb.tar.gz
kutter-53b10d3ae7e4bdbcb82f20971600f56b9e01dfeb.tar.xz
kutter-53b10d3ae7e4bdbcb82f20971600f56b9e01dfeb.zip
tmc: Reinitialize on every driver enable
Send the full TMC stepper motor driver initialization sequence every time the driver is enabled. Don't raise an error on startup if unable to contact a tmc2208/tmc2209 driver. If the driver is still unavailable when it is enabled then a shutdown will be issued. This allows users to troubleshoot (and possibly bring up communication to the driver) prior to enabling the driver. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy')
-rw-r--r--klippy/extras/tmc.py68
1 files changed, 36 insertions, 32 deletions
diff --git a/klippy/extras/tmc.py b/klippy/extras/tmc.py
index 7ef2fc93..3dd46432 100644
--- a/klippy/extras/tmc.py
+++ b/klippy/extras/tmc.py
@@ -107,29 +107,6 @@ class TMCCommandHelper:
# Send registers
for reg_name, val in self.fields.registers.items():
self.mcu_tmc.set_register(reg_name, val, print_time)
- def _handle_connect(self):
- # Check for soft stepper enable/disable
- stepper_enable = self.printer.lookup_object('stepper_enable')
- enable_line = stepper_enable.lookup_enable(self.stepper_name)
- if not enable_line.has_dedicated_enable():
- self.toff = self.fields.get_field("toff")
- self.fields.set_field("toff", 0)
- enable_line.register_state_callback(self.handle_stepper_enable)
- logging.info("Enabling TMC virtual enable for '%s'",
- self.stepper_name)
- # Send init
- retry_count = 0
- while 1:
- try:
- self._init_registers()
- return
- except self.printer.command_error as e:
- logging.exception("TMC init error")
- retry_count += 1
- if retry_count > 5:
- raise self.printer.config_error(str(e))
- reactor = self.printer.get_reactor()
- reactor.pause(reactor.monotonic() + 1.)
cmd_INIT_TMC_help = "Initialize TMC stepper driver registers"
def cmd_INIT_TMC(self, gcmd):
logging.info("INIT_TMC %s", self.name)
@@ -168,18 +145,45 @@ class TMCCommandHelper:
else:
gcmd.respond_info("Run Current: %0.2fA Hold Current: %0.2fA"
% (prev_run_current, prev_hold_current))
- # Stepper enable/disable via comms
- def _do_enable(self, print_time, is_enable):
- toff_val = 0
- if is_enable:
- toff_val = self.toff
+ # Stepper enable/disable tracking
+ def _do_enable(self, print_time):
+ try:
print_time -= 0.100 # Schedule slightly before deadline
- val = self.fields.set_field("toff", toff_val)
- reg_name = self.fields.lookup_register("toff")
- self.mcu_tmc.set_register(reg_name, val, print_time)
+ if self.toff is not None:
+ # Shared enable via comms handling
+ val = self.fields.set_field("toff", self.toff)
+ self._init_registers(print_time)
+ except self.printer.command_error as e:
+ self.printer.invoke_shutdown(str(e))
+ def _do_disable(self, print_time):
+ try:
+ if self.toff is not None:
+ val = self.fields.set_field("toff", 0)
+ reg_name = self.fields.lookup_register("toff")
+ self.mcu_tmc.set_register(reg_name, val, print_time)
+ except self.printer.command_error as e:
+ self.printer.invoke_shutdown(str(e))
def handle_stepper_enable(self, print_time, is_enable):
- cb = (lambda ev: self._do_enable(print_time, is_enable))
+ if is_enable:
+ cb = (lambda ev: self._do_enable(print_time))
+ else:
+ cb = (lambda ev: self._do_disable(print_time))
self.printer.get_reactor().register_callback(cb)
+ def _handle_connect(self):
+ # Check for soft stepper enable/disable
+ stepper_enable = self.printer.lookup_object('stepper_enable')
+ enable_line = stepper_enable.lookup_enable(self.stepper_name)
+ enable_line.register_state_callback(self.handle_stepper_enable)
+ if not enable_line.has_dedicated_enable():
+ self.toff = self.fields.get_field("toff")
+ self.fields.set_field("toff", 0)
+ logging.info("Enabling TMC virtual enable for '%s'",
+ self.stepper_name)
+ # Send init
+ try:
+ self._init_registers()
+ except self.printer.command_error as e:
+ logging.info("TMC %s failed to init: %s", self.name, str(e))
# DUMP_TMC support
def setup_register_dump(self, read_registers, read_translate=None):
self.read_registers = read_registers