aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/mcu.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-02-06 11:37:03 -0500
committerKevin O'Connor <kevin@koconnor.net>2017-02-06 12:17:50 -0500
commit19ed67331d7c957cc26f750b7d3cce23688753e4 (patch)
tree65c892f501734d11aaa048e0c9df84f2bb4829f0 /klippy/mcu.py
parent667b72870f122c5cb08a3abf7c692f824e24383c (diff)
downloadkutter-19ed67331d7c957cc26f750b7d3cce23688753e4.tar.gz
kutter-19ed67331d7c957cc26f750b7d3cce23688753e4.tar.xz
kutter-19ed67331d7c957cc26f750b7d3cce23688753e4.zip
stepcompress: Propagate errors back to python code
Propagate error codes back to the python code and raise an exception on an error. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/mcu.py')
-rw-r--r--klippy/mcu.py51
1 files changed, 34 insertions, 17 deletions
diff --git a/klippy/mcu.py b/klippy/mcu.py
index eddc56a5..4fadc13d 100644
--- a/klippy/mcu.py
+++ b/klippy/mcu.py
@@ -19,6 +19,8 @@ def parse_pin_extras(pin, can_pullup=False):
pin = pin[1:].strip()
return pin, pullup, invert
+STEPCOMPRESS_ERROR_RET = -989898989
+
class MCU_stepper:
def __init__(self, mcu, step_pin, dir_pin, min_stop_interval, max_error):
self._mcu = mcu
@@ -59,18 +61,31 @@ class MCU_stepper:
def get_mcu_position(self):
return self.commanded_position + self._mcu_position_offset
def note_homing_start(self, homing_clock):
- self.ffi_lib.stepcompress_set_homing(self._stepqueue, homing_clock)
+ ret = self.ffi_lib.stepcompress_set_homing(self._stepqueue, homing_clock)
+ if ret:
+ raise error("Internal error in stepcompress")
def note_homing_finalized(self):
- self.ffi_lib.stepcompress_set_homing(self._stepqueue, 0)
- self.ffi_lib.stepcompress_reset(self._stepqueue, 0)
+ ret = self.ffi_lib.stepcompress_set_homing(self._stepqueue, 0)
+ if ret:
+ raise error("Internal error in stepcompress")
+ ret = self.ffi_lib.stepcompress_reset(self._stepqueue, 0)
+ if ret:
+ raise error("Internal error in stepcompress")
def reset_step_clock(self, mcu_time):
clock = int(mcu_time * self._mcu_freq)
- self.ffi_lib.stepcompress_reset(self._stepqueue, clock)
+ ret = self.ffi_lib.stepcompress_reset(self._stepqueue, clock)
+ if ret:
+ raise error("Internal error in stepcompress")
data = (self._reset_cmd.msgid, self._oid, clock & 0xffffffff)
- self.ffi_lib.stepcompress_queue_msg(self._stepqueue, data, len(data))
+ ret = self.ffi_lib.stepcompress_queue_msg(
+ self._stepqueue, data, len(data))
+ if ret:
+ raise error("Internal error in stepcompress")
def step(self, mcu_time, sdir):
clock = mcu_time * self._mcu_freq
- self.ffi_lib.stepcompress_push(self._stepqueue, clock, sdir)
+ ret = self.ffi_lib.stepcompress_push(self._stepqueue, clock, sdir)
+ if ret:
+ raise error("Internal error in stepcompress")
if sdir:
self.commanded_position += 1
else:
@@ -81,12 +96,16 @@ class MCU_stepper:
count = self.ffi_lib.stepcompress_push_sqrt(
self._stepqueue, steps, step_offset, clock
, sqrt_offset * mcu_freq2, factor * mcu_freq2)
+ if count == STEPCOMPRESS_ERROR_RET:
+ raise error("Internal error in stepcompress")
self.commanded_position += count
return count
def step_factor(self, mcu_time, steps, step_offset, factor):
clock = mcu_time * self._mcu_freq
count = self.ffi_lib.stepcompress_push_factor(
self._stepqueue, steps, step_offset, clock, factor * self._mcu_freq)
+ if count == STEPCOMPRESS_ERROR_RET:
+ raise error("Internal error in stepcompress")
self.commanded_position += count
return count
def step_delta_const(self, mcu_time, dist, start_pos
@@ -97,6 +116,8 @@ class MCU_stepper:
self._stepqueue, clock, dist, start_pos
, inv_velocity * self._mcu_freq, step_dist
, height, closestxy_d, closest_height2, movez_r)
+ if count == STEPCOMPRESS_ERROR_RET:
+ raise error("Internal error in stepcompress")
self.commanded_position += count
return count
def step_delta_accel(self, mcu_time, dist, start_pos
@@ -108,10 +129,10 @@ class MCU_stepper:
self._stepqueue, clock, dist, start_pos
, accel_multiplier * mcu_freq2, step_dist
, height, closestxy_d, closest_height2, movez_r)
+ if count == STEPCOMPRESS_ERROR_RET:
+ raise error("Internal error in stepcompress")
self.commanded_position += count
return count
- def get_errors(self):
- return self.ffi_lib.stepcompress_get_errors(self._stepqueue)
class MCU_endstop:
error = error
@@ -390,15 +411,9 @@ class MCU:
self.ffi_lib.steppersync_free(self._steppersync)
self._steppersync = None
def stats(self, eventtime):
- stats = self.serial.stats(eventtime)
- stats += " mcu_task_avg=%.06f mcu_task_stddev=%.06f" % (
+ return "%s mcu_task_avg=%.06f mcu_task_stddev=%.06f" % (
+ self.serial.stats(eventtime),
self._mcu_tick_avg, self._mcu_tick_stddev)
- err = 0
- for s in self._steppers:
- err += s.get_errors()
- if err:
- stats += " step_errors=%d" % (err,)
- return stats
def force_shutdown(self):
self.send(self._emergency_stop_cmd.encode())
def clear_shutdown(self):
@@ -527,7 +542,9 @@ class MCU:
return
mcu_time = print_time + self._print_start_time
clock = int(mcu_time * self._mcu_freq)
- self.ffi_lib.steppersync_flush(self._steppersync, clock)
+ ret = self.ffi_lib.steppersync_flush(self._steppersync, clock)
+ if ret:
+ raise error("Internal error in stepcompress")
def pause(self, waketime):
return self._printer.reactor.pause(waketime)
def __del__(self):