itersolve: Add support for generating steps from a trapq

Support associating a stepper_kinematics with a trapq.  Support
generating steps from a time range on the given trapq.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2019-10-27 21:05:57 -04:00
parent d3afe4f1d8
commit f3ef9c1889
5 changed files with 158 additions and 10 deletions

View File

@@ -21,11 +21,14 @@ class MCU_stepper:
self._step_dist = 0.
self._min_stop_interval = 0.
self._reset_cmd_id = self._get_position_cmd = None
self._active_callbacks = []
ffi_main, self._ffi_lib = chelper.get_ffi()
self._stepqueue = ffi_main.gc(self._ffi_lib.stepcompress_alloc(oid),
self._ffi_lib.stepcompress_free)
self._mcu.register_stepqueue(self._stepqueue)
self._stepper_kinematics = self._itersolve_gen_steps = None
self._itersolve_generate_steps = self._itersolve_check_active = None
self._trapq = ffi_main.NULL
self.set_ignore_move(False)
def get_mcu(self):
return self._mcu
@@ -95,12 +98,16 @@ class MCU_stepper:
sk, self._stepqueue, self._step_dist)
return old_sk
def set_ignore_move(self, ignore_move):
was_ignore = (self._itersolve_gen_steps
is not self._ffi_lib.itersolve_gen_steps)
fl = self._ffi_lib
was_ignore = self._itersolve_gen_steps is not fl.itersolve_gen_steps
if ignore_move:
self._itersolve_gen_steps = (lambda *args: 0)
self._itersolve_generate_steps = (lambda *args: 0)
self._itersolve_check_active = (lambda *args: 0.)
else:
self._itersolve_gen_steps = self._ffi_lib.itersolve_gen_steps
self._itersolve_gen_steps = fl.itersolve_gen_steps
self._itersolve_generate_steps = fl.itersolve_generate_steps
self._itersolve_check_active = fl.itersolve_check_active
return was_ignore
def note_homing_end(self, did_trigger=False):
ret = self._ffi_lib.stepcompress_reset(self._stepqueue, 0)
@@ -124,6 +131,31 @@ class MCU_stepper:
ret = self._itersolve_gen_steps(self._stepper_kinematics, cmove)
if ret:
raise error("Internal error in stepcompress")
def set_trapq(self, tq):
if tq is None:
ffi_main, self._ffi_lib = chelper.get_ffi()
tq = ffi_main.NULL
self._ffi_lib.itersolve_set_trapq(self._stepper_kinematics, tq)
old_tq = self._trapq
self._trapq = tq
return old_tq
def add_active_callback(self, cb):
self._active_callbacks.append(cb)
def generate_steps(self, flush_time):
# Check for activity if necessary
if self._active_callbacks:
ret = self._itersolve_check_active(self._stepper_kinematics,
flush_time)
if ret:
cbs = self._active_callbacks
self._active_callbacks = []
for cb in cbs:
cb(ret)
# Generate steps
ret = self._itersolve_generate_steps(self._stepper_kinematics,
flush_time)
if ret:
raise error("Internal error in stepcompress")
class MCU_endstop:
class TimeoutError(Exception):