aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--klippy/extras/statistics.py29
-rw-r--r--klippy/klippy.py15
-rw-r--r--klippy/toolhead.py1
3 files changed, 31 insertions, 14 deletions
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 <kevin@koconnor.net>
+#
+# 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)