mirror of
https://github.com/naruxde/revpipycontrol.git
synced 2025-11-08 23:53:52 +01:00
Reaktion auf Fehlerbytes vom RevPi f?r Logfile In Dialogfenster ESC zum schlie?en eingebaut _checkclose Funktionen zur Pr?fung auf ?nderung und Schlie?en hinzugef?gt
159 lines
5.1 KiB
Python
159 lines
5.1 KiB
Python
#
|
||
# RevPiPyControl
|
||
#
|
||
# Webpage: https://revpimodio.org/revpipyplc/
|
||
# (c) Sven Sager, License: LGPLv3
|
||
#
|
||
# -*- coding: utf-8 -*-
|
||
import tkinter
|
||
from mytools import gettrans
|
||
|
||
# Übersetzung laden
|
||
_ = gettrans()
|
||
|
||
|
||
class RevPiLogfile(tkinter.Frame):
|
||
|
||
def __init__(self, master, xmlcli):
|
||
u"""Init RevPiLogfile-Class."""
|
||
super().__init__(master)
|
||
self.master.bind("<KeyPress-Escape>", self._closewin)
|
||
self.pack(fill="both", expand=True)
|
||
self.xmlcli = xmlcli
|
||
|
||
# Systemvariablen
|
||
self.loadblock = 16384
|
||
self.mrkapp = 0
|
||
self.mrkplc = 0
|
||
|
||
# Fenster bauen
|
||
self._createwidgets()
|
||
|
||
def _closewin(self, event):
|
||
self.master.destroy()
|
||
|
||
def _createwidgets(self):
|
||
u"""Erstellt alle Widgets."""
|
||
self.master.wm_title(_("RevPi Python PLC Logs"))
|
||
|
||
self.rowconfigure(0, weight=0)
|
||
self.rowconfigure(1, weight=1)
|
||
self.columnconfigure(0, weight=1)
|
||
self.columnconfigure(1, weight=0)
|
||
self.columnconfigure(2, weight=0)
|
||
self.columnconfigure(3, weight=1)
|
||
self.columnconfigure(4, weight=0)
|
||
self.columnconfigure(5, weight=0)
|
||
|
||
# PLC Log
|
||
self.lblapplog = tkinter.Label(self)
|
||
self.lblapplog["text"] = _("RevPiPyLoad - Logfile")
|
||
self.lblapplog.grid(column=0, row=0, sticky="w")
|
||
self.btnapplog = tkinter.Button(self)
|
||
self.btnapplog["command"] = self.btn_clearplc
|
||
self.btnapplog["text"] = _("Clear screen")
|
||
self.btnapplog.grid(column=1, row=0, sticky="e")
|
||
self.plclog = tkinter.Text(self)
|
||
self.plcscr = tkinter.Scrollbar(self)
|
||
self.plclog.grid(sticky="wnse", columnspan=2, column=0, row=1)
|
||
self.plcscr.grid(sticky="ns", column=2, row=1)
|
||
self.plclog["yscrollcommand"] = self.plcscr.set
|
||
self.plcscr["command"] = self.plclog.yview
|
||
|
||
# APP Log
|
||
self.lblapplog = tkinter.Label(self)
|
||
self.lblapplog["text"] = _("Python PLC program - Logfile")
|
||
self.lblapplog.grid(column=3, row=0, sticky="w")
|
||
self.btnapplog = tkinter.Button(self)
|
||
self.btnapplog["command"] = self.btn_clearapp
|
||
self.btnapplog["text"] = _("Clear screen")
|
||
self.btnapplog.grid(column=4, row=0, sticky="e")
|
||
self.applog = tkinter.Text(self)
|
||
self.appscr = tkinter.Scrollbar(self)
|
||
self.applog.grid(sticky="nesw", columnspan=2, column=3, row=1)
|
||
self.appscr.grid(sticky="ns", column=5, row=1)
|
||
self.applog["yscrollcommand"] = self.appscr.set
|
||
self.appscr["command"] = self.applog.yview
|
||
|
||
# Logtimer zum Laden starten
|
||
self.get_applog(full=True)
|
||
self.get_plclog(full=True)
|
||
|
||
def btn_clearapp(self):
|
||
u"""Leert die Logliste der App."""
|
||
self.applog.delete(1.0, tkinter.END)
|
||
|
||
def btn_clearplc(self):
|
||
u"""Leert die Logliste des PLC."""
|
||
self.plclog.delete(1.0, tkinter.END)
|
||
|
||
def get_applog(self, full=False):
|
||
u"""Ruft App Logbuch ab.
|
||
@param full: Ganzes Logbuch laden"""
|
||
|
||
# Logs abrufen und letzte Position merken
|
||
self.mrkapp = self._load_log(
|
||
self.applog, self.xmlcli.load_applog, self.mrkapp, full
|
||
)
|
||
|
||
# Timer neu starten
|
||
self.master.after(1000, self.get_applog)
|
||
|
||
def get_plclog(self, full=False):
|
||
u"""Ruft PLC Logbuch ab.
|
||
@param full: Ganzes Logbuch laden"""
|
||
|
||
# Logs abrufen und letzte Position merken
|
||
self.mrkplc = self._load_log(
|
||
self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
|
||
)
|
||
|
||
# Timer neu starten
|
||
self.master.after(1000, self.get_plclog)
|
||
|
||
def _load_log(self, textwidget, xmlcall, startposition, full):
|
||
u"""Läd die angegebenen Logfiles herunter.
|
||
|
||
@param textwidget: Widget in das Logs eingefügt werden sollen
|
||
@param xmlcall: xmlrpc Funktion zum Abrufen der Logdaten
|
||
@param startposition: Startposition ab der Logdaten kommen sollen
|
||
@param full: Komplettes Logbuch laden
|
||
@returns: Ende der Datei (neue Startposition)
|
||
|
||
"""
|
||
roll = textwidget.yview()[1] == 1.0
|
||
startposition = 0 if full else startposition
|
||
logbytes = b''
|
||
while True:
|
||
# Datenblock vom XML-RPC Server holen
|
||
bytebuff = xmlcall(startposition, self.loadblock).data
|
||
|
||
logbytes += bytebuff
|
||
startposition += len(bytebuff)
|
||
|
||
# Prüfen ob alle Daten übertragen wurden
|
||
if len(bytebuff) < self.loadblock:
|
||
break
|
||
|
||
if full:
|
||
textwidget.delete(1.0, tkinter.END)
|
||
|
||
if bytebuff == b'\x16': #
|
||
# Kein Zugriff auf Logdatei
|
||
textwidget.delete(1.0, tkinter.END)
|
||
textwidget.insert(
|
||
tkinter.END, _("Can not access log file on the RevPi")
|
||
)
|
||
elif bytebuff == b'\x19': #
|
||
# Logdatei neu begonnen
|
||
startposition = 0
|
||
else:
|
||
# Text in Widget übernehmen
|
||
textwidget.insert(tkinter.END, logbytes.decode("utf-8"))
|
||
|
||
# Automatisch ans Ende rollen
|
||
if roll or full:
|
||
textwidget.see(tkinter.END)
|
||
|
||
return startposition
|