Changes to logging implementation

This commit is contained in:
Jordan Ruthe
2021-02-21 12:19:30 -05:00
parent c8fe6de747
commit c0b4b464bd
30 changed files with 239 additions and 241 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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"
)

View File

@@ -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}

View File

@@ -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

80
ks_includes/functions.py Normal file
View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()

View File

@@ -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))

View File

@@ -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:

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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")

View File

@@ -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)):

View File

@@ -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):

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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()

View File

@@ -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)

View File

@@ -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")

View File

@@ -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'])

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

145
screen.py
View File

@@ -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='<configfile>',
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='<configfile>',
help="Location of KlipperScreen configuration file"
)
parser.add_argument(
"-l","--logfile", default="/tmp/KlipperScreen.log", metavar='<logfile>',
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")