diff --git a/klippy/gcode.py b/klippy/gcode.py index 3c545f684..34c540864 100644 --- a/klippy/gcode.py +++ b/klippy/gcode.py @@ -6,12 +6,9 @@ import os, re, logging, collections, shlex import homing, kinematics.extruder -class error(Exception): - pass - # Parse and handle G-Code commands class GCodeParser: - error = error + error = homing.CommandError RETRY_TIME = 0.100 def __init__(self, printer, fd): self.printer = printer @@ -220,7 +217,7 @@ class GCodeParser: handler = self.gcode_handlers.get(cmd, self.cmd_default) try: handler(params) - except error as e: + except self.error as e: self.respond_error(str(e)) self.reset_last_position() if not need_ack: @@ -290,7 +287,7 @@ class GCodeParser: self.is_processing_data = True try: self._process_commands(commands, need_ack=False) - except error as e: + except self.error as e: if self.pending_commands: self._process_pending() self.is_processing_data = False @@ -355,25 +352,25 @@ class GCodeParser: minval=None, maxval=None, above=None, below=None): if name not in params: if default is self.sentinel: - raise error("Error on '%s': missing %s" % ( + raise self.error("Error on '%s': missing %s" % ( params['#original'], name)) return default try: value = parser(params[name]) except: - raise error("Error on '%s': unable to parse %s" % ( + raise self.error("Error on '%s': unable to parse %s" % ( params['#original'], params[name])) if minval is not None and value < minval: - raise error("Error on '%s': %s must have minimum of %s" % ( + raise self.error("Error on '%s': %s must have minimum of %s" % ( params['#original'], name, minval)) if maxval is not None and value > maxval: - raise error("Error on '%s': %s must have maximum of %s" % ( + raise self.error("Error on '%s': %s must have maximum of %s" % ( params['#original'], name, maxval)) if above is not None and value <= above: - raise error("Error on '%s': %s must be above %s" % ( + raise self.error("Error on '%s': %s must be above %s" % ( params['#original'], name, above)) if below is not None and value >= below: - raise error("Error on '%s': %s must be below %s" % ( + raise self.error("Error on '%s': %s must be below %s" % ( params['#original'], name, below)) return value def get_int(self, name, params, default=sentinel, minval=None, maxval=None): @@ -400,7 +397,7 @@ class GCodeParser: eparams.update({k: params[k] for k in params if k.startswith('#')}) return eparams except ValueError as e: - raise error("Malformed command '%s'" % (params['#original'],)) + raise self.error("Malformed command '%s'" % (params['#original'],)) # Temperature wrappers def _get_temp(self, eventtime): # Tn:XXX /YYY B:XXX /YYY @@ -440,7 +437,7 @@ class GCodeParser: try: heater.set_temp(print_time, temp) except heater.error as e: - raise error(str(e)) + raise self.error(str(e)) if wait and temp: self.bg_temp(heater) def _set_fan_speed(self, speed): @@ -481,7 +478,7 @@ class GCodeParser: try: self.toolhead.set_extruder(e) except homing.EndstopError as e: - raise error(str(e)) + raise self.error(str(e)) self.extruder = e self.reset_last_position() self.extrude_factor = 1. @@ -494,7 +491,8 @@ class GCodeParser: else: key_param = self.get_str(key, params) if key_param not in values: - raise error("The value '%s' is not valid for %s" % (key_param, key)) + raise self.error("The value '%s' is not valid for %s" % ( + key_param, key)) values[key_param](params) all_handlers = [ 'G1', 'G4', 'G28', 'M18', 'M400', @@ -529,15 +527,16 @@ class GCodeParser: if 'F' in params: gcode_speed = float(params['F']) if gcode_speed <= 0.: - raise error("Invalid speed in '%s'" % ( + raise self.error("Invalid speed in '%s'" % ( params['#original'],)) self.speed = gcode_speed * self.speed_factor except ValueError as e: - raise error("Unable to parse move '%s'" % (params['#original'],)) + raise self.error("Unable to parse move '%s'" % ( + params['#original'],)) try: self.move_with_transform(self.last_position, self.speed) except homing.EndstopError as e: - raise error(str(e)) + raise self.error(str(e)) def cmd_G4(self, params): # Dwell if 'S' in params: @@ -559,7 +558,7 @@ class GCodeParser: try: homing_state.home_axes(axes) except homing.EndstopError as e: - raise error(str(e)) + raise self.error(str(e)) for axis in homing_state.get_axes(): self.base_position[axis] = self.homing_position[axis] self.reset_last_position() @@ -636,7 +635,7 @@ class GCodeParser: try: self.move_with_transform(self.last_position, speed) except homing.EndstopError as e: - raise error(str(e)) + raise self.error(str(e)) def cmd_M206(self, params): # Offset axes offsets = { self.axis2pos[a]: -self.get_float(a, params) @@ -662,7 +661,7 @@ class GCodeParser: state_name = self.get_str('NAME', params, 'default') state = self.saved_states.get(state_name) if state is None: - raise error("Unknown g-code state: %s" % (state_name,)) + raise self.error("Unknown g-code state: %s" % (state_name,)) # Restore state self.absolute_coord = state['absolute_coord'] self.absolute_extrude = state['absolute_extrude'] @@ -681,7 +680,7 @@ class GCodeParser: try: self.move_with_transform(self.last_position, speed) except homing.EndstopError as e: - raise error(str(e)) + raise self.error(str(e)) # G-Code temperature and fan commands cmd_M105_when_not_ready = True def cmd_M105(self, params): diff --git a/klippy/homing.py b/klippy/homing.py index f6f7e5d8c..ce37487d2 100644 --- a/klippy/homing.py +++ b/klippy/homing.py @@ -146,7 +146,10 @@ class Homing: self.toolhead.motor_off() raise -class EndstopError(Exception): +class CommandError(Exception): + pass + +class EndstopError(CommandError): pass def EndstopMoveError(pos, msg="Move out of range"):