From c0b4b464bd5951dbd635492db291c12d0fc84dbc Mon Sep 17 00:00:00 2001 From: Jordan Ruthe Date: Sun, 21 Feb 2021 12:19:30 -0500 Subject: [PATCH] Changes to logging implementation --- ks_includes/KlippyGtk.py | 4 +- ks_includes/KlippyRest.py | 6 +- ks_includes/KlippyWebsocket.py | 57 +++++++------ ks_includes/config.py | 14 ++-- ks_includes/files.py | 20 ++--- ks_includes/functions.py | 80 ++++++++++++++++++ ks_includes/printer.py | 16 ++-- ks_includes/screen_panel.py | 5 +- ks_includes/wifi.py | 8 +- panels/bed_level.py | 22 +++-- panels/bed_mesh.py | 6 +- panels/example.py | 2 - panels/extrude.py | 2 - panels/fan.py | 2 - panels/fine_tune.py | 4 +- panels/gcode_macros.py | 6 +- panels/job_status.py | 14 ++-- panels/main_menu.py | 2 - panels/menu.py | 10 +-- panels/move.py | 2 - panels/network.py | 2 - panels/power.py | 4 +- panels/preheat.py | 4 +- panels/print.py | 12 ++- panels/settings.py | 12 ++- panels/splash_screen.py | 6 +- panels/system.py | 2 - panels/temperature.py | 4 +- panels/zcalibrate.py | 7 +- screen.py | 145 +++++++++++++-------------------- 30 files changed, 239 insertions(+), 241 deletions(-) create mode 100644 ks_includes/functions.py diff --git a/ks_includes/KlippyGtk.py b/ks_includes/KlippyGtk.py index 71dcc45a..cf518695 100644 --- a/ks_includes/KlippyGtk.py +++ b/ks_includes/KlippyGtk.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Pango import os klipperscreendir = os.getcwd() -logger = logging.getLogger("KlipperScreen.KlippyGtk") - class KlippyGtk: labels = {} font_ratio = 51 @@ -27,7 +25,7 @@ class KlippyGtk: self.header_image_scale_width = 1.2 self.header_image_scale_height = 1.4 - logger.debug("img width: %s height: %s" % (self.img_width, self.img_height)) + logging.debug("img width: %s height: %s" % (self.img_width, self.img_height)) def get_action_bar_width(self): return self.action_bar_width diff --git a/ks_includes/KlippyRest.py b/ks_includes/KlippyRest.py index d7512d4b..9e9d6420 100644 --- a/ks_includes/KlippyRest.py +++ b/ks_includes/KlippyRest.py @@ -2,8 +2,6 @@ import json import requests import logging -logger = logging.getLogger("KlipperScreen.KlippyRest") - class KlippyRest: def __init__(self, ip, port=7125, api_key=False): self.ip = ip @@ -24,7 +22,7 @@ class KlippyRest: def send_request(self, method): url = "http://%s:%s/%s" % (self.ip, self.port, method) - logger.debug("Sending request to %s" % url) + logging.debug("Sending request to %s" % url) headers = {} if self.api_key == False else {"x-api-key":self.api_key} try: r = requests.get(url, headers=headers) @@ -37,7 +35,7 @@ class KlippyRest: try: data = json.loads(r.content) except: - logger.exception("Unable to parse response from moonraker:\n %s" % r.content) + logging.exception("Unable to parse response from moonraker:\n %s" % r.content) return False return data diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 2bef6082..a385c2e4 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -9,7 +9,6 @@ import requests import websocket import asyncio import logging -logger = logging.getLogger("KlipperScreen.KlipperWebsocket") gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib @@ -56,7 +55,7 @@ class KlippyWebsocket(threading.Thread): try: token = self._screen.apiclient.get_oneshot_token() except: - logger.debug("Unable to get oneshot token") + logging.debug("Unable to get oneshot token") return False self.ws_url = "ws://%s/websocket?token=%s" % (self._url, token) @@ -72,7 +71,7 @@ class KlippyWebsocket(threading.Thread): try: self._wst.start() except Exception: - logger.debug("Error starting web socket") + logging.debug("Error starting web socket") def close(self): self.closing = True @@ -122,8 +121,8 @@ class KlippyWebsocket(threading.Thread): return True def on_open(self, ws): - logger.info("Moonraker Websocket Open") - logger.info("Self.connected = %s" % self.is_connected()) + logging.info("Moonraker Websocket Open") + logging.info("Self.connected = %s" % self.is_connected()) self.connected = True self.timeout = None if "on_connect" in self._callback: @@ -134,15 +133,15 @@ class KlippyWebsocket(threading.Thread): def on_close(self, ws): if self.is_connected() == False: - logger.debug("Connection already closed") + logging.debug("Connection already closed") return if self.closing == True: - logger.debug("Closing websocket") + logging.debug("Closing websocket") self.ws.stop() return - logger.info("Moonraker Websocket Closed") + logging.info("Moonraker Websocket Closed") self.connected = False if self.timeout == None: self.timeout = GLib.timeout_add(500, self.reconnect) @@ -155,9 +154,9 @@ class KlippyWebsocket(threading.Thread): ) def reconnect(self): - logger.debug("Attempting to reconnect") + logging.debug("Attempting to reconnect") if self.is_connected(): - logger.debug("Reconnected") + logging.debug("Reconnected") return False self.connect() @@ -165,7 +164,7 @@ class KlippyWebsocket(threading.Thread): def on_error(self, ws, error): - logger.debug("Websocket error: %s" % error) + logging.debug("Websocket error: %s" % error) if error.status_code == 401: # Check for any pending reconnects and remove. No amount of trying will help if self.timeout != None: @@ -181,13 +180,13 @@ class MoonrakerApi: self._ws = ws def emergency_stop(self): - logger.info("Sending printer.emergency_stop") + logging.info("Sending printer.emergency_stop") return self._ws.send_method( "printer.emergency_stop" ) def gcode_script(self, script, callback=None, *args): - logger.debug("Sending printer.gcode.script: %s", script) + logging.debug("Sending printer.gcode.script: %s", script) return self._ws.send_method( "printer.gcode.script", {"script": script}, @@ -197,7 +196,7 @@ class MoonrakerApi: def get_file_list(self, callback=None, *args): #Commenting this log for being too noisy - #logger.debug("Sending server.files.list") + #logging.debug("Sending server.files.list") return self._ws.send_method( "server.files.list", {}, @@ -206,7 +205,7 @@ class MoonrakerApi: ) def get_file_metadata(self, filename, callback=None, *args): - logger.debug("Sending server.files.metadata: %s", filename) + logging.debug("Sending server.files.metadata: %s", filename) return self._ws.send_method( "server.files.metadata", {"filename": filename}, @@ -215,14 +214,14 @@ class MoonrakerApi: ) def object_subscription(self, updates): - logger.debug("Sending printer.objects.subscribe: %s", str(updates)) + logging.debug("Sending printer.objects.subscribe: %s", str(updates)) return self._ws.send_method( "printer.objects.subscribe", updates ) def power_device_off(self, device, callback=None, *args): - logger.debug("Sending machine.device_power.off: %s" % device) + logging.debug("Sending machine.device_power.off: %s" % device) return self._ws.send_method( "machine.device_power.off", {device: False}, @@ -231,7 +230,7 @@ class MoonrakerApi: ) def power_device_on(self, device, callback=None, *args): - logger.debug("Sending machine.device_power.on %s" % device) + logging.debug("Sending machine.device_power.on %s" % device) return self._ws.send_method( "machine.device_power.on", {device: False}, @@ -240,7 +239,7 @@ class MoonrakerApi: ) def print_cancel(self, callback=None, *args): - logger.debug("Sending printer.print.cancel") + logging.debug("Sending printer.print.cancel") return self._ws.send_method( "printer.print.cancel", {}, @@ -249,7 +248,7 @@ class MoonrakerApi: ) def print_pause(self, callback=None, *args): - logger.debug("Sending printer.print.pause") + logging.debug("Sending printer.print.pause") return self._ws.send_method( "printer.print.pause", {}, @@ -258,7 +257,7 @@ class MoonrakerApi: ) def print_resume(self, callback=None, *args): - logger.debug("Sending printer.print.resume") + logging.debug("Sending printer.print.resume") return self._ws.send_method( "printer.print.resume", {}, @@ -267,7 +266,7 @@ class MoonrakerApi: ) def print_start(self, filename, callback=None, *args): - logger.debug("Sending printer.print.start") + logging.debug("Sending printer.print.start") return self._ws.send_method( "printer.print.start", { @@ -279,7 +278,7 @@ class MoonrakerApi: def temperature_set(self, heater, target, callback=None, *args): if heater == "heater_bed": - logger.debug("Sending printer.gcode.script: %s", KlippyGcodes.set_bed_temp(target)) + logging.debug("Sending printer.gcode.script: %s", KlippyGcodes.set_bed_temp(target)) return self._ws.send_method( "printer.gcode.script", { @@ -289,7 +288,7 @@ class MoonrakerApi: *args ) else: - logger.debug("Sending printer.gcode.script: %s", + logging.debug("Sending printer.gcode.script: %s", KlippyGcodes.set_ext_temp(target, heater.replace("tool",""))) #TODO: Add max/min limits return self._ws.send_method( @@ -302,7 +301,7 @@ class MoonrakerApi: ) def set_bed_temp(self, target, callback=None, *args): - logger.debug("Sending set_bed_temp: %s", KlippyGcodes.set_bed_temp(target)) + logging.debug("Sending set_bed_temp: %s", KlippyGcodes.set_bed_temp(target)) return self._ws.send_method( "printer.gcode.script", { @@ -313,7 +312,7 @@ class MoonrakerApi: ) def set_heater_temp(self, heater, target, callback=None, *args): - logger.debug("Sending heater %s to temp: %s", heater, target) + logging.debug("Sending heater %s to temp: %s", heater, target) return self._ws.send_method( "printer.gcode.script", { @@ -324,7 +323,7 @@ class MoonrakerApi: ) def set_tool_temp(self, tool, target, callback=None, *args): - logger.debug("Sending set_tool_temp: %s", KlippyGcodes.set_ext_temp(target, tool)) + logging.debug("Sending set_tool_temp: %s", KlippyGcodes.set_ext_temp(target, tool)) return self._ws.send_method( "printer.gcode.script", { @@ -335,13 +334,13 @@ class MoonrakerApi: ) def restart(self): - logger.debug("Sending printer.restart") + logging.debug("Sending printer.restart") return self._ws.send_method( "printer.restart" ) def restart_firmware(self): - logger.debug("Sending printer.firmware_restart") + logging.debug("Sending printer.firmware_restart") return self._ws.send_method( "printer.firmware_restart" ) diff --git a/ks_includes/config.py b/ks_includes/config.py index 83b6c88e..78201866 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -8,8 +8,6 @@ from io import StringIO from os import path -logger = logging.getLogger("KlipperScreen.config") - SCREEN_BLANKING_OPTIONS = [ "300", #5 Minutes "900", #15 Minutes @@ -67,7 +65,7 @@ class KlipperScreenConfig: self.default_config_path = "%s/ks_includes/%s" % (os.getcwd(), self.configfile_name) self.config = configparser.ConfigParser() self.config_path = self.get_config_file_location(configfile) - logger.debug("Config path location: %s" % self.config_path) + logging.debug("Config path location: %s" % self.config_path) self.defined_config = None try: @@ -108,7 +106,7 @@ class KlipperScreenConfig: item = conf_printers_debug[conf_printers_debug.index(printer)] if item[list(printer)[0]]['moonraker_api_key'] != "": item[list(printer)[0]]['moonraker_api_key'] = "redacted" - logger.debug("Configured printers: %s" % json.dumps(conf_printers_debug, indent=2)) + logging.debug("Configured printers: %s" % json.dumps(conf_printers_debug, indent=2)) for item in self.configurable_options: name = list(item)[0] @@ -145,7 +143,7 @@ class KlipperScreenConfig: if not path.exists(file): file = self.default_config_path - logger.info("Found configuration file at: %s" % file) + logging.info("Found configuration file at: %s" % file) return file def get_config(self): @@ -248,7 +246,7 @@ class KlipperScreenConfig: file.write(contents) file.close() except: - logger.error("Error writing configuration file") + logging.error("Error writing configuration file") def set(self, section, name, value): self.config.set(section, name, value) @@ -264,7 +262,7 @@ class KlipperScreenConfig: ), "=======================" ] - logger.info("\n".join(lines)) + logging.info("\n".join(lines)) def _build_config_string(self, config): sfile = StringIO() @@ -288,7 +286,7 @@ class KlipperScreenConfig: try: item["params"] = json.loads(cfg.get("params", "{}")) except: - logger.debug("Unable to parse parameters for [%s]" % name) + logging.debug("Unable to parse parameters for [%s]" % name) item["params"] = {} return {name[(len(menu) + 6):]: item} diff --git a/ks_includes/files.py b/ks_includes/files.py index ff09517c..2c9231e9 100644 --- a/ks_includes/files.py +++ b/ks_includes/files.py @@ -11,8 +11,6 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib -logger = logging.getLogger("KlipperScreen.KlippyFiles") - RESCAN_INTERVAL = 4 class KlippyFiles(Thread): @@ -56,7 +54,7 @@ class KlippyFiles(Thread): try: await self.ret_files() except: - logger.exception("Poll files error") + logging.exception("Poll files error") await asyncio.sleep(4) @@ -70,7 +68,7 @@ class KlippyFiles(Thread): deletedfiles.remove(item['filename']) else: newfiles.append(item['filename']) - logger.debug("New file: %s", item['filename']) + logging.debug("New file: %s", item['filename']) self.filelist.append(item['filename']) self.files[item['filename']] = { "size": item['size'], @@ -79,22 +77,22 @@ class KlippyFiles(Thread): self.request_metadata(item['filename']) if len(self.callbacks) > 0 and (len(newfiles) > 0 or len(deletedfiles) > 0): - logger.debug("Running callbacks...") + logging.debug("Running callbacks...") for cb in self.callbacks: cb(newfiles, deletedfiles, []) if len(deletedfiles) > 0: - logger.debug("Deleted files: %s", deletedfiles) + logging.debug("Deleted files: %s", deletedfiles) for file in deletedfiles: self.filelist.remove(file) self.files.pop(file, None) elif method == "server.files.metadata": if "error" in result.keys(): - logger.debug("Error in getting metadata for %s. Retrying in 6 seconds" %(params['filename'])) + logging.debug("Error in getting metadata for %s. Retrying in 6 seconds" %(params['filename'])) return - logger.debug("Got metadata for %s" % (result['result']['filename'])) + logging.debug("Got metadata for %s" % (result['result']['filename'])) for x in result['result']: self.files[params['filename']][x] = result['result'][x] @@ -107,14 +105,14 @@ class KlippyFiles(Thread): f.write(base64.b64decode(thumbnail['data'])) f.close() for cb in self.callbacks: - logger.debug("Running metadata callbacks") + logging.debug("Running metadata callbacks") cb([], [], [params['filename']]) def add_file_callback(self, callback): try: self.callbacks.append(callback) except: - logger.debug("Callback not found: %s" % callback) + logging.debug("Callback not found: %s" % callback) def remove_file_callback(self, callback): if callback in self.callbacks: @@ -154,7 +152,7 @@ class KlippyFiles(Thread): self._screen._ws.klippy.get_file_metadata(filename, self._callback) async def ret_files(self, retval=True): - logger.debug("Scanning for files") + logging.debug("Scanning for files") if not self._screen._ws.klippy.get_file_list(self._callback): self.timeout = None diff --git a/ks_includes/functions.py b/ks_includes/functions.py new file mode 100644 index 00000000..35d3196b --- /dev/null +++ b/ks_includes/functions.py @@ -0,0 +1,80 @@ +import logging +import logging.handlers +import os +import subprocess +import sys +from queue import SimpleQueue as Queue + + + +def get_software_version(): + prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always', + '--tags', '--long', '--dirty') + try: + process = subprocess.Popen(prog, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + ver, err = process.communicate() + retcode = process.wait() + if retcode == 0: + version = ver.strip() + if isinstance(version, bytes): + version = version.decode() + return version + else: + logging.debug(f"Error getting git version: {err}") + except OSError: + logging.exception("Error runing git describe") + return "?" + +# Timed rotating file handler based on Klipper and Moonraker's implementation +class KlipperScreenLoggingHandler(logging.handlers.TimedRotatingFileHandler): + def __init__(self, software_version, filename, **kwargs): + super(KlipperScreenLoggingHandler, self).__init__(filename, **kwargs) + self.rollover_info = { + 'header': f"{'-'*20}KlipperScreen Log Start{'-'*20}", + 'version': f"Git Version: {software_version}", + } + lines = [line for line in self.rollover_info.values() if line] + if self.stream is not None: + self.stream.write("\n".join(lines) + "\n") + + def set_rollover_info(self, name, item): + self.rollover_info[name] = item + + def doRollover(self): + super(MoonrakerLoggingHandler, self).doRollover() + lines = [line for line in self.rollover_info.values() if line] + if self.stream is not None: + self.stream.write("\n".join(lines) + "\n") + +# Logging based on Arksine's logging setup +def setup_logging(log_file, software_version): + root_logger = logging.getLogger() + queue = Queue() + queue_handler = logging.handlers.QueueHandler(queue) + root_logger.addHandler(queue_handler) + root_logger.setLevel(logging.DEBUG) + + stdout_hdlr = logging.StreamHandler(sys.stdout) + stdout_fmt = logging.Formatter( + '%(asctime)s [%(filename)s:%(funcName)s()] - %(message)s') + stdout_hdlr.setFormatter(stdout_fmt) + + fh = None + if log_file: + fh = KlipperScreenLoggingHandler(software_version, log_file, when='midnight', backupCount=2) + formatter = logging.Formatter( + '%(asctime)s [%(filename)s:%(funcName)s()] - %(message)s') + fh.setFormatter(formatter) + listener = logging.handlers.QueueListener( + queue, fh, stdout_hdlr) + else: + listener = logging.handlers.QueueListener( + queue, stdout_hdlr) + listener.start() + + def logging_exception_handler(type, value, tb): + logging.exception("Uncaught exception %s: %s\nTraceback: %s" % (type, value, "\n".join(traceback.format_tb(tb)))) + sys.excepthook = logging_exception_handler + + return listener, fh diff --git a/ks_includes/printer.py b/ks_includes/printer.py index 7f422f5b..9dba8b97 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -1,7 +1,5 @@ import logging -logger = logging.getLogger("KlipperScreen.Printer") - class Printer: state_callbacks = { "disconnected": None, @@ -18,7 +16,7 @@ class Printer: self.power_devices = {} def reinit(self, printer_info, data): - logger.debug("Moonraker object status: %s" % data) + logging.debug("Moonraker object status: %s" % data) self.config = data['configfile']['config'] self.toolcount = 0 self.extrudercount = 0 @@ -62,8 +60,8 @@ class Printer: r['points'] = [[float(j.strip()) for j in i.split(",")] for i in r['points'].strip().split("\n")] self.process_update(data) - logger.info("Klipper version: %s", self.klipper['version']) - logger.info("### Toolcount: " + str(self.toolcount) + " Heaters: " + str(self.extrudercount)) + logging.info("Klipper version: %s", self.klipper['version']) + logging.info("### Toolcount: " + str(self.toolcount) + " Heaters: " + str(self.extrudercount)) def process_update(self, data): keys = [ @@ -121,21 +119,21 @@ class Printer: if state == self.state or state not in list(self.state_callbacks): return - logger.debug("Changing state from '%s' to '%s'" % (self.state, state)) + logging.debug("Changing state from '%s' to '%s'" % (self.state, state)) self.state = state if self.state_callbacks[state] != None: - logger.debug("Running callback for state: %s" % state) + logging.debug("Running callback for state: %s" % state) self.state_callbacks[state]() def configure_power_devices(self, data): self.power_devices = {} - logger.debug("Processing power devices: %s" % data) + logging.debug("Processing power devices: %s" % data) for x in data['devices']: self.power_devices[x['device']] = { "status": "on" if x['status'] == "on" else "off" } - logger.debug("Power devices: %s" % self.power_devices) + logging.debug("Power devices: %s" % self.power_devices) def config_section_exists(self, section): return section in list(self.config) diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index 8563d989..949713ae 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -7,7 +7,6 @@ from jinja2 import Environment, Template from ks_includes.KlippyGtk import KlippyGtk from ks_includes.KlippyGcodes import KlippyGcodes -logger = logging.getLogger("KlipperScreen.ScreenPanel") class ScreenPanel: title_spacing = 50 @@ -32,7 +31,7 @@ class ScreenPanel: self.control_grid.get_style_context().add_class('action_bar') button_scale = self._gtk.get_header_image_scale() - logger.debug("Button scale: %s" % button_scale) + logging.debug("Button scale: %s" % button_scale) if back == True: self.control['back'] = self._gtk.ButtonImage('back', None, None, button_scale[0], button_scale[1]) self.control['back'].connect("clicked", self._screen._menu_go_back) @@ -60,7 +59,7 @@ class ScreenPanel: j2_temp = env.from_string(title) title = j2_temp.render() except: - logger.debug("Error parsing jinja for title: %s" % title) + logging.debug("Error parsing jinja for title: %s" % title) self.title = Gtk.Label() self.title.set_size_request(self._screen.width - action_bar_width, self.title_spacing) diff --git a/ks_includes/wifi.py b/ks_includes/wifi.py index d7163021..646b77f9 100644 --- a/ks_includes/wifi.py +++ b/ks_includes/wifi.py @@ -8,8 +8,6 @@ import threading from contextlib import suppress from threading import Thread -logger = logging.getLogger("KlipperScreen.WifiManager") - RESCAN_INTERVAL = 120 class WifiManager(Thread): @@ -40,13 +38,13 @@ class WifiManager(Thread): def run(self): event = threading.Event() - logger.debug("Setting up wifi event loop") + logging.debug("Setting up wifi event loop") while self._stop_loop == False: try: self.scan() event.wait(RESCAN_INTERVAL) except: - logger.exception("Poll wifi error") + logging.exception("Poll wifi error") def stop(self): self.loop.call_soon_threadsafe(self.loop.stop) @@ -148,7 +146,7 @@ class WifiManager(Thread): self.networks_in_supplicant.append(network) def scan(self, interface='wlan0'): - logger.debug("Scanning %s" % interface) + logging.debug("Scanning %s" % interface) p = subprocess.Popen(["sudo","iwlist",interface,"scan"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) aps = self.parse(p.stdout.read().decode('utf-8')) cur_info = self.get_current_wifi() diff --git a/panels/bed_level.py b/panels/bed_level.py index 8df96e99..e1c2e584 100644 --- a/panels/bed_level.py +++ b/panels/bed_level.py @@ -8,8 +8,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.BedLevelPanel") - def create_panel(*args): return BedLevelPanel(*args) @@ -34,7 +32,7 @@ class BedLevelPanel(ScreenPanel): if config_section_name != None: config_section = self._screen.printer.get_config_section(config_section_name) for item in config_section: - logger.debug("Screws section: %s" % config_section[item]) + logging.debug("Screws section: %s" % config_section[item]) result = re.match(r"([0-9\.]+)\s*,\s*([0-9\.]+)", config_section[item]) if result: screws.append([ @@ -43,7 +41,7 @@ class BedLevelPanel(ScreenPanel): ]) screws = sorted(screws, key=lambda x: (float(x[1]), float(x[0]))) - logger.debug("Bed screw locations [x,y]: %s", screws) + logging.debug("Bed screw locations [x,y]: %s", screws) if ("bltouch" in self._screen.printer.get_config_section_list() and config_section_name == "screws_tilt_adjust"): x_offset = 0 @@ -62,10 +60,10 @@ class BedLevelPanel(ScreenPanel): screws = new_screws self.screws = screws - logger.debug("Screws: %s" % screws) + logging.debug("Screws: %s" % screws) if len(screws) < 4: - logger.debug("bed_screws not configured, calculating locations") + logging.debug("bed_screws not configured, calculating locations") xconf = self._screen.printer.get_config_section("stepper_x") yconf = self._screen.printer.get_config_section("stepper_y") x = int(int(xconf['position_max'])/4) @@ -76,9 +74,9 @@ class BedLevelPanel(ScreenPanel): [x, y*3], [x*3, y*3], ] - logger.debug("Calculated screw locations [x,y]: %s", screws) + logging.debug("Calculated screw locations [x,y]: %s", screws) else: - logger.debug("Configured screw locations [x,y]: %s", screws) + logging.debug("Configured screw locations [x,y]: %s", screws) self.labels['bl'] = self._gtk.ButtonImage("bed-level-t-l", None, None, 3, 3) @@ -124,7 +122,7 @@ class BedLevelPanel(ScreenPanel): self.labels['fr'].set_label("") def go_to_position(self, widget, position): - logger.debug("Going to position: %s", position) + logging.debug("Going to position: %s", position) script = [ "%s" % KlippyGcodes.MOVE_ABSOLUTE, "G1 Z7 F800\n", @@ -155,10 +153,10 @@ class BedLevelPanel(ScreenPanel): screw_labels = ['fl','fr','bl','br'] x = int(float(result.group(2)) + self.x_offset) y = int(float(result.group(3)) + self.y_offset) - logger.debug(data) - logger.debug("X: %s Y: %s" % (x,y)) + logging.debug(data) + logging.debug("X: %s Y: %s" % (x,y)) for i in range(len(self.screws)): - logger.debug(self.screws[i]) + logging.debug(self.screws[i]) if x == int(float(self.screws[i][0])) and y == int(float(self.screws[i][1])): break self.labels[screw_labels[i]].set_label(result.group(4)) diff --git a/panels/bed_mesh.py b/panels/bed_mesh.py index 7f5bd7f7..ae3d1e34 100644 --- a/panels/bed_mesh.py +++ b/panels/bed_mesh.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.BedMeshPanel") - def create_panel(*args): return BedMeshPanel(*args) @@ -66,7 +64,7 @@ class BedMeshPanel(ScreenPanel): if profile == "": profile = None - logger.debug("Activating profile: %s %s" % (self.active_mesh, profile)) + logging.debug("Activating profile: %s %s" % (self.active_mesh, profile)) if profile != self.active_mesh: if profile not in self.profiles: self.add_profile(profile) @@ -138,7 +136,7 @@ class BedMeshPanel(ScreenPanel): dev.add(labels) buttons = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - logger.debug("Profile compare: '%s' '%s'" % (self.active_mesh, profile)) + logging.debug("Profile compare: '%s' '%s'" % (self.active_mesh, profile)) if self.active_mesh == profile: buttons.pack_start(refresh, False, False, 0) else: diff --git a/panels/example.py b/panels/example.py index 19e9c2c2..85cf26c2 100644 --- a/panels/example.py +++ b/panels/example.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.ExamplePanel") - def create_panel(*args): return ExamplePanel(*args) diff --git a/panels/extrude.py b/panels/extrude.py index b51bba95..0f9dc89f 100644 --- a/panels/extrude.py +++ b/panels/extrude.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.ExtrudePanel") - def create_panel(*args): return ExtrudePanel(*args) diff --git a/panels/fan.py b/panels/fan.py index 3f07e42d..35ff66f0 100644 --- a/panels/fan.py +++ b/panels/fan.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.FanPanel") - def create_panel(*args): return FanPanel(*args) diff --git a/panels/fine_tune.py b/panels/fine_tune.py index 8e33299e..cca6d27e 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.FineTunePanel") - def create_panel(*args): return FineTunePanel(*args) @@ -30,7 +28,7 @@ class FineTunePanel(ScreenPanel): grid = self._gtk.HomogeneousGrid() grid.set_row_homogeneous(False) - logger.debug("FineTunePanel") + logging.debug("FineTunePanel") self.labels['z+'] = self._gtk.ButtonImage("move-z-", _("Z+"), "color1") diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py index ddf0b9c7..cd01319a 100644 --- a/panels/gcode_macros.py +++ b/panels/gcode_macros.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.Macro") - def create_panel(*args): return MacroPanel(*args) @@ -89,7 +87,7 @@ class MacroPanel(ScreenPanel): if macro in self.loaded_macros: continue - logger.debug("Evaluating '%s' value '%s'" % (macro.strip().lower(), + logging.debug("Evaluating '%s' value '%s'" % (macro.strip().lower(), self._config.get_config().getboolean("displayed_macros", macro.lower(), fallback=True))) if ("displayed_macros" not in self._config.get_config().sections() or @@ -101,7 +99,7 @@ class MacroPanel(ScreenPanel): def unload_gcode_macros(self): for macro in self.loaded_macros: - logger.debug("Evaluating '%s' value '%s'" % (macro.strip().lower(), + logging.debug("Evaluating '%s' value '%s'" % (macro.strip().lower(), self._config.get_config().getboolean("displayed_macros", macro.lower(), fallback=True))) if ("displayed_macros" in self._config.get_config().sections() and not self._config.get_config().getboolean("displayed_macros", macro.lower(), fallback=True)): diff --git a/panels/job_status.py b/panels/job_status.py index bb54472b..4821bd6e 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -8,8 +8,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.JobStatusPanel") - def create_panel(*args): return JobStatusPanel(*args) @@ -221,7 +219,7 @@ class JobStatusPanel(ScreenPanel): self.update_file_metadata() ps = self._printer.get_stat("print_stats") - logger.debug("Act State: %s" % ps['state']) + logging.debug("Act State: %s" % ps['state']) self.set_state(ps['state']) self.show_buttons_for_state() @@ -302,7 +300,7 @@ class JobStatusPanel(ScreenPanel): self.enable_button("pause","cancel") return - logger.debug("Canceling print") + logging.debug("Canceling print") self.disable_button("pause","resume","cancel") self._screen._ws.klippy.print_cancel(self._response_callback) @@ -387,7 +385,7 @@ class JobStatusPanel(ScreenPanel): if timeout != 0: GLib.timeout_add(timeout * 1000, self.close_panel) elif ps['state'] == "error" and self.state != "error": - logger.debug("Error!") + logging.debug("Error!") self.set_state("error") self.labels['status'].set_text("Error - %s" % ps['message']) self.show_buttons_for_state() @@ -493,7 +491,7 @@ class JobStatusPanel(ScreenPanel): def update_file_metadata(self): if self._files.file_metadata_exists(self.filename): self.file_metadata = self._files.get_file_info(self.filename) - logger.debug("Parsing file metadata: %s" % list(self.file_metadata)) + logging.debug("Parsing file metadata: %s" % list(self.file_metadata)) if "estimated_time" in self.file_metadata: self.update_text("est_time","/ %s" % str(self._gtk.formatTimeString(self.file_metadata['estimated_time']))) @@ -501,11 +499,11 @@ class JobStatusPanel(ScreenPanel): tmp = self.file_metadata['thumbnails'].copy() for i in tmp: i['data'] = "" - logger.debug("Thumbnails: %s" % list(tmp)) + logging.debug("Thumbnails: %s" % list(tmp)) self.show_file_thumbnail() else: self.file_metadata = None - logger.debug("Cannot find file metadata. Listening for updated metadata") + logging.debug("Cannot find file metadata. Listening for updated metadata") self._screen.files.add_file_callback(self._callback_metadata) def update_image_text(self, label, text): diff --git a/panels/main_menu.py b/panels/main_menu.py index a8fbc6df..96b3e85c 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -6,8 +6,6 @@ from gi.repository import Gtk, Gdk, GLib from panels.menu import MenuPanel -logger = logging.getLogger("KlipperScreen.MainMenu") - def create_panel(*args): return MainPanel(*args) diff --git a/panels/menu.py b/panels/menu.py index fa24291d..5ce18a24 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -8,8 +8,6 @@ from jinja2 import Environment, Template from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.MenuPanel") - def create_panel(*args): return MenuPanel(*args) @@ -41,7 +39,7 @@ class MenuPanel(ScreenPanel): i = 0 for item in items: key = list(item)[0] - logger.debug("Evaluating item: %s" % key) + logging.debug("Evaluating item: %s" % key) if not self.evaluate_enable(item[key]['enable']): continue @@ -89,13 +87,13 @@ class MenuPanel(ScreenPanel): return False try: - logger.debug("Template: '%s'" % enable) - logger.debug("Data: %s" % self.j2_data) + logging.debug("Template: '%s'" % enable) + logging.debug("Data: %s" % self.j2_data) j2_temp = Template(enable) result = j2_temp.render(self.j2_data) if result == 'True': return True return False except: - logger.debug("Error evaluating enable statement: %s", enable) + logging.debug("Error evaluating enable statement: %s", enable) return False diff --git a/panels/move.py b/panels/move.py index 74d4b34a..c1e989e6 100644 --- a/panels/move.py +++ b/panels/move.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.MovePanel") - def create_panel(*args): return MovePanel(*args) diff --git a/panels/network.py b/panels/network.py index e01c166f..e89a97fd 100644 --- a/panels/network.py +++ b/panels/network.py @@ -8,8 +8,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.NetworkPanel") - def create_panel(*args): return NetworkPanel(*args) diff --git a/panels/power.py b/panels/power.py index 25dfaa72..12df49dd 100644 --- a/panels/power.py +++ b/panels/power.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.PowerPanel") - def create_panel(*args): return PowerPanel(*args) @@ -86,7 +84,7 @@ class PowerPanel(ScreenPanel): self.add_device(x) def on_switch(self, switch, gparam, device): - logger.debug("Power toggled %s" % device) + logging.debug("Power toggled %s" % device) if switch.get_active(): self._screen._ws.klippy.power_device_on(device) else: diff --git a/panels/preheat.py b/panels/preheat.py index da0e7b74..0d40a774 100644 --- a/panels/preheat.py +++ b/panels/preheat.py @@ -6,8 +6,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.PreheatPanel") - def create_panel(*args): return PreheatPanel(*args) @@ -17,7 +15,7 @@ class PreheatPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext self.preheat_options = self._screen._config.get_preheat_options() - logger.debug("Preheat options: %s" % self.preheat_options) + logging.debug("Preheat options: %s" % self.preheat_options) grid = self._gtk.HomogeneousGrid() diff --git a/panels/print.py b/panels/print.py index 4489ac64..8616944a 100644 --- a/panels/print.py +++ b/panels/print.py @@ -11,8 +11,6 @@ from datetime import datetime from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.PrintPanel") - def create_panel(*args): return PrintPanel(*args) @@ -255,7 +253,7 @@ class PrintPanel(ScreenPanel): def change_dir(self, widget, directory): if directory not in self.dir_panels: return - logger.debug("Changing dir to %s" % directory) + logging.debug("Changing dir to %s" % directory) for child in self.scroll.get_children(): self.scroll.remove(child) @@ -270,7 +268,7 @@ class PrintPanel(ScreenPanel): self.sort_current[1] = (self.sort_current[1] + 1) % 2 else: oldkey = self.sort_current[0] - logger.info("Changing %s to %s" % ('sort_%s' % oldkey, self.sort_items[self.sort_current[0]])) + logging.info("Changing %s to %s" % ('sort_%s' % oldkey, self.sort_items[self.sort_current[0]])) self.labels['sort_%s' % oldkey].set_label("%s" % self.sort_items[oldkey]) self.labels['sort_%s' % oldkey].show_all() self.sort_current = [key, 0] @@ -408,12 +406,12 @@ class PrintPanel(ScreenPanel): self.labels['files'][filename]['icon'].set_from_pixbuf(pixbuf) def _callback(self, newfiles, deletedfiles, updatedfiles=[]): - logger.debug("newfiles: %s", newfiles) + logging.debug("newfiles: %s", newfiles) for file in newfiles: self.add_file(file) - logger.debug("deletedfiles: %s", deletedfiles) + logging.debug("deletedfiles: %s", deletedfiles) for file in deletedfiles: self.delete_file(file) - logger.debug("updatefiles: %s", updatedfiles) + logging.debug("updatefiles: %s", updatedfiles) for file in updatedfiles: self.update_file(file) diff --git a/panels/settings.py b/panels/settings.py index 46c1872b..f0261bfb 100644 --- a/panels/settings.py +++ b/panels/settings.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.Settings") - def create_panel(*args): return SettingsPanel(*args) @@ -45,7 +43,7 @@ class SettingsPanel(ScreenPanel): for macro in list(self.macros): self.add_option('macros', self.macros, macro, self.macros[macro]) - logger.debug("Macros: %s" % self.macros) + logging.debug("Macros: %s" % self.macros) self.control['back'].disconnect_by_func(self._screen._menu_go_back) self.control['back'].connect("clicked", self.back) @@ -136,7 +134,7 @@ class SettingsPanel(ScreenPanel): #dropdown.props.relief = Gtk.ReliefStyle.NONE dropdown.set_entry_text_column(0) dev.add(dropdown) - logger.debug("Children: %s" % dropdown.get_children()) + logging.debug("Children: %s" % dropdown.get_children()) elif option['type'] == "menu": open = self._gtk.ButtonImage("open",None,"color3") open.connect("clicked", self.load_menu, option['menu']) @@ -172,7 +170,7 @@ class SettingsPanel(ScreenPanel): self.content.show_all() def unload_menu(self, widget=None): - logger.debug("self.menu: %s" % self.menu) + logging.debug("self.menu: %s" % self.menu) if len(self.menu) <= 1 or self.menu[-2] not in self.labels: return @@ -187,7 +185,7 @@ class SettingsPanel(ScreenPanel): if tree_iter is not None: model = combo.get_model() value = model[tree_iter][1] - logger.debug("[%s] %s changed to %s" % (section, option, value)) + logging.debug("[%s] %s changed to %s" % (section, option, value)) self._config.set(section, option, value) self._config.save_user_config_options() if callback is not None: @@ -195,7 +193,7 @@ class SettingsPanel(ScreenPanel): def switch_config_option(self, switch, gparam, section, option): - logger.debug("[%s] %s toggled %s" % (section, option, switch.get_active())) + logging.debug("[%s] %s toggled %s" % (section, option, switch.get_active())) if section not in self._config.get_config().sections(): self._config.get_config().add_section(section) self._config.set(section, option, "True" if switch.get_active() else "False") diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 8a36470d..e80beb97 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -7,8 +7,6 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.SplashScreenPanel") - def create_panel(*args): return SplashScreenPanel(*args) @@ -68,9 +66,9 @@ class SplashScreenPanel(ScreenPanel): devices = [i for i in self._printer.get_power_devices() if i.lower().startswith('printer')] if ( self._printer is not None) else [] - logger.debug("Power devices: %s" % devices) + logging.debug("Power devices: %s" % devices) if len(devices) > 0: - logger.debug("Adding power button") + logging.debug("Adding power button") self.labels['power'].connect("clicked", self.power_on, devices[0]) self.labels['actions'].add(self.labels['power']) diff --git a/panels/system.py b/panels/system.py index 6c027d9e..706989a5 100644 --- a/panels/system.py +++ b/panels/system.py @@ -8,8 +8,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.SystemPanel") - def create_panel(*args): return SystemPanel(*args) diff --git a/panels/temperature.py b/panels/temperature.py index aa84e3d2..6d192ae2 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -8,8 +8,6 @@ from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -logger = logging.getLogger("KlipperScreen.TemperaturePanel") - def create_panel(*args): return TemperaturePanel(*args) @@ -207,7 +205,7 @@ class TemperaturePanel(ScreenPanel): return def change_target_temp(self, widget, dir): - logger.debug("Dev stats %s: %s" % (self.active_heater, self._printer.get_dev_stats(self.active_heater))) + logging.debug("Dev stats %s: %s" % (self.active_heater, self._printer.get_dev_stats(self.active_heater))) target = self._printer.get_dev_stat(self.active_heater, "target") if dir == "+": target += int(self.tempdelta) diff --git a/panels/zcalibrate.py b/panels/zcalibrate.py index 6564989b..35a81a19 100644 --- a/panels/zcalibrate.py +++ b/panels/zcalibrate.py @@ -7,7 +7,6 @@ from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel import logging -logger = logging.getLogger("KlipperScreen.ZCalibratePanel") def create_panel(*args): return ZCalibratePanel(*args) @@ -116,15 +115,15 @@ class ZCalibratePanel(ScreenPanel): def move(self, widget, dir): dist = str(self.distance) if dir == "+" else "-" + str(self.distance) - logger.info("# Moving %s", KlippyGcodes.probe_move(dist)) + logging.info("# Moving %s", KlippyGcodes.probe_move(dist)) self._screen._ws.klippy.gcode_script(KlippyGcodes.probe_move(dist)) def abort(self, widget): - logger.info("Aborting Z calibrate") + logging.info("Aborting Z calibrate") self._screen._ws.klippy.gcode_script(KlippyGcodes.PROBE_ABORT) self.menu_return(widget) def accept(self, widget): - logger.info("Accepting Z calibrate") + logging.info("Accepting Z calibrate") self._screen._ws.klippy.gcode_script(KlippyGcodes.PROBE_ACCEPT) self.menu_return(widget) diff --git a/screen.py b/screen.py index 51f2d945..deae6ba9 100644 --- a/screen.py +++ b/screen.py @@ -23,6 +23,7 @@ gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib, Pango from jinja2 import Environment, Template +from ks_includes import functions from ks_includes.KlippyWebsocket import KlippyWebsocket from ks_includes.KlippyRest import KlippyRest from ks_includes.files import KlippyFiles @@ -47,32 +48,7 @@ PRINTER_BASE_STATUS_OBJECTS = [ 'webhooks' ] -# Create logging -for h in logging.getLogger().handlers: - logging.getLogger().removeHandler(h) - -logger = logging.getLogger('KlipperScreen') -logger.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - -fh = logging.FileHandler('/tmp/KlipperScreen.log') -fh.setLevel(logging.DEBUG) -fh.setFormatter(formatter) - -ch = logging.StreamHandler(sys.stdout) -ch.setLevel(logging.DEBUG) -ch.setFormatter(formatter) - -logger.addHandler(fh) -logger.addHandler(ch) - -def logging_exception_handler(type, value, tb): - logger.exception("Uncaught exception %s: %s\nTraceback: %s" % (type, value, "\n".join(traceback.format_tb(tb)))) -sys.excepthook = logging_exception_handler - klipperscreendir = os.getcwd() -config = klipperscreendir + "/KlipperScreen.config" -logger.info("Config file: " + config) class KlipperScreen(Gtk.Window): """ Class for creating a screen for Klipper via HDMI """ @@ -95,16 +71,9 @@ class KlipperScreen(Gtk.Window): shutdown = True _ws = None - def __init__(self): - self.version = get_software_version() - logger.info("KlipperScreen version: %s" % self.version) + def __init__(self, args, version): + self.version = version - parser = argparse.ArgumentParser(description="KlipperScreen - A GUI for Klipper") - parser.add_argument( - "-c","--configfile", default="~/KlipperScreen.conf", metavar='', - help="Location of KlipperScreen configuration file" - ) - args = parser.parse_args() configfile = os.path.normpath(os.path.expanduser(args.configfile)) self.lang = gettext.translation('KlipperScreen', localedir='ks_includes/locales', fallback=True) @@ -113,14 +82,14 @@ class KlipperScreen(Gtk.Window): self.wifi = WifiManager() self.wifi.start() - logger.debug("OS Language: %s" % os.getenv('LANG')) + logging.debug("OS Language: %s" % os.getenv('LANG')) self.lang_ltr = True for lang in self.rtl_languages: if os.getenv('LANG').lower().startswith(lang): self.lang_ltr = False Gtk.Widget.set_default_direction(Gtk.TextDirection.RTL) - logger.debug("Enabling RTL mode") + logging.debug("Enabling RTL mode") break _ = self.lang.gettext @@ -130,7 +99,7 @@ class KlipperScreen(Gtk.Window): self.height = self._config.get_main_config().getint("height", Gdk.Screen.get_height(Gdk.Screen.get_default())) self.set_default_size(self.width, self.height) self.set_resizable(False) - logger.info("Screen resolution: %sx%s" % (self.width, self.height)) + logging.info("Screen resolution: %sx%s" % (self.width, self.height)) self.gtk = KlippyGtk(self.width, self.height) self.init_style() @@ -144,7 +113,7 @@ class KlipperScreen(Gtk.Window): self.set_screenblanking_timeout(self._config.get_main_config_option('screen_blanking')) # Change cursor to blank - #self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) + self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) pname = list(self._config.get_printers()[0])[0] self.connect_printer(pname, self._config.get_printers()[0][pname]) @@ -192,7 +161,7 @@ class KlipperScreen(Gtk.Window): }) powerdevs = self.apiclient.send_request("machine/device_power/devices") - logger.debug("Found power devices: %s" % powerdevs) + logging.debug("Found power devices: %s" % powerdevs) if powerdevs != False: self.printer.configure_power_devices(powerdevs['result']) self.panels['splash_screen'].show_restart_buttons() @@ -215,7 +184,7 @@ class KlipperScreen(Gtk.Window): self.files.start() self.connected_printer = name - logger.debug("Connected to printer: %s" % name) + logging.debug("Connected to printer: %s" % name) def ws_subscribe(self): requested_updates = { @@ -241,18 +210,18 @@ class KlipperScreen(Gtk.Window): def _load_panel(self, panel, *args): if not panel in self.load_panel: - logger.debug("Loading panel: %s" % panel) + logging.debug("Loading panel: %s" % panel) panel_path = os.path.join(os.path.dirname(__file__), 'panels', "%s.py" % panel) - logger.info("Panel path: %s" % panel_path) + logging.info("Panel path: %s" % panel_path) if not os.path.exists(panel_path): msg = f"Panel {panel} does not exist" - logger.info(msg) + logging.info(msg) raise Exception(msg) module = importlib.import_module("panels.%s" % panel) if not hasattr(module, "create_panel"): msg = f"Cannot locate create_panel function for {panel}" - logger.info(msg) + logging.info(msg) raise Exception(msg) self.load_panel[panel] = getattr(module, "create_panel") @@ -260,7 +229,7 @@ class KlipperScreen(Gtk.Window): return self.load_panel[panel](*args) except Exception: msg = f"Unable to create panel {panel}" - logger.exception(msg) + logging.exception(msg) raise Exception(msg) def show_panel(self, panel_name, type, title, remove=None, pop=True, **kwargs): @@ -274,7 +243,7 @@ class KlipperScreen(Gtk.Window): self.panels[panel_name].initialize(panel_name) except: del self.panels[panel_name] - logger.exception("Unable to load panel %s" % type) + logging.exception("Unable to load panel %s" % type) self.show_error_modal("Unable to load panel %s" % type) return @@ -287,7 +256,7 @@ class KlipperScreen(Gtk.Window): elif remove == 1: self._remove_current_panel(pop) - logger.debug("Attaching panel %s" % panel_name) + logging.debug("Attaching panel %s" % panel_name) self.add(self.panels[panel_name].get()) self.show_all() @@ -296,10 +265,10 @@ class KlipperScreen(Gtk.Window): self.panels[panel_name].activate() self.show_all() except: - logger.exception("Error attaching panel") + logging.exception("Error attaching panel") self._cur_panels.append(panel_name) - logger.debug("Current panel hierarchy: %s", str(self._cur_panels)) + logging.debug("Current panel hierarchy: %s", str(self._cur_panels)) def show_popup_message(self, message): if self.popup_message != None: @@ -349,7 +318,7 @@ class KlipperScreen(Gtk.Window): def show_error_modal(self, err): _ = self.lang.gettext - logger.exception("Showing error modal: %s", err) + logging.exception("Showing error modal: %s", err) buttons = [ {"name":_("Go Back"),"response": Gtk.ResponseType.CANCEL} @@ -370,7 +339,7 @@ class KlipperScreen(Gtk.Window): def init_style(self): style_provider = Gtk.CssProvider() - #style_provider.load_from_path(klipperscreendir + "/style.css") + css = open(klipperscreendir + "/styles/style.css") css_data = css.read() @@ -390,7 +359,7 @@ class KlipperScreen(Gtk.Window): return "job_status" in self._cur_panels def _go_to_submenu(self, widget, name): - logger.info("#### Go to submenu " + str(name)) + logging.info("#### Go to submenu " + str(name)) #self._remove_current_panel(False) # Find current menu item @@ -402,11 +371,11 @@ class KlipperScreen(Gtk.Window): else: menu = "__print" - logger.info("#### Menu " + str(menu)) + logging.info("#### Menu " + str(menu)) disname = self._config.get_menu_name(menu, name) menuitems = self._config.get_menu_items(menu, name) if len(menuitems) == 0: - logger.info("No items in menu, returning.") + logging.info("No items in menu, returning.") return self.show_panel(self._cur_panels[-1] + '_' + name, "menu", disname, 1, False, display_name=disname, @@ -428,12 +397,12 @@ class KlipperScreen(Gtk.Window): self.show_all() def _menu_go_back (self, widget=None): - logger.info("#### Menu go back") + logging.info("#### Menu go back") self.remove_keyboard() self._remove_current_panel() def _menu_go_home(self): - logger.info("#### Menu go home") + logging.info("#### Menu go home") self.remove_keyboard() while len(self._cur_panels) > 1: self._remove_current_panel() @@ -453,7 +422,7 @@ class KlipperScreen(Gtk.Window): return def set_screenblanking_timeout(self, time): - logger.debug("Changing screenblanking to: %s" % time) + logging.debug("Changing screenblanking to: %s" % time) if time == "off": os.system("/usr/bin/xset -display :0 s off") os.system("/usr/bin/xset -display :0 s noblank") @@ -468,7 +437,7 @@ class KlipperScreen(Gtk.Window): def state_disconnected(self): _ = self.lang.gettext - logger.debug("### Going to disconnected") + logging.debug("### Going to disconnected") self.printer_initializing(_("Klipper has disconnected")) def state_error(self): @@ -513,7 +482,7 @@ class KlipperScreen(Gtk.Window): _ = self.lang.gettext if action == "notify_klippy_disconnected": - logger.debug("Received notify_klippy_disconnected") + logging.debug("Received notify_klippy_disconnected") self.printer.change_state("disconnected") return elif action == "notify_klippy_ready": @@ -521,23 +490,23 @@ class KlipperScreen(Gtk.Window): elif action == "notify_status_update" and self.printer.get_state() != "shutdown": self.printer.process_update(data) elif action == "notify_filelist_changed": - logger.debug("Filelist changed: %s", json.dumps(data,indent=2)) + logging.debug("Filelist changed: %s", json.dumps(data,indent=2)) #self.files.add_file() elif action == "notify_metadata_update": self.files.request_metadata(data['filename']) elif action == "notify_power_changed": - logger.debug("Power status changed: %s", data) + logging.debug("Power status changed: %s", data) self.printer.process_power_update(data) elif self.printer.get_state() not in ["error","shutdown"] and action == "notify_gcode_response": if "Klipper state: Shutdown" in data: - logger.debug("Shutdown in gcode response, changing state to shutdown") + logging.debug("Shutdown in gcode response, changing state to shutdown") self.printer.change_state("shutdown") if not (data.startswith("B:") and re.search(r'B:[0-9\.]+\s/[0-9\.]+\sT[0-9]+:[0-9\.]+', data)): if data.startswith("!! "): self.show_popup_message(data[3:]) - logger.debug(json.dumps([action, data], indent=2)) + logging.debug(json.dumps([action, data], indent=2)) if self._cur_panels[-1] in self.subscriptions: self.panels[self._cur_panels[-1]].process_update(action, data) @@ -556,7 +525,7 @@ class KlipperScreen(Gtk.Window): j2_temp = env.from_string(text) text = j2_temp.render() except: - logger.debug("Error parsing jinja for confirm_send_action") + logging.debug("Error parsing jinja for confirm_send_action") label = Gtk.Label() label.set_markup(text) @@ -625,8 +594,8 @@ class KlipperScreen(Gtk.Window): stderr=subprocess.PIPE, env=env) #p = subprocess.Popen(["onboard", "--xid"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) xid = int(p.stdout.readline()) - logger.debug("XID %s" % xid) - logger.debug("PID %s" % p.pid) + logging.debug("XID %s" % xid) + logging.debug("PID %s" % p.pid) keyboard = Gtk.Socket() #keyboard.connect("plug-added", self.plug_added) @@ -660,27 +629,29 @@ class KlipperScreen(Gtk.Window): os.kill(self.keyboard['process'].pid, signal.SIGTERM) self.keyboard = None -def get_software_version(): - prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always', - '--tags', '--long', '--dirty') - try: - process = subprocess.Popen(prog, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - ver, err = process.communicate() - retcode = process.wait() - if retcode == 0: - version = ver.strip() - if isinstance(version, bytes): - version = version.decode() - return version - else: - logger.debug(f"Error getting git version: {err}") - except OSError: - logger.exception("Error runing git describe") - return "?" - def main(): - win = KlipperScreen() + + version = functions.get_software_version() + parser = argparse.ArgumentParser(description="KlipperScreen - A GUI for Klipper") + parser.add_argument( + "-c","--configfile", default="~/KlipperScreen.conf", metavar='', + help="Location of KlipperScreen configuration file" + ) + parser.add_argument( + "-l","--logfile", default="/tmp/KlipperScreen.log", metavar='', + help="Location of KlipperScreen logfile output" + ) + args = parser.parse_args() + + functions.setup_logging( + os.path.normpath(os.path.expanduser(args.logfile)), + version + ) + + logging.info("KlipperScreen version: %s" % version) + + + win = KlipperScreen(args, version) win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main() @@ -690,4 +661,4 @@ if __name__ == "__main__": try: main() except: - logger.exception("Fatal error in main loop") + logging.exception("Fatal error in main loop")