diff --git a/docs/Command_Templates.md b/docs/Command_Templates.md index 57a5fa91..f2c5699b 100644 --- a/docs/Command_Templates.md +++ b/docs/Command_Templates.md @@ -288,6 +288,16 @@ The following are common printer attributes: - `printer.hall_filament_width_sensor.Diameter`, `printer.hall_filament_width_sensor.Raw`: The last read values from the sensor. +- `printer.mcu.mcu_version`: The Klipper code version reported by the + micro-controller. +- `printer.mcu.mcu_build_versions`: Information on the build tools + used to generate the micro-controller code (as reported by the + micro-controller). +- `printer.mcu.mcu_constants.`: Compile time constants + reported by the micro-controller. The available constants may differ + between micro-controller architectures and with each code revision. +- `printer.mcu.last_stats.`: Statistics information + on the micro-controller connection. The above list is subject to change - if using an attribute be sure to review the [Config Changes document](Config_Changes.md) when upgrading diff --git a/klippy/mcu.py b/klippy/mcu.py index e9a7a74a..7032df5d 100644 --- a/klippy/mcu.py +++ b/klippy/mcu.py @@ -447,6 +447,7 @@ class MCU: self._stepqueues = [] self._steppersync = None # Stats + self._get_status_info = {} self._stats_sumsq_base = 0. self._mcu_tick_avg = 0. self._mcu_tick_stddev = 0. @@ -630,9 +631,13 @@ class MCU: self._reset_cmd = self.try_lookup_command("reset") self._config_reset_cmd = self.try_lookup_command("config_reset") ext_only = self._reset_cmd is None and self._config_reset_cmd is None - mbaud = self._serial.get_msgparser().get_constant('SERIAL_BAUD', None) + msgparser = self._serial.get_msgparser() + mbaud = msgparser.get_constant('SERIAL_BAUD', None) if self._restart_method is None and mbaud is None and not ext_only: self._restart_method = 'command' + self._get_status_info['mcu_version'] = msgparser.version + self._get_status_info['mcu_build_versions'] = msgparser.build_versions + self._get_status_info['mcu_constants'] = msgparser.get_constants() self.register_response(self._handle_shutdown, 'shutdown') self.register_response(self._handle_shutdown, 'is_shutdown') self.register_response(self._handle_mcu_stats, 'stats') @@ -782,12 +787,17 @@ class MCU: self._name, eventtime) self._printer.invoke_shutdown("Lost communication with MCU '%s'" % ( self._name,)) + def get_status(self, eventtime): + return dict(self._get_status_info) def stats(self, eventtime): - msg = "%s: mcu_awake=%.03f mcu_task_avg=%.06f mcu_task_stddev=%.06f" % ( - self._name, self._mcu_tick_awake, self._mcu_tick_avg, - self._mcu_tick_stddev) - return False, ' '.join([msg, self._serial.stats(eventtime), - self._clocksync.stats(eventtime)]) + load = "mcu_awake=%.03f mcu_task_avg=%.06f mcu_task_stddev=%.06f" % ( + self._mcu_tick_awake, self._mcu_tick_avg, self._mcu_tick_stddev) + stats = ' '.join([load, self._serial.stats(eventtime), + self._clocksync.stats(eventtime)]) + parts = [s.split('=', 1) for s in stats.split()] + last_stats = {k:(float(v) if '.' in v else int(v)) for k, v in parts} + self._get_status_info['last_stats'] = last_stats + return False, '%s: %s' % (self._name, stats) Common_MCU_errors = { ("Timer too close", "No next step", "Missed scheduling of next "): """