From 8fe8a6deb3b7ea3eca8730d5b1500c2c27c251cd Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sun, 2 Sep 2018 13:07:43 -0400 Subject: [PATCH] statistics: Move stats handling to new "extras" module Move the generation of statistics to its own module. Signed-off-by: Kevin O'Connor --- klippy/extras/statistics.py | 29 +++++++++++++++++++++++++++++ klippy/klippy.py | 15 +-------------- klippy/toolhead.py | 1 + 3 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 klippy/extras/statistics.py diff --git a/klippy/extras/statistics.py b/klippy/extras/statistics.py new file mode 100644 index 00000000..639bcad3 --- /dev/null +++ b/klippy/extras/statistics.py @@ -0,0 +1,29 @@ +# Support for logging periodic statistics +# +# Copyright (C) 2018 Kevin O'Connor +# +# This file may be distributed under the terms of the GNU GPLv3 license. +import logging + +class PrinterStats: + def __init__(self, config): + self.printer = config.get_printer() + reactor = self.printer.get_reactor() + self.stats_timer = reactor.register_timer(self.generate_stats) + self.stats_cb = [] + def printer_state(self, state): + if state == 'ready': + self.stats_cb = [o.stats for n, o in self.printer.lookup_objects() + if hasattr(o, 'stats')] + if self.printer.get_start_args().get('debugoutput') is None: + reactor = self.printer.get_reactor() + reactor.update_timer(self.stats_timer, reactor.NOW) + def generate_stats(self, eventtime): + stats = [cb(eventtime) for cb in self.stats_cb] + if max([s[0] for s in stats]): + logging.info("Stats %.1f: %s", eventtime, + ' '.join([s[1] for s in stats])) + return eventtime + 1. + +def load_config(config): + return PrinterStats(config) diff --git a/klippy/klippy.py b/klippy/klippy.py index d5dc8dae..37c28ff3 100644 --- a/klippy/klippy.py +++ b/klippy/klippy.py @@ -135,12 +135,10 @@ class Printer: self.reactor = reactor.Reactor() gc = gcode.GCodeParser(self, input_fd) self.objects = collections.OrderedDict({'gcode': gc}) - self.stats_timer = self.reactor.register_timer(self._stats) self.reactor.register_callback(self._connect) self.state_message = message_startup self.is_shutdown = False self.run_result = None - self.stats_cb = [] self.state_cb = [] def get_start_args(self): return self.start_args @@ -177,12 +175,6 @@ class Printer: logging.info(info) if self.bglogger is not None: self.bglogger.set_rollover_info(name, info) - def _stats(self, eventtime, force_output=False): - stats = [cb(eventtime) for cb in self.stats_cb] - if max([s[0] for s in stats] + [force_output]): - logging.info("Stats %.1f: %s", eventtime, - ' '.join([s[1] for s in stats])) - return eventtime + 1. def try_load_module(self, config, section): if section in self.objects: return self.objects[section] @@ -233,9 +225,7 @@ class Printer: raise self.config_error( "Option '%s' is not valid in section '%s'" % ( option, section)) - # Determine which printer objects have stats/state callbacks - self.stats_cb = [o.stats for o in self.objects.values() - if hasattr(o, 'stats')] + # Determine which printer objects have state callbacks self.state_cb = [o.printer_state for o in self.objects.values() if hasattr(o, 'printer_state')] def _connect(self, eventtime): @@ -250,8 +240,6 @@ class Printer: if self.state_message is not message_ready: return self.reactor.NEVER cb('ready') - if self.start_args.get('debugoutput') is None: - self.reactor.update_timer(self.stats_timer, self.reactor.NOW) except (self.config_error, pins.error) as e: logging.exception("Config error") self._set_state("%s%s" % (str(e), message_restart)) @@ -281,7 +269,6 @@ class Printer: # Check restart flags run_result = self.run_result try: - self._stats(self.reactor.monotonic(), force_output=True) if run_result == 'firmware_restart': for n, m in self.lookup_objects(module='mcu'): m.microcontroller_restart() diff --git a/klippy/toolhead.py b/klippy/toolhead.py index 71a2b7e6..d94eddad 100644 --- a/klippy/toolhead.py +++ b/klippy/toolhead.py @@ -233,6 +233,7 @@ class ToolHead: self.flush_timer = self.reactor.register_timer(self._flush_handler) self.move_queue.set_flush_time(self.buffer_time_high) self.printer.try_load_module(config, "idle_timeout") + self.printer.try_load_module(config, "statistics") # Setup iterative solver ffi_main, ffi_lib = chelper.get_ffi() self.cmove = ffi_main.gc(ffi_lib.move_alloc(), ffi_lib.free)