motion_queuing: Move remaining steppersync logic from mcu module

Move the last parts of the steppersync logic into the motion_queuing
module.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2025-09-04 12:54:03 -04:00
parent 22db9bb84e
commit 3bed65f10f
2 changed files with 16 additions and 16 deletions

View File

@@ -65,7 +65,8 @@ class PrinterMotionQueuing:
ffi_lib.stepcompress_free) ffi_lib.stepcompress_free)
self.stepcompress.append((mcu, sc)) self.stepcompress.append((mcu, sc))
return sc return sc
def allocate_steppersync(self, mcu, serialqueue, move_count): def setup_mcu_movequeue(self, mcu, serialqueue, move_count):
# Setup steppersync object for the mcu's main movequeue
stepqueues = [] stepqueues = []
for sc_mcu, sc in self.stepcompress: for sc_mcu, sc in self.stepcompress:
if sc_mcu is mcu: if sc_mcu is mcu:
@@ -76,7 +77,8 @@ class PrinterMotionQueuing:
move_count), move_count),
ffi_lib.steppersync_free) ffi_lib.steppersync_free)
self.steppersyncs.append((mcu, ss)) self.steppersyncs.append((mcu, ss))
return ss mcu_freq = float(mcu.seconds_to_clock(1.))
ffi_lib.steppersync_set_time(ss, 0., mcu_freq)
def register_flush_callback(self, callback): def register_flush_callback(self, callback):
self.flush_callbacks.append(callback) self.flush_callbacks.append(callback)
def unregister_flush_callback(self, callback): def unregister_flush_callback(self, callback):
@@ -118,9 +120,12 @@ class PrinterMotionQueuing:
ffi_main, ffi_lib = chelper.get_ffi() ffi_main, ffi_lib = chelper.get_ffi()
return ffi_lib.trapq_append return ffi_lib.trapq_append
def stats(self, eventtime): def stats(self, eventtime):
# Hack to globally invoke mcu check_active() # Globally calibrate mcu clocks (and step generation clocks)
for m in self.all_mcus: sync_time = self.last_step_gen_time
m.check_active(self.last_step_gen_time, eventtime) ffi_main, ffi_lib = chelper.get_ffi()
for mcu, ss in self.steppersyncs:
offset, freq = mcu.calibrate_clock(sync_time, eventtime)
ffi_lib.steppersync_set_time(ss, offset, freq)
# Calculate history expiration # Calculate history expiration
est_print_time = self.mcu.estimated_print_time(eventtime) est_print_time = self.mcu.estimated_print_time(eventtime)
self.clear_history_time = est_print_time - MOVE_HISTORY_EXPIRE self.clear_history_time = est_print_time - MOVE_HISTORY_EXPIRE

View File

@@ -604,11 +604,9 @@ class MCU:
self._init_cmds = [] self._init_cmds = []
self._mcu_freq = 0. self._mcu_freq = 0.
# Move command queuing # Move command queuing
ffi_main, self._ffi_lib = chelper.get_ffi()
self._max_stepper_error = config.getfloat('max_stepper_error', 0.000025, self._max_stepper_error = config.getfloat('max_stepper_error', 0.000025,
minval=0.) minval=0.)
self._reserved_move_slots = 0 self._reserved_move_slots = 0
self._steppersync = None
# Stats # Stats
self._get_status_info = {} self._get_status_info = {}
self._stats_sumsq_base = 0. self._stats_sumsq_base = 0.
@@ -773,10 +771,8 @@ class MCU:
raise error("Too few moves available on MCU '%s'" % (self._name,)) raise error("Too few moves available on MCU '%s'" % (self._name,))
ss_move_count = move_count - self._reserved_move_slots ss_move_count = move_count - self._reserved_move_slots
motion_queuing = self._printer.lookup_object('motion_queuing') motion_queuing = self._printer.lookup_object('motion_queuing')
self._steppersync = motion_queuing.allocate_steppersync( motion_queuing.setup_mcu_movequeue(
self, self._serial.get_serialqueue(), ss_move_count) self, self._serial.get_serialqueue(), ss_move_count)
self._ffi_lib.steppersync_set_time(self._steppersync,
0., self._mcu_freq)
# Log config information # Log config information
move_msg = "Configured MCU '%s' (%d moves)" % (self._name, move_count) move_msg = "Configured MCU '%s' (%d moves)" % (self._name, move_count)
logging.info(move_msg) logging.info(move_msg)
@@ -919,7 +915,6 @@ class MCU:
# Restarts # Restarts
def _disconnect(self): def _disconnect(self):
self._serial.disconnect() self._serial.disconnect()
self._steppersync = None
def _shutdown(self, force=False): def _shutdown(self, force=False):
if (self._emergency_stop_cmd is None if (self._emergency_stop_cmd is None
or (self._is_shutdown and not force)): or (self._is_shutdown and not force)):
@@ -974,11 +969,7 @@ class MCU:
# Move queue tracking # Move queue tracking
def request_move_queue_slot(self): def request_move_queue_slot(self):
self._reserved_move_slots += 1 self._reserved_move_slots += 1
def check_active(self, print_time, eventtime): def _check_timeout(self, eventtime):
if self._steppersync is None:
return
offset, freq = self._clocksync.calibrate_clock(print_time, eventtime)
self._ffi_lib.steppersync_set_time(self._steppersync, offset, freq)
if (self._clocksync.is_active() or self.is_fileoutput() if (self._clocksync.is_active() or self.is_fileoutput()
or self._is_timeout): or self._is_timeout):
return return
@@ -987,6 +978,10 @@ class MCU:
self._name, eventtime) self._name, eventtime)
self._printer.invoke_shutdown("Lost communication with MCU '%s'" % ( self._printer.invoke_shutdown("Lost communication with MCU '%s'" % (
self._name,)) self._name,))
def calibrate_clock(self, print_time, eventtime):
offset, freq = self._clocksync.calibrate_clock(print_time, eventtime)
self._check_timeout(eventtime)
return offset, freq
# Misc external commands # Misc external commands
def is_fileoutput(self): def is_fileoutput(self):
return self._printer.get_start_args().get('debugoutput') is not None return self._printer.get_start_args().get('debugoutput') is not None