Many many changes. Homing is working fully
This commit is contained in:
324
screen.py
324
screen.py
@@ -1,99 +1,251 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import gi
|
||||
import time
|
||||
import threading
|
||||
|
||||
import json
|
||||
import requests
|
||||
import websocket
|
||||
|
||||
gi.require_version("Gtk", "3.0")
|
||||
from gi.repository import Gtk, Gdk
|
||||
from gi.repository import Gtk, Gdk, GLib
|
||||
|
||||
from KlippyWebsocket import KlippyWebsocket
|
||||
from KlippyGtk import KlippyGtk
|
||||
from panels import IdleStatusPanel
|
||||
|
||||
config = "/opt/printer/KlipperScreen/KlipperScreen.config"
|
||||
|
||||
class KlipperScreen(Gtk.Window):
|
||||
""" Class for creating a screen for Klipper via HDMI """
|
||||
currentPanel = None
|
||||
|
||||
def __init__(self):
|
||||
self.init_style()
|
||||
Gtk.Window.__init__(self)
|
||||
|
||||
self.set_default_size(Gdk.Screen.get_width(Gdk.Screen.get_default()),Gdk.Screen.get_height(Gdk.Screen.get_default()))
|
||||
|
||||
|
||||
#self.splash_screen()
|
||||
self.main_panel()
|
||||
|
||||
self.box = Gtk.Box(spacing=6)
|
||||
#self.add(self.box)
|
||||
""" Class for creating a screen for Klipper via HDMI """
|
||||
currentPanel = None
|
||||
bed_temp_label = None
|
||||
number_tools = 1
|
||||
|
||||
self.button1 = Gtk.Button(label="Hello")
|
||||
self.button1.connect("clicked", self.on_button1_clicked)
|
||||
#self.box.pack_start(self.button1, True, True, 0)
|
||||
panels = {}
|
||||
_cur_panels = []
|
||||
|
||||
self.button2 = Gtk.Button(label="Goodbye")
|
||||
self.button2.connect("clicked", self.on_button2_clicked)
|
||||
#self.box.pack_start(self.button2, True, True, 0)
|
||||
|
||||
def init_style(self):
|
||||
cssdata = ""
|
||||
with open ('/home/pi/style.css', 'r' ) as file:
|
||||
cssdata = file.read()
|
||||
|
||||
style_provider = Gtk.CssProvider()
|
||||
style_provider.load_from_path("/home/pi/style.css")
|
||||
def __init__(self):
|
||||
self.read_config()
|
||||
self.init_style()
|
||||
Gtk.Window.__init__(self)
|
||||
|
||||
Gtk.StyleContext.add_provider_for_screen(
|
||||
Gdk.Screen.get_default(),
|
||||
style_provider,
|
||||
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||
)
|
||||
|
||||
def splash_screen(self):
|
||||
image = Gtk.Image()
|
||||
#TODO: update file reference
|
||||
image.set_from_file("/opt/printer/OctoScreen/styles/z-bolt/images/logo.png")
|
||||
|
||||
#label = Gtk.Label()
|
||||
#label.set_text("Initializing printer...")
|
||||
label = Gtk.Button(label="Initializing printer...")
|
||||
label.connect("clicked", self.printer_initialize)
|
||||
|
||||
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
|
||||
main.pack_start(image, True, True, 10)
|
||||
main.pack_end(label, True, True, 10)
|
||||
|
||||
box = Gtk.VBox()
|
||||
box.add(main)
|
||||
self.add(box)
|
||||
self.currentPanel = box
|
||||
|
||||
def main_panel (self):
|
||||
box = Gtk.Box(spacing=6)
|
||||
|
||||
box.add(self.gtk_ButtonImage("/opt/printer/OctoScreen/styles/z-bolt/images/home.svg", "Home"))
|
||||
box.add(self.gtk_ButtonImage("/opt/printer/OctoScreen/styles/z-bolt/images/filament.svg", "Filament"))
|
||||
self.add(box)
|
||||
self.currentPanel = box
|
||||
|
||||
|
||||
def gtk_ButtonImage (self, image, label):
|
||||
img = Gtk.Image.new_from_file(image)
|
||||
|
||||
b = Gtk.Button(label=label)
|
||||
b.set_image(img)
|
||||
b.set_image_position(Gtk.PositionType.TOP)
|
||||
b.set_always_show_image(True)
|
||||
ctx = b.get_style_context()
|
||||
ctx.add_class("color1")
|
||||
#button.set_vertical_expand(True)
|
||||
#button.set_h_expand(True)
|
||||
return b
|
||||
|
||||
def printer_initialize(self, widget):
|
||||
self.remove(self.currentPanel)
|
||||
self.main_panel()
|
||||
|
||||
def on_button1_clicked(self, widget):
|
||||
print("Hello")
|
||||
self.set_default_size(Gdk.Screen.get_width(Gdk.Screen.get_default()), Gdk.Screen.get_height(Gdk.Screen.get_default()))
|
||||
|
||||
def on_button2_clicked(self, widget):
|
||||
print("Goodbye")
|
||||
r = requests.get("http://127.0.0.1:7125/printer/info") #, headers={"x-api-key":api_key})
|
||||
if r.status_code != 200:
|
||||
self.printer_initializing()
|
||||
self.create_websocket()
|
||||
return
|
||||
|
||||
data = json.loads(r.content)
|
||||
|
||||
if data['result']['is_ready'] != True:
|
||||
self.printer_initializing()
|
||||
self.create_websocket()
|
||||
return
|
||||
|
||||
self.create_websocket()
|
||||
self.main_panel()
|
||||
|
||||
|
||||
def read_config (self):
|
||||
with open(config) as config_file:
|
||||
self._config = json.load(config_file)
|
||||
|
||||
|
||||
def init_style(self):
|
||||
style_provider = Gtk.CssProvider()
|
||||
style_provider.load_from_path("/opt/printer/KlipperScreen/style.css")
|
||||
|
||||
Gtk.StyleContext.add_provider_for_screen(
|
||||
Gdk.Screen.get_default(),
|
||||
style_provider,
|
||||
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||
)
|
||||
|
||||
def splash_screen(self):
|
||||
if "splash_screen" not in self.panels:
|
||||
image = Gtk.Image()
|
||||
#TODO: update file reference
|
||||
image.set_from_file("/opt/printer/OctoScreen/styles/z-bolt/images/logo.png")
|
||||
|
||||
label = Gtk.Label()
|
||||
label.set_text("Initializing printer...")
|
||||
#label = Gtk.Button(label="Initializing printer...")
|
||||
#label.connect("clicked", self.printer_initialize)
|
||||
|
||||
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
|
||||
main.pack_start(image, True, True, 10)
|
||||
main.pack_end(label, True, True, 10)
|
||||
|
||||
box = Gtk.VBox()
|
||||
box.add(main)
|
||||
self.panels['splash_screen'] = box
|
||||
|
||||
self.add(self.panels['splash_screen'])
|
||||
self.show_all()
|
||||
self._cur_panels = ['splash_screen']
|
||||
|
||||
def create_websocket(self):
|
||||
self._ws = KlippyWebsocket(self._websocket_callback)
|
||||
self._ws.connect()
|
||||
self._curr = 0
|
||||
|
||||
def main_panel (self):
|
||||
if "main_panel" not in self.panels:
|
||||
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
|
||||
|
||||
grid = Gtk.Grid()
|
||||
grid.set_row_homogeneous(True)
|
||||
grid.set_column_homogeneous(True)
|
||||
|
||||
self.panels['idle_status'] = IdleStatusPanel(self)
|
||||
|
||||
|
||||
grid.attach(self.panels['idle_status'].initialize(), 0, 0, 1, 1)
|
||||
#grid.attach(box2, 1, 0, 1, 1)
|
||||
|
||||
|
||||
grid.attach(self.arrangeMenuItems(self._config,2), 1, 0, 1, 1)
|
||||
|
||||
self.panels['main_screen'] = grid
|
||||
|
||||
print ("### Adding main panel")
|
||||
self.add(self.panels['main_screen'])
|
||||
self.show_all()
|
||||
self._cur_panels.append("main_screen")
|
||||
|
||||
def _go_to_submenu(self, widget, menu):
|
||||
print "#### Go to submenu " + str(menu)
|
||||
self._remove_current_panel(False)
|
||||
|
||||
# Find current menu item
|
||||
panels = list(self._cur_panels)
|
||||
cur_item = self._find_current_menu_item(menu, self._config, panels.pop(0))
|
||||
menu = cur_item['items']
|
||||
|
||||
grid = self.arrangeMenuItems(menu, 4)
|
||||
|
||||
b = KlippyGtk.ButtonImage('back', 'Back')
|
||||
b.connect("clicked", self._menu_go_back)
|
||||
grid.attach(b, 4, 2, 1, 1)
|
||||
|
||||
self._cur_panels.append(cur_item['name']) #str(cur_item['name']))
|
||||
self.panels[cur_item['name']] = grid
|
||||
self.add(self.panels[cur_item['name']])
|
||||
self.show_all()
|
||||
|
||||
|
||||
|
||||
def _find_current_menu_item(self, menu, items, names):
|
||||
# TODO: Make recursive
|
||||
return items[menu]
|
||||
|
||||
|
||||
def _remove_all_panels(self):
|
||||
while len(self._cur_panels) > 0:
|
||||
self._remove_current_panel()
|
||||
|
||||
def _remove_current_panel(self, pop=True):
|
||||
print "1 " + str(self._cur_panels)
|
||||
print self.panels.keys()
|
||||
if len(self._cur_panels) > 0:
|
||||
self.remove(
|
||||
self.panels[
|
||||
self._cur_panels[-1]
|
||||
]
|
||||
)
|
||||
if pop == True:
|
||||
print "Popping _cur_panels"
|
||||
self._cur_panels.pop()
|
||||
if len(self._cur_panels) > 0:
|
||||
self.add(self.panels[self._cur_panels[-1]])
|
||||
self.show_all()
|
||||
|
||||
def _menu_go_back (self, widget):
|
||||
print "#### Menu go back"
|
||||
self._remove_current_panel()
|
||||
|
||||
def _websocket_callback(self, action, data):
|
||||
if action == "notify_klippy_state_changed":
|
||||
if data == "ready":
|
||||
print "### Going to ready state"
|
||||
self.printer_ready()
|
||||
elif data == "disconnect" or data == "shutdown":
|
||||
print "### Going to disconnected state"
|
||||
self.printer_initializing()
|
||||
|
||||
elif action == "notify_status_update":
|
||||
#print data
|
||||
if "idle_status" in self.panels:
|
||||
if "heater_bed" in data:
|
||||
self.panels['idle_status'].update_temp(
|
||||
"bed",
|
||||
round(data['heater_bed']['temperature'],1),
|
||||
round(data['heater_bed']['target'],1)
|
||||
)
|
||||
if "extruder" in data and data['extruder'] != "extruder":
|
||||
self.panels['idle_status'].update_temp(
|
||||
"tool0",
|
||||
round(data['extruder']['temperature'],1),
|
||||
round(data['extruder']['target'],1)
|
||||
)
|
||||
|
||||
|
||||
def set_bed_temp (self, num, target):
|
||||
print str(num) + "C / " + str(target) + "C"
|
||||
if self.bed_temp_label == None:
|
||||
return
|
||||
self.bed_temp_label.set_text(str(num) + "C / " + str(target) + "C")
|
||||
|
||||
def arrangeMenuItems (self, items, columns):
|
||||
grid = Gtk.Grid()
|
||||
grid.set_row_homogeneous(True)
|
||||
grid.set_column_homogeneous(True)
|
||||
|
||||
l = len(items)
|
||||
i = 0
|
||||
print items
|
||||
for i in range(l):
|
||||
col = i % columns
|
||||
row = round(i/columns, 0)
|
||||
width = 1
|
||||
#if i+1 == l and l%2 == 1:
|
||||
# width = 2
|
||||
b = KlippyGtk.ButtonImage(
|
||||
items[i]['icon'], items[i]['name'], "color"+str((i%4)+1)
|
||||
)
|
||||
if "items" in items[i]:
|
||||
b.connect("clicked", self._go_to_submenu, i)
|
||||
elif "method" in items[i]:
|
||||
params = items[i]['params'] if "params" in items[i] else {}
|
||||
b.connect("clicked", self._send_action, items[i]['method'], params)
|
||||
|
||||
|
||||
grid.attach(b, col, row, 1, width)
|
||||
|
||||
i += 1
|
||||
|
||||
return grid
|
||||
|
||||
def _send_action(self, widget, method, params):
|
||||
self._ws.send_method(method, params)
|
||||
|
||||
def printer_initializing(self):
|
||||
self._remove_all_panels()
|
||||
self.splash_screen()
|
||||
|
||||
def printer_ready(self):
|
||||
self._remove_all_panels()
|
||||
self.main_panel()
|
||||
|
||||
def on_button1_clicked(self, widget):
|
||||
print("Hello")
|
||||
|
||||
def on_button2_clicked(self, widget):
|
||||
print("Goodbye")
|
||||
|
||||
|
||||
win = KlipperScreen()
|
||||
@@ -101,9 +253,7 @@ win.connect("destroy", Gtk.main_quit)
|
||||
win.show_all()
|
||||
Gtk.main()
|
||||
|
||||
|
||||
#win = KlipperScreen()
|
||||
#win.connect("destroy", Gtk.main_quit)
|
||||
#win.show_all()
|
||||
#Gtk.main()
|
||||
|
||||
|
Reference in New Issue
Block a user