diff --git a/klippy/klippy.py b/klippy/klippy.py index 7af2e9b8..92fe6363 100644 --- a/klippy/klippy.py +++ b/klippy/klippy.py @@ -6,6 +6,7 @@ # This file may be distributed under the terms of the GNU GPLv3 license. import sys, optparse, ConfigParser, logging, time, threading import gcode, toolhead, util, mcu, fan, heater, extruder, reactor, queuelogger +import msgproto message_startup = """ The klippy host software is attempting to connect. Please @@ -19,6 +20,15 @@ command to reload the config and restart the host software. Printer is halted """ +message_protocol_error = """ +This type of error is frequently caused by running an older +version of the firmware on the micro-controller (fix by +recompiling and flashing the firmware). +Once the underlying issue is corrected, use the "RESTART" +command to reload the config and restart the host software. +Protocol error connecting to printer +""" + message_mcu_connect_error = """ This is an unrecoverable error. Please manually restart the micro-controller and then issue the "RESTART" command to @@ -169,6 +179,10 @@ class Printer: logging.exception("Config error") self.state_message = "%s%s" % (str(e), message_restart) self.reactor.update_timer(self.stats_timer, self.reactor.NEVER) + except msgproto.error, e: + logging.exception("Protocol error") + self.state_message = "%s%s" % (str(e), message_protocol_error) + self.reactor.update_timer(self.stats_timer, self.reactor.NEVER) except mcu.error, e: logging.exception("MCU error during connect") self.state_message = "%s%s" % (str(e), message_mcu_connect_error) diff --git a/klippy/mcu.py b/klippy/mcu.py index 5d8fb31f..eddc56a5 100644 --- a/klippy/mcu.py +++ b/klippy/mcu.py @@ -283,7 +283,7 @@ class MCU_adc: minval = 0 if maxval is None: maxval = 0xffff - mcu_adc_max = float(self._mcu.serial.msgparser.config["ADC_MAX"]) + mcu_adc_max = self._mcu.serial.msgparser.get_constant_float("ADC_MAX") max_adc = sample_count * mcu_adc_max self._min_sample = int(minval * max_adc) self._max_sample = min(0xffff, int(math.ceil(maxval * max_adc))) @@ -357,9 +357,9 @@ class MCU: self.serial.connect() self._printer.reactor.update_timer( self._timeout_timer, time.time() + self.COMM_TIMEOUT) - self._mcu_freq = float(self.serial.msgparser.config['CLOCK_FREQ']) - self._stats_sumsq_base = float( - self.serial.msgparser.config['STATS_SUMSQ_BASE']) + self._mcu_freq = self.serial.msgparser.get_constant_float('CLOCK_FREQ') + self._stats_sumsq_base = self.serial.msgparser.get_constant_float( + 'STATS_SUMSQ_BASE') self._emergency_stop_cmd = self.lookup_command("emergency_stop") self._clear_shutdown_cmd = self.lookup_command("clear_shutdown") self.register_msg(self.handle_shutdown, 'shutdown') @@ -424,7 +424,7 @@ class MCU: self._num_oids,)) # Resolve pin names - mcu = self.serial.msgparser.config['MCU'] + mcu = self.serial.msgparser.get_constant('MCU') pin_map = self._config.get('pin_map', None) if pin_map is None: pnames = pins.mcu_to_pins(mcu) diff --git a/klippy/msgproto.py b/klippy/msgproto.py index 76dc0544..c9d14138 100644 --- a/klippy/msgproto.py +++ b/klippy/msgproto.py @@ -308,3 +308,15 @@ class MessageParser: self.static_strings = data.get('static_strings', []) self.config.update(data.get('config', {})) self.version = data.get('version', '') + def get_constant(self, name): + try: + return self.config[name] + except KeyError: + raise error("Firmware constant '%s' not found" % (name,)) + def get_constant_float(self, name): + try: + return float(self.config[name]) + except ValueError: + raise error("Firmware constant '%s' not a float" % (name,)) + except KeyError: + raise error("Firmware constant '%s' not found" % (name,))