forked from CreatBot/CreatBotKlipperScreen
Changes to logging implementation
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
)
|
||||
|
@@ -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}
|
||||
|
@@ -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
80
ks_includes/functions.py
Normal 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
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
||||
|
@@ -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))
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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")
|
||||
|
@@ -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)):
|
||||
|
@@ -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):
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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:
|
||||
|
@@ -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()
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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")
|
||||
|
@@ -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'])
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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
145
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='<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")
|
||||
|
Reference in New Issue
Block a user