diff --git a/klippy/mcu.py b/klippy/mcu.py index f03fd16d..3f88c3e5 100644 --- a/klippy/mcu.py +++ b/klippy/mcu.py @@ -4,7 +4,7 @@ # # This file may be distributed under the terms of the GNU GPLv3 license. import sys, os, zlib, logging, math -import serialhdl, pins, chelper, clocksync +import serialhdl, msgproto, pins, chelper, clocksync class error(Exception): pass @@ -548,17 +548,26 @@ class MCU: raise error("MCU '%s' CRC does not match config" % (self._name,)) # Transmit config messages (if needed) self.register_response(self._handle_starting, 'starting') - if prev_crc is None: - logging.info("Sending MCU '%s' printer configuration...", - self._name) - for c in self._config_cmds: + try: + if prev_crc is None: + logging.info("Sending MCU '%s' printer configuration...", + self._name) + for c in self._config_cmds: + self._serial.send(c) + else: + for c in self._restart_cmds: + self._serial.send(c) + # Transmit init messages + for c in self._init_cmds: self._serial.send(c) - else: - for c in self._restart_cmds: - self._serial.send(c) - # Transmit init messages - for c in self._init_cmds: - self._serial.send(c) + except msgproto.enumeration_error as e: + enum_name, enum_value = e.get_enum_params() + if enum_name == 'pin': + # Raise pin name errors as a config error (not a protocol error) + raise self._printer.config_error( + "Pin '%s' is not a valid pin name on mcu '%s'" + % (enum_value, self._name)) + raise def _send_get_config(self): get_config_cmd = self.lookup_query_command( "get_config", diff --git a/klippy/msgproto.py b/klippy/msgproto.py index cdecd8e7..7391a6f4 100644 --- a/klippy/msgproto.py +++ b/klippy/msgproto.py @@ -86,12 +86,14 @@ class PT_progmem_buffer(PT_string): class PT_buffer(PT_string): pass -MessageTypes = { - '%u': PT_uint32(), '%i': PT_int32(), - '%hu': PT_uint16(), '%hi': PT_int16(), - '%c': PT_byte(), - '%s': PT_string(), '%.*s': PT_progmem_buffer(), '%*s': PT_buffer(), -} +class enumeration_error(error): + def __init__(self, enum_name, value): + self.enum_name = enum_name + self.value = value + error.__init__(self, "Unknown value '%s' in enumeration '%s'" + % (value, enum_name)) + def get_enum_params(self): + return self.enum_name, self.value class Enumeration: is_int = False @@ -105,8 +107,7 @@ class Enumeration: def encode(self, out, v): tv = self.enums.get(v) if tv is None: - raise error("Unknown value '%s' in enumeration '%s'" - % (v, self.enum_name)) + raise enumeration_error(self.enum_name, v) self.pt.encode(out, tv) def parse(self, s, pos): v, pos = self.pt.parse(s, pos) @@ -115,6 +116,13 @@ class Enumeration: tv = "?%d" % (v,) return tv, pos +MessageTypes = { + '%u': PT_uint32(), '%i': PT_int32(), + '%hu': PT_uint16(), '%hi': PT_int16(), + '%c': PT_byte(), + '%s': PT_string(), '%.*s': PT_progmem_buffer(), '%*s': PT_buffer(), +} + # Lookup the message types for a format string def lookup_params(msgformat, enumerations={}): out = []