aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2024-01-06 19:27:56 -0500
committerKevin O'Connor <kevin@koconnor.net>2024-04-09 16:32:43 -0400
commitfa5fa74761c05da4efd2c36b4286910d4f6bb2cf (patch)
tree17f273c3af89a5a7a4cf01454b1295faf043ef7e
parent01c7befacb5b71643130433f2afb3f22ece68d71 (diff)
downloadkutter-fa5fa74761c05da4efd2c36b4286910d4f6bb2cf.tar.gz
kutter-fa5fa74761c05da4efd2c36b4286910d4f6bb2cf.tar.xz
kutter-fa5fa74761c05da4efd2c36b4286910d4f6bb2cf.zip
mcu: Separate trdispatch handling from MCU_endstop class
Create a new TriggerDispatch class to track the low-level handling of the trdispatch mechanism. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/mcu.py97
1 files changed, 60 insertions, 37 deletions
diff --git a/klippy/mcu.py b/klippy/mcu.py
index e0d580e5..2a01c5a7 100644
--- a/klippy/mcu.py
+++ b/klippy/mcu.py
@@ -226,23 +226,17 @@ class MCU_trsync:
TRSYNC_TIMEOUT = 0.025
TRSYNC_SINGLE_MCU_TIMEOUT = 0.250
-class MCU_endstop:
- RETRY_QUERY = 1.000
- def __init__(self, mcu, pin_params):
+class TriggerDispatch:
+ def __init__(self, mcu):
self._mcu = mcu
- self._pin = pin_params['pin']
- self._pullup = pin_params['pullup']
- self._invert = pin_params['invert']
- self._oid = self._mcu.create_oid()
- self._home_cmd = self._query_cmd = None
- self._mcu.register_config_callback(self._build_config)
self._trigger_completion = None
- self._rest_ticks = 0
ffi_main, ffi_lib = chelper.get_ffi()
self._trdispatch = ffi_main.gc(ffi_lib.trdispatch_alloc(), ffi_lib.free)
self._trsyncs = [MCU_trsync(mcu, self._trdispatch)]
- def get_mcu(self):
- return self._mcu
+ def get_oid(self):
+ return self._trsyncs[0].get_oid()
+ def get_command_queue(self):
+ return self._trsyncs[0].get_command_queue()
def add_stepper(self, stepper):
trsyncs = {trsync.get_mcu(): trsync for trsync in self._trsyncs}
trsync = trsyncs.get(stepper.get_mcu())
@@ -261,6 +255,51 @@ class MCU_endstop:
" multi-mcu shared axis")
def get_steppers(self):
return [s for trsync in self._trsyncs for s in trsync.get_steppers()]
+ def start(self, print_time):
+ reactor = self._mcu.get_printer().get_reactor()
+ self._trigger_completion = reactor.completion()
+ expire_timeout = TRSYNC_TIMEOUT
+ if len(self._trsyncs) == 1:
+ expire_timeout = TRSYNC_SINGLE_MCU_TIMEOUT
+ for i, trsync in enumerate(self._trsyncs):
+ report_offset = float(i) / len(self._trsyncs)
+ trsync.start(print_time, report_offset,
+ self._trigger_completion, expire_timeout)
+ etrsync = self._trsyncs[0]
+ ffi_main, ffi_lib = chelper.get_ffi()
+ ffi_lib.trdispatch_start(self._trdispatch, etrsync.REASON_HOST_REQUEST)
+ return self._trigger_completion
+ def wait_end(self, end_time):
+ etrsync = self._trsyncs[0]
+ etrsync.set_home_end_time(end_time)
+ if self._mcu.is_fileoutput():
+ self._trigger_completion.complete(True)
+ self._trigger_completion.wait()
+ def stop(self):
+ ffi_main, ffi_lib = chelper.get_ffi()
+ ffi_lib.trdispatch_stop(self._trdispatch)
+ res = [trsync.stop() for trsync in self._trsyncs]
+ if any([r == MCU_trsync.REASON_COMMS_TIMEOUT for r in res]):
+ return MCU_trsync.REASON_COMMS_TIMEOUT
+ return res[0]
+
+class MCU_endstop:
+ def __init__(self, mcu, pin_params):
+ self._mcu = mcu
+ self._pin = pin_params['pin']
+ self._pullup = pin_params['pullup']
+ self._invert = pin_params['invert']
+ self._oid = self._mcu.create_oid()
+ self._home_cmd = self._query_cmd = None
+ self._mcu.register_config_callback(self._build_config)
+ self._rest_ticks = 0
+ self._dispatch = TriggerDispatch(mcu)
+ def get_mcu(self):
+ return self._mcu
+ def add_stepper(self, stepper):
+ self._dispatch.add_stepper(stepper)
+ def get_steppers(self):
+ return self._dispatch.get_steppers()
def _build_config(self):
# Setup config
self._mcu.add_config_cmd("config_endstop oid=%d pin=%s pull_up=%d"
@@ -270,7 +309,7 @@ class MCU_endstop:
" rest_ticks=0 pin_value=0 trsync_oid=0 trigger_reason=0"
% (self._oid,), on_restart=True)
# Lookup commands
- cmd_queue = self._trsyncs[0].get_command_queue()
+ cmd_queue = self._dispatch.get_command_queue()
self._home_cmd = self._mcu.lookup_command(
"endstop_home oid=%c clock=%u sample_ticks=%u sample_count=%c"
" rest_ticks=%u pin_value=%c trsync_oid=%c trigger_reason=%c",
@@ -284,36 +323,20 @@ class MCU_endstop:
clock = self._mcu.print_time_to_clock(print_time)
rest_ticks = self._mcu.print_time_to_clock(print_time+rest_time) - clock
self._rest_ticks = rest_ticks
- reactor = self._mcu.get_printer().get_reactor()
- self._trigger_completion = reactor.completion()
- expire_timeout = TRSYNC_TIMEOUT
- if len(self._trsyncs) == 1:
- expire_timeout = TRSYNC_SINGLE_MCU_TIMEOUT
- for i, trsync in enumerate(self._trsyncs):
- report_offset = float(i) / len(self._trsyncs)
- trsync.start(print_time, report_offset,
- self._trigger_completion, expire_timeout)
- etrsync = self._trsyncs[0]
- ffi_main, ffi_lib = chelper.get_ffi()
- ffi_lib.trdispatch_start(self._trdispatch, etrsync.REASON_HOST_REQUEST)
+ trigger_completion = self._dispatch.start(print_time)
self._home_cmd.send(
[self._oid, clock, self._mcu.seconds_to_clock(sample_time),
sample_count, rest_ticks, triggered ^ self._invert,
- etrsync.get_oid(), etrsync.REASON_ENDSTOP_HIT], reqclock=clock)
- return self._trigger_completion
+ self._dispatch.get_oid(), MCU_trsync.REASON_ENDSTOP_HIT],
+ reqclock=clock)
+ return trigger_completion
def home_wait(self, home_end_time):
- etrsync = self._trsyncs[0]
- etrsync.set_home_end_time(home_end_time)
- if self._mcu.is_fileoutput():
- self._trigger_completion.complete(True)
- self._trigger_completion.wait()
+ self._dispatch.wait_end(home_end_time)
self._home_cmd.send([self._oid, 0, 0, 0, 0, 0, 0, 0])
- ffi_main, ffi_lib = chelper.get_ffi()
- ffi_lib.trdispatch_stop(self._trdispatch)
- res = [trsync.stop() for trsync in self._trsyncs]
- if any([r == etrsync.REASON_COMMS_TIMEOUT for r in res]):
+ res = self._dispatch.stop()
+ if res == MCU_trsync.REASON_COMMS_TIMEOUT:
return -1.
- if res[0] != etrsync.REASON_ENDSTOP_HIT:
+ if res != MCU_trsync.REASON_ENDSTOP_HIT:
return 0.
if self._mcu.is_fileoutput():
return home_end_time