mirror of
https://github.com/naruxde/revpicommander.git
synced 2025-11-08 16:43:53 +01:00
refactor: Using module based logger and not root logger from proginit
This commit is contained in:
@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2023 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
from logging import getLogger
|
||||||
from re import compile
|
from re import compile
|
||||||
from sys import platform
|
from sys import platform
|
||||||
|
|
||||||
@@ -12,10 +13,11 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||||||
from zeroconf import IPVersion, ServiceBrowser, Zeroconf
|
from zeroconf import IPVersion, ServiceBrowser, Zeroconf
|
||||||
|
|
||||||
from . import helper
|
from . import helper
|
||||||
from . import proginit as pi
|
|
||||||
from .helper import RevPiSettings, WidgetData, all_revpi_settings
|
from .helper import RevPiSettings, WidgetData, all_revpi_settings
|
||||||
from .ui.avahisearch_ui import Ui_diag_search
|
from .ui.avahisearch_ui import Ui_diag_search
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class AvahiSearchThread(QtCore.QThread):
|
class AvahiSearchThread(QtCore.QThread):
|
||||||
"""Search thread for Revolution Pi with installed RevPiPyLoad."""
|
"""Search thread for Revolution Pi with installed RevPiPyLoad."""
|
||||||
@@ -34,12 +36,12 @@ class AvahiSearchThread(QtCore.QThread):
|
|||||||
|
|
||||||
def remove_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
def remove_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
||||||
"""Revolution Pi disappeared."""
|
"""Revolution Pi disappeared."""
|
||||||
pi.logger.debug("AvahiSearchThread.remove_service")
|
log.debug("AvahiSearchThread.remove_service")
|
||||||
self.removed.emit(name, conf_type)
|
self.removed.emit(name, conf_type)
|
||||||
|
|
||||||
def add_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
def add_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
||||||
"""New Revolution Pi found."""
|
"""New Revolution Pi found."""
|
||||||
pi.logger.debug("AvahiSearchThread.add_service")
|
log.debug("AvahiSearchThread.add_service")
|
||||||
info = zeroconf.get_service_info(conf_type, name)
|
info = zeroconf.get_service_info(conf_type, name)
|
||||||
if not info:
|
if not info:
|
||||||
return
|
return
|
||||||
@@ -49,7 +51,7 @@ class AvahiSearchThread(QtCore.QThread):
|
|||||||
|
|
||||||
def update_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
def update_service(self, zeroconf: Zeroconf, conf_type: str, name: str) -> None:
|
||||||
"""New data of revolution pi"""
|
"""New data of revolution pi"""
|
||||||
pi.logger.debug("AvahiSearchThread.add_service")
|
log.debug("AvahiSearchThread.add_service")
|
||||||
info = zeroconf.get_service_info(conf_type, name)
|
info = zeroconf.get_service_info(conf_type, name)
|
||||||
if not info:
|
if not info:
|
||||||
return
|
return
|
||||||
@@ -58,14 +60,14 @@ class AvahiSearchThread(QtCore.QThread):
|
|||||||
self.updated.emit(name, info.server, info.port, conf_type, ip)
|
self.updated.emit(name, info.server, info.port, conf_type, ip)
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
pi.logger.debug("Started zero conf discovery.")
|
log.debug("Started zero conf discovery.")
|
||||||
zeroconf = Zeroconf()
|
zeroconf = Zeroconf()
|
||||||
revpi_browser = ServiceBrowser(zeroconf, "_revpipyload._tcp.local.", self)
|
revpi_browser = ServiceBrowser(zeroconf, "_revpipyload._tcp.local.", self)
|
||||||
while not self.isInterruptionRequested():
|
while not self.isInterruptionRequested():
|
||||||
# Just hanging around :)
|
# Just hanging around :)
|
||||||
self.msleep(self._cycle_wait_ms)
|
self.msleep(self._cycle_wait_ms)
|
||||||
zeroconf.close()
|
zeroconf.close()
|
||||||
pi.logger.debug("Stopped zero conf discovery.")
|
log.debug("Stopped zero conf discovery.")
|
||||||
|
|
||||||
|
|
||||||
class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
||||||
@@ -191,7 +193,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_act_connect_triggered(self) -> None:
|
def on_act_connect_triggered(self) -> None:
|
||||||
"""Connect via existing settings or ask for type."""
|
"""Connect via existing settings or ask for type."""
|
||||||
pi.logger.debug("AvahiSearch.on_act_connect_triggered")
|
log.debug("AvahiSearch.on_act_connect_triggered")
|
||||||
selected_items = self.tb_revpi.selectedItems()
|
selected_items = self.tb_revpi.selectedItems()
|
||||||
if not selected_items:
|
if not selected_items:
|
||||||
return
|
return
|
||||||
@@ -206,7 +208,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_act_connect_ssh_triggered(self) -> None:
|
def on_act_connect_ssh_triggered(self) -> None:
|
||||||
"""Create new revpi settings with ssh, save and connect."""
|
"""Create new revpi settings with ssh, save and connect."""
|
||||||
pi.logger.debug("AvahiSearch.on_act_connect_ssh_triggered")
|
log.debug("AvahiSearch.on_act_connect_ssh_triggered")
|
||||||
if self.tb_revpi.currentRow() == -1:
|
if self.tb_revpi.currentRow() == -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -218,7 +220,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_act_connect_xmlrpc_triggered(self) -> None:
|
def on_act_connect_xmlrpc_triggered(self) -> None:
|
||||||
"""Create new revpi settings with XML-RPC, save and connect."""
|
"""Create new revpi settings with XML-RPC, save and connect."""
|
||||||
pi.logger.debug("AvahiSearch.on_act_connect_xmlrpc_triggered")
|
log.debug("AvahiSearch.on_act_connect_xmlrpc_triggered")
|
||||||
if self.tb_revpi.currentRow() == -1:
|
if self.tb_revpi.currentRow() == -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -331,7 +333,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot(int, int)
|
@QtCore.pyqtSlot(int, int)
|
||||||
def on_tb_revpi_cellDoubleClicked(self, row: int, column: int) -> None:
|
def on_tb_revpi_cellDoubleClicked(self, row: int, column: int) -> None:
|
||||||
"""Connect to double-clicked Revolution Pi."""
|
"""Connect to double-clicked Revolution Pi."""
|
||||||
pi.logger.debug("AvahiSearch.on_tb_revpi_cellDoubleClicked")
|
log.debug("AvahiSearch.on_tb_revpi_cellDoubleClicked")
|
||||||
selected_items = self.tb_revpi.selectedItems()
|
selected_items = self.tb_revpi.selectedItems()
|
||||||
if not selected_items:
|
if not selected_items:
|
||||||
return
|
return
|
||||||
@@ -353,7 +355,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_connect_clicked(self) -> None:
|
def on_btn_connect_clicked(self) -> None:
|
||||||
"""Connect to selected Revolution Pi."""
|
"""Connect to selected Revolution Pi."""
|
||||||
pi.logger.debug("AvahiSearch.on_btn_connect_clicked")
|
log.debug("AvahiSearch.on_btn_connect_clicked")
|
||||||
selected_items = self.tb_revpi.selectedItems()
|
selected_items = self.tb_revpi.selectedItems()
|
||||||
if not selected_items:
|
if not selected_items:
|
||||||
return
|
return
|
||||||
@@ -370,7 +372,7 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_save_clicked(self) -> None:
|
def on_btn_save_clicked(self) -> None:
|
||||||
"""Save selected Revolution Pi."""
|
"""Save selected Revolution Pi."""
|
||||||
pi.logger.debug("AvahiSearch.on_btn_save_clicked")
|
log.debug("AvahiSearch.on_btn_save_clicked")
|
||||||
row_index = self.tb_revpi.currentRow()
|
row_index = self.tb_revpi.currentRow()
|
||||||
if row_index == -1:
|
if row_index == -1:
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||||||
|
|
||||||
from .ui.backgroundworker_ui import Ui_diag_backgroundworker
|
from .ui.backgroundworker_ui import Ui_diag_backgroundworker
|
||||||
|
|
||||||
log = getLogger()
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class BackgroundWorker(QtCore.QThread):
|
class BackgroundWorker(QtCore.QThread):
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2023 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
import pickle
|
import pickle
|
||||||
|
from logging import getLogger
|
||||||
from xmlrpc.client import Binary, Fault, MultiCall, MultiCallIterator
|
from xmlrpc.client import Binary, Fault, MultiCall, MultiCallIterator
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
@@ -14,6 +15,8 @@ from . import proginit as pi
|
|||||||
from .debugios import DebugIos
|
from .debugios import DebugIos
|
||||||
from .ui.debugcontrol_ui import Ui_wid_debugcontrol
|
from .ui.debugcontrol_ui import Ui_wid_debugcontrol
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class PsValues(QtCore.QThread):
|
class PsValues(QtCore.QThread):
|
||||||
"""
|
"""
|
||||||
@@ -31,7 +34,7 @@ class PsValues(QtCore.QThread):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Read IO values of Revolution Pi."""
|
"""Read IO values of Revolution Pi."""
|
||||||
pi.logger.debug("PsValues.run enter")
|
log.debug("PsValues.run enter")
|
||||||
|
|
||||||
while not self.isInterruptionRequested():
|
while not self.isInterruptionRequested():
|
||||||
try:
|
try:
|
||||||
@@ -39,16 +42,16 @@ class PsValues(QtCore.QThread):
|
|||||||
helper.cm.call_remote_function("ps_values", raise_exception=True)
|
helper.cm.call_remote_function("ps_values", raise_exception=True)
|
||||||
)
|
)
|
||||||
except Fault:
|
except Fault:
|
||||||
pi.logger.warning("Detected piCtory reset.")
|
log.warning("Detected piCtory reset.")
|
||||||
self.requestInterruption()
|
self.requestInterruption()
|
||||||
self.driver_reset_detected.emit()
|
self.driver_reset_detected.emit()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
self.process_image_received.emit(Binary())
|
self.process_image_received.emit(Binary())
|
||||||
|
|
||||||
self.msleep(self._cycle_time)
|
self.msleep(self._cycle_time)
|
||||||
|
|
||||||
pi.logger.debug("PsValues.run exit")
|
log.debug("PsValues.run exit")
|
||||||
|
|
||||||
|
|
||||||
class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
||||||
@@ -87,11 +90,11 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
self.shc_write_o.activated.connect(self.on_btn_write_o_clicked)
|
self.shc_write_o.activated.connect(self.on_btn_write_o_clicked)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
pi.logger.debug("DebugControl.__del__")
|
log.debug("DebugControl.__del__")
|
||||||
|
|
||||||
def _set_gui_control_states(self):
|
def _set_gui_control_states(self):
|
||||||
"""Set states depending on acl level."""
|
"""Set states depending on acl level."""
|
||||||
pi.logger.debug("DebugControl._set_gui_control_states")
|
log.debug("DebugControl._set_gui_control_states")
|
||||||
# xml_mode view >= 1
|
# xml_mode view >= 1
|
||||||
# xml_mode write >= 3
|
# xml_mode write >= 3
|
||||||
self.btn_read_io.setEnabled(not self.cbx_write.isChecked())
|
self.btn_read_io.setEnabled(not self.cbx_write.isChecked())
|
||||||
@@ -109,7 +112,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
|
|
||||||
:param device_position: Only device position or -1 for all
|
:param device_position: Only device position or -1 for all
|
||||||
"""
|
"""
|
||||||
pi.logger.debug("DebugControl._destroy_io_view")
|
log.debug("DebugControl._destroy_io_view")
|
||||||
for position in sorted(self.dict_devices) if device_position == -1 else [device_position]:
|
for position in sorted(self.dict_devices) if device_position == -1 else [device_position]:
|
||||||
if position in self.dict_windows:
|
if position in self.dict_windows:
|
||||||
# Remove singe window and button
|
# Remove singe window and button
|
||||||
@@ -151,11 +154,11 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
try:
|
try:
|
||||||
ba_values = helper.cm.call_remote_function("ps_values", raise_exception=True)
|
ba_values = helper.cm.call_remote_function("ps_values", raise_exception=True)
|
||||||
except Fault:
|
except Fault:
|
||||||
pi.logger.warning("Detected piCtory reset.")
|
log.warning("Detected piCtory reset.")
|
||||||
self._driver_reset_detected()
|
self._driver_reset_detected()
|
||||||
return
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
ba_values = Binary()
|
ba_values = Binary()
|
||||||
|
|
||||||
# From now on use bytes instead of Binary
|
# From now on use bytes instead of Binary
|
||||||
@@ -255,7 +258,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
return
|
return
|
||||||
elif not isinstance(return_list, list):
|
elif not isinstance(return_list, list):
|
||||||
return
|
return
|
||||||
pi.logger.debug("DebugControl._validate_multicall")
|
log.debug("DebugControl._validate_multicall")
|
||||||
|
|
||||||
str_errmsg = ""
|
str_errmsg = ""
|
||||||
for lst_result in return_list: # type: list
|
for lst_result in return_list: # type: list
|
||||||
@@ -272,13 +275,13 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
self.dict_windows[lst_result[0]].reset_change_value_colors(lst_result[1])
|
self.dict_windows[lst_result[0]].reset_change_value_colors(lst_result[1])
|
||||||
|
|
||||||
if str_errmsg != "":
|
if str_errmsg != "":
|
||||||
pi.logger.error(str_errmsg)
|
log.error(str_errmsg)
|
||||||
if not self.cbx_refresh.isChecked():
|
if not self.cbx_refresh.isChecked():
|
||||||
QtWidgets.QMessageBox.critical(self, self.tr("Error"), str_errmsg)
|
QtWidgets.QMessageBox.critical(self, self.tr("Error"), str_errmsg)
|
||||||
|
|
||||||
def deleteLater(self):
|
def deleteLater(self):
|
||||||
"""Clean up all sub windows."""
|
"""Clean up all sub windows."""
|
||||||
pi.logger.debug("DebugControl.deleteLater")
|
log.debug("DebugControl.deleteLater")
|
||||||
|
|
||||||
self.cbx_write.setChecked(False)
|
self.cbx_write.setChecked(False)
|
||||||
self.cbx_refresh.setChecked(False)
|
self.cbx_refresh.setChecked(False)
|
||||||
@@ -288,7 +291,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
|
|
||||||
def reload_devices(self):
|
def reload_devices(self):
|
||||||
"""Rebuild GUI depending on devices and ios of Revolution Pi."""
|
"""Rebuild GUI depending on devices and ios of Revolution Pi."""
|
||||||
pi.logger.debug("DebugControl.reload_devices")
|
log.debug("DebugControl.reload_devices")
|
||||||
|
|
||||||
if not helper.cm.call_remote_function("psstart", default_value=False):
|
if not helper.cm.call_remote_function("psstart", default_value=False):
|
||||||
# RevPiPyLoad does not support psstart (too old)
|
# RevPiPyLoad does not support psstart (too old)
|
||||||
@@ -358,7 +361,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
@QtCore.pyqtSlot(bool)
|
@QtCore.pyqtSlot(bool)
|
||||||
def on_btn_device_clicked(self, checked: bool):
|
def on_btn_device_clicked(self, checked: bool):
|
||||||
"""Open or close IO window."""
|
"""Open or close IO window."""
|
||||||
pi.logger.debug("DebugControl.on_btn_device_clicked")
|
log.debug("DebugControl.on_btn_device_clicked")
|
||||||
|
|
||||||
position = int(self.sender().objectName())
|
position = int(self.sender().objectName())
|
||||||
if position in self.dict_windows:
|
if position in self.dict_windows:
|
||||||
@@ -369,14 +372,14 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
def on_device_closed(self, position: int):
|
def on_device_closed(self, position: int):
|
||||||
"""Change the check state of button, if window was closed."""
|
"""Change the check state of button, if window was closed."""
|
||||||
pi.logger.debug("DebugControl.on_device_closed")
|
log.debug("DebugControl.on_device_closed")
|
||||||
btn = self.gb_devices.findChild(QtWidgets.QPushButton, str(position)) # type: QtWidgets.QPushButton
|
btn = self.gb_devices.findChild(QtWidgets.QPushButton, str(position)) # type: QtWidgets.QPushButton
|
||||||
btn.setChecked(False)
|
btn.setChecked(False)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_read_io_pressed(self):
|
def on_btn_read_io_pressed(self):
|
||||||
"""Read all IO values and replace changed ones."""
|
"""Read all IO values and replace changed ones."""
|
||||||
pi.logger.debug("DebugControl.on_btn_read_io_pressed")
|
log.debug("DebugControl.on_btn_read_io_pressed")
|
||||||
for win in self.dict_windows.values(): # type: DebugIos
|
for win in self.dict_windows.values(): # type: DebugIos
|
||||||
win.reset_label_colors()
|
win.reset_label_colors()
|
||||||
self._work_values()
|
self._work_values()
|
||||||
@@ -384,14 +387,14 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_refresh_io_pressed(self):
|
def on_btn_refresh_io_pressed(self):
|
||||||
"""Read all IO values but do not touch changed ones."""
|
"""Read all IO values but do not touch changed ones."""
|
||||||
pi.logger.debug("DebugControl.on_btn_refresh_io_pressed")
|
log.debug("DebugControl.on_btn_refresh_io_pressed")
|
||||||
if not self.cbx_refresh.isChecked():
|
if not self.cbx_refresh.isChecked():
|
||||||
self._work_values(refresh=True)
|
self._work_values(refresh=True)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_write_o_clicked(self):
|
def on_btn_write_o_clicked(self):
|
||||||
"""Write outputs."""
|
"""Write outputs."""
|
||||||
pi.logger.debug("DebugControl.on_btn_write_o_clicked")
|
log.debug("DebugControl.on_btn_write_o_clicked")
|
||||||
if not self.cbx_write.isChecked() and (helper.cm.xml_mode >= 3 or helper.cm.simulating):
|
if not self.cbx_write.isChecked() and (helper.cm.xml_mode >= 3 or helper.cm.simulating):
|
||||||
for win in self.dict_windows.values(): # type: DebugIos
|
for win in self.dict_windows.values(): # type: DebugIos
|
||||||
win.reset_label_colors()
|
win.reset_label_colors()
|
||||||
@@ -400,7 +403,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
def on_cbx_refresh_stateChanged(self, state: int):
|
def on_cbx_refresh_stateChanged(self, state: int):
|
||||||
"""Start or stop the auto refresh thread."""
|
"""Start or stop the auto refresh thread."""
|
||||||
pi.logger.debug("DebugControl.cbx_refresh_stateChanged")
|
log.debug("DebugControl.cbx_refresh_stateChanged")
|
||||||
|
|
||||||
# Start / stop worker thread
|
# Start / stop worker thread
|
||||||
if state == QtCore.Qt.Checked and (helper.cm.connected or helper.cm.simulating):
|
if state == QtCore.Qt.Checked and (helper.cm.connected or helper.cm.simulating):
|
||||||
@@ -433,7 +436,7 @@ class DebugControl(QtWidgets.QWidget, Ui_wid_debugcontrol):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
def on_cbx_write_stateChanged(self, state: int):
|
def on_cbx_write_stateChanged(self, state: int):
|
||||||
pi.logger.debug("DebugControl.cbx_write_stateChanged")
|
log.debug("DebugControl.cbx_write_stateChanged")
|
||||||
checked = state == QtCore.Qt.Checked
|
checked = state == QtCore.Qt.Checked
|
||||||
for win in self.dict_windows.values(): # type: DebugIos
|
for win in self.dict_windows.values(): # type: DebugIos
|
||||||
win.write_values = checked
|
win.write_values = checked
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2023 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
import struct
|
import struct
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
@@ -12,6 +13,8 @@ from . import helper
|
|||||||
from . import proginit as pi
|
from . import proginit as pi
|
||||||
from .ui.debugios_ui import Ui_win_debugios
|
from .ui.debugios_ui import Ui_win_debugios
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
||||||
"""IO window of one device."""
|
"""IO window of one device."""
|
||||||
@@ -46,10 +49,10 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
|||||||
self.style_sheet = "background-color: red;"
|
self.style_sheet = "background-color: red;"
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
pi.logger.debug("DebugIos.__del__")
|
log.debug("DebugIos.__del__")
|
||||||
|
|
||||||
def closeEvent(self, a0: QtGui.QCloseEvent):
|
def closeEvent(self, a0: QtGui.QCloseEvent):
|
||||||
pi.logger.debug("DebugIos.closeEvent")
|
log.debug("DebugIos.closeEvent")
|
||||||
helper.cm.settings.debug_geos[self.position] = self.saveGeometry()
|
helper.cm.settings.debug_geos[self.position] = self.saveGeometry()
|
||||||
self.device_closed.emit(self.position)
|
self.device_closed.emit(self.position)
|
||||||
|
|
||||||
@@ -108,7 +111,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
|||||||
signed != val.property("signed"):
|
signed != val.property("signed"):
|
||||||
del self.__qwa[name]
|
del self.__qwa[name]
|
||||||
layout.removeRow(layout.getWidgetPosition(val)[0])
|
layout.removeRow(layout.getWidgetPosition(val)[0])
|
||||||
pi.logger.debug("Destroy property changed IO '{0}'".format(name))
|
log.debug("Destroy property changed IO '{0}'".format(name))
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -209,7 +212,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
|||||||
@QtCore.pyqtSlot(QtCore.QPoint)
|
@QtCore.pyqtSlot(QtCore.QPoint)
|
||||||
def on_context_menu(self, point: QtCore.QPoint):
|
def on_context_menu(self, point: QtCore.QPoint):
|
||||||
"""Generate menu for data format changes."""
|
"""Generate menu for data format changes."""
|
||||||
pi.logger.debug("DebugIos.on_context_menu")
|
log.debug("DebugIos.on_context_menu")
|
||||||
|
|
||||||
sender = self.sender()
|
sender = self.sender()
|
||||||
men = QtWidgets.QMenu(sender)
|
men = QtWidgets.QMenu(sender)
|
||||||
@@ -289,7 +292,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
|||||||
|
|
||||||
:param io_name: Clean up only this IO
|
:param io_name: Clean up only this IO
|
||||||
"""
|
"""
|
||||||
pi.logger.debug("DebugIos.reset_change_value_colors")
|
log.debug("DebugIos.reset_change_value_colors")
|
||||||
if io_name is None:
|
if io_name is None:
|
||||||
lst_wid = self.saw_out.findChildren(
|
lst_wid = self.saw_out.findChildren(
|
||||||
self.search_class, options=QtCore.Qt.FindDirectChildrenOnly)
|
self.search_class, options=QtCore.Qt.FindDirectChildrenOnly)
|
||||||
@@ -346,7 +349,7 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
|
|||||||
)
|
)
|
||||||
return actual_value, last_value
|
return actual_value, last_value
|
||||||
except Exception:
|
except Exception:
|
||||||
pi.logger.error("Could not convert '{0}' to bytes".format(actual_value))
|
log.error("Could not convert '{0}' to bytes".format(actual_value))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return actual_value.encode(), last_value.encode()
|
return actual_value.encode(), last_value.encode()
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import pickle
|
|||||||
import socket
|
import socket
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
from http.client import CannotSendRequest
|
from http.client import CannotSendRequest
|
||||||
|
from logging import getLogger
|
||||||
from os import environ, remove
|
from os import environ, remove
|
||||||
from os.path import exists
|
from os.path import exists
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
@@ -22,6 +23,8 @@ from paramiko.ssh_exception import AuthenticationException
|
|||||||
from . import proginit as pi
|
from . import proginit as pi
|
||||||
from .ssh_tunneling.server import SSHLocalTunnel
|
from .ssh_tunneling.server import SSHLocalTunnel
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
settings = QtCore.QSettings("revpimodio.org", "revpicommander")
|
settings = QtCore.QSettings("revpimodio.org", "revpicommander")
|
||||||
"""Global application settings."""
|
"""Global application settings."""
|
||||||
|
|
||||||
@@ -243,7 +246,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
self._xml_mode_refresh = False
|
self._xml_mode_refresh = False
|
||||||
|
|
||||||
def __call_simulator(self, function_name: str, *args, default_value=None, **kwargs):
|
def __call_simulator(self, function_name: str, *args, default_value=None, **kwargs):
|
||||||
pi.logger.debug("ConnectionManager.__call_simulator({0})".format(function_name))
|
log.debug("ConnectionManager.__call_simulator({0})".format(function_name))
|
||||||
if function_name == "ps_values":
|
if function_name == "ps_values":
|
||||||
if self._revpi.readprocimg():
|
if self._revpi.readprocimg():
|
||||||
bytebuff = bytearray()
|
bytebuff = bytearray()
|
||||||
@@ -387,7 +390,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
xml_funcs = sp.system.listMethods()
|
xml_funcs = sp.system.listMethods()
|
||||||
xml_mode = sp.xmlmodus()
|
xml_mode = sp.xmlmodus()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.exception(e)
|
log.exception(e)
|
||||||
self.connection_error_observed.emit(str(e))
|
self.connection_error_observed.emit(str(e))
|
||||||
|
|
||||||
if revpi_settings.ssh_use_tunnel:
|
if revpi_settings.ssh_use_tunnel:
|
||||||
@@ -451,7 +454,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
self._revpi = None
|
self._revpi = None
|
||||||
self._revpi_output = None
|
self._revpi_output = None
|
||||||
|
|
||||||
pi.logger.debug("Simulator destroyed.")
|
log.debug("Simulator destroyed.")
|
||||||
self.connection_disconnected.emit()
|
self.connection_disconnected.emit()
|
||||||
|
|
||||||
elif self._cli is not None:
|
elif self._cli is not None:
|
||||||
@@ -483,7 +486,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
:param procimg: Process image, which is a 4 kByte file for simulation
|
:param procimg: Process image, which is a 4 kByte file for simulation
|
||||||
:param clean_existing: Reset the file to ZERO \x00 bytes
|
:param clean_existing: Reset the file to ZERO \x00 bytes
|
||||||
"""
|
"""
|
||||||
pi.logger.debug("ConnectionManager.start_simulate")
|
log.debug("ConnectionManager.start_simulate")
|
||||||
|
|
||||||
if not exists(procimg) or clean_existing:
|
if not exists(procimg) or clean_existing:
|
||||||
with open(procimg, "wb") as fh:
|
with open(procimg, "wb") as fh:
|
||||||
@@ -507,7 +510,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
self.connection_established.emit()
|
self.connection_established.emit()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.exception(e)
|
log.exception(e)
|
||||||
self.connection_error_observed.emit(str(e))
|
self.connection_error_observed.emit(str(e))
|
||||||
self._revpi_output = None
|
self._revpi_output = None
|
||||||
self._revpi = None
|
self._revpi = None
|
||||||
@@ -522,7 +525,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
|
|
||||||
def reset_simulator(self):
|
def reset_simulator(self):
|
||||||
"""Reset all io to piCtory defaults."""
|
"""Reset all io to piCtory defaults."""
|
||||||
pi.logger.debug("ConnectionManager.reset_simulator")
|
log.debug("ConnectionManager.reset_simulator")
|
||||||
if settings.value("simulator/restart_zero", False, bool):
|
if settings.value("simulator/restart_zero", False, bool):
|
||||||
with open(self._revpi.procimg, "wb") as fh:
|
with open(self._revpi.procimg, "wb") as fh:
|
||||||
fh.write(b'\x00' * 4096)
|
fh.write(b'\x00' * 4096)
|
||||||
@@ -558,9 +561,9 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
self.xml_mode = sp.xmlmodus()
|
self.xml_mode = sp.xmlmodus()
|
||||||
self._xml_mode_refresh = False
|
self._xml_mode_refresh = False
|
||||||
except CannotSendRequest as e:
|
except CannotSendRequest as e:
|
||||||
pi.logger.warning(e)
|
log.warning(e)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.warning(e)
|
log.warning(e)
|
||||||
self.status_changed.emit(self.tr("SERVER ERROR"), "red")
|
self.status_changed.emit(self.tr("SERVER ERROR"), "red")
|
||||||
self.connection_error_observed.emit("{0} | {1}".format(e, type(e)))
|
self.connection_error_observed.emit("{0} | {1}".format(e, type(e)))
|
||||||
|
|
||||||
@@ -614,7 +617,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
:return: Return value of remote function or default_value
|
:return: Return value of remote function or default_value
|
||||||
"""
|
"""
|
||||||
if self._cli is None and self._revpi is None:
|
if self._cli is None and self._revpi is None:
|
||||||
pi.logger.error("Not connected while calling {0}".format(function_name))
|
log.error("Not connected while calling {0}".format(function_name))
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
raise ConnectionError("Connection manager not connected")
|
raise ConnectionError("Connection manager not connected")
|
||||||
return default_value
|
return default_value
|
||||||
@@ -638,7 +641,7 @@ class ConnectionManager(QtCore.QThread):
|
|||||||
if reload_funcs:
|
if reload_funcs:
|
||||||
self.xml_funcs = self._cli.system.listMethods()
|
self.xml_funcs = self._cli.system.listMethods()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
if raise_exception:
|
if raise_exception:
|
||||||
self._lck_cli.release()
|
self._lck_cli.release()
|
||||||
raise
|
raise
|
||||||
@@ -722,7 +725,7 @@ def import_old_settings():
|
|||||||
revpi_setting._settings = settings
|
revpi_setting._settings = settings
|
||||||
revpi_setting.save_settings()
|
revpi_setting.save_settings()
|
||||||
except Exception:
|
except Exception:
|
||||||
pi.logger.warning("Could not import saved connection {0}".format(i))
|
log.warning("Could not import saved connection {0}".format(i))
|
||||||
|
|
||||||
|
|
||||||
import_old_settings()
|
import_old_settings()
|
||||||
|
|||||||
@@ -5,11 +5,14 @@ __author__ = "Sven Sager"
|
|||||||
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5 import QtGui, QtWidgets
|
from PyQt5 import QtGui, QtWidgets
|
||||||
|
|
||||||
from . import proginit as pi
|
|
||||||
from .ui.mqttmanager_ui import Ui_diag_mqtt
|
from .ui.mqttmanager_ui import Ui_diag_mqtt
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MqttManager(QtWidgets.QDialog, Ui_diag_mqtt):
|
class MqttManager(QtWidgets.QDialog, Ui_diag_mqtt):
|
||||||
"""MQTT settings for option window."""
|
"""MQTT settings for option window."""
|
||||||
@@ -55,7 +58,7 @@ class MqttManager(QtWidgets.QDialog, Ui_diag_mqtt):
|
|||||||
self.txt_password.setText(self.dc["mqttpassword"])
|
self.txt_password.setText(self.dc["mqttpassword"])
|
||||||
self.txt_client_id.setText(self.dc["mqttclient_id"])
|
self.txt_client_id.setText(self.dc["mqttclient_id"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.exception(e)
|
log.exception(e)
|
||||||
self.dc = {}
|
self.dc = {}
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
from logging import getLogger
|
||||||
from os.path import dirname, join
|
from os.path import dirname, join
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
@@ -28,6 +29,8 @@ from .simulator import Simulator
|
|||||||
from .sshauth import SSHAuth
|
from .sshauth import SSHAuth
|
||||||
from .ui.revpicommander_ui import Ui_win_revpicommander
|
from .ui.revpicommander_ui import Ui_win_revpicommander
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ConnectingPyload(QtCore.QThread):
|
class ConnectingPyload(QtCore.QThread):
|
||||||
"""
|
"""
|
||||||
@@ -88,7 +91,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
|
|||||||
self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint, False)
|
self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint, False)
|
||||||
|
|
||||||
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
||||||
pi.logger.debug("RevPiCommander.closeEvent")
|
log.debug("RevPiCommander.closeEvent")
|
||||||
helper.cm.pyload_disconnect()
|
helper.cm.pyload_disconnect()
|
||||||
helper.settings.setValue("revpicommander/geo", self.saveGeometry())
|
helper.settings.setValue("revpicommander/geo", self.saveGeometry())
|
||||||
|
|
||||||
@@ -157,7 +160,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_cm_connection_disconnected(self):
|
def on_cm_connection_disconnected(self):
|
||||||
"""Connection of connection manager was disconnected."""
|
"""Connection of connection manager was disconnected."""
|
||||||
pi.logger.debug("RevPiCommander.on_cm_connection_disconnected")
|
log.debug("RevPiCommander.on_cm_connection_disconnected")
|
||||||
|
|
||||||
self._set_gui_control_states()
|
self._set_gui_control_states()
|
||||||
self.txt_host.setVisible(True)
|
self.txt_host.setVisible(True)
|
||||||
@@ -167,7 +170,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_cm_connection_disconnecting(self):
|
def on_cm_connection_disconnecting(self):
|
||||||
"""Connection of connection manager will now disconnect."""
|
"""Connection of connection manager will now disconnect."""
|
||||||
pi.logger.debug("RevPiCommander.on_cm_connection_disconnecting")
|
log.debug("RevPiCommander.on_cm_connection_disconnecting")
|
||||||
|
|
||||||
# This will remove the widgets in the button functions
|
# This will remove the widgets in the button functions
|
||||||
self.btn_plc_debug.setChecked(False)
|
self.btn_plc_debug.setChecked(False)
|
||||||
@@ -184,7 +187,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_cm_connection_established(self):
|
def on_cm_connection_established(self):
|
||||||
"""Connection manager established a new connection and loaded values."""
|
"""Connection manager established a new connection and loaded values."""
|
||||||
pi.logger.debug("RevPiCommander.on_cm_connection_established")
|
log.debug("RevPiCommander.on_cm_connection_established")
|
||||||
|
|
||||||
self._set_gui_control_states()
|
self._set_gui_control_states()
|
||||||
if helper.cm.simulating:
|
if helper.cm.simulating:
|
||||||
@@ -325,7 +328,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
|
|||||||
).format(procimg_file, configrsc_file)
|
).format(procimg_file, configrsc_file)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
pi.logger.error("Can not start simulator")
|
log.error("Can not start simulator")
|
||||||
QtWidgets.QMessageBox.critical(
|
QtWidgets.QMessageBox.critical(
|
||||||
self, self.tr("Can not start..."), self.tr(
|
self, self.tr("Can not start..."), self.tr(
|
||||||
"Can not start the simulator! Maybe the piCtory file is corrupt "
|
"Can not start the simulator! Maybe the piCtory file is corrupt "
|
||||||
|
|||||||
@@ -7,16 +7,18 @@ __license__ = "GPLv2"
|
|||||||
import gzip
|
import gzip
|
||||||
import os
|
import os
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
from logging import getLogger
|
||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from . import helper
|
from . import helper
|
||||||
from . import proginit as pi
|
|
||||||
from .backgroundworker import BackgroundWorker
|
from .backgroundworker import BackgroundWorker
|
||||||
from .helper import WidgetData
|
from .helper import WidgetData
|
||||||
from .ui.files_ui import Ui_win_files
|
from .ui.files_ui import Ui_win_files
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class NodeType(IntEnum):
|
class NodeType(IntEnum):
|
||||||
FILE = 1000
|
FILE = 1000
|
||||||
@@ -58,7 +60,7 @@ class UploadFiles(BackgroundWorker):
|
|||||||
default_value=False
|
default_value=False
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
self.ec = -2
|
self.ec = -2
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -99,10 +101,10 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
self.splitter.setSizes(list(map(int, helper.settings.value("files/splitter", [0, 0]))))
|
self.splitter.setSizes(list(map(int, helper.settings.value("files/splitter", [0, 0]))))
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
pi.logger.debug("RevPiFiles.__del__")
|
log.debug("RevPiFiles.__del__")
|
||||||
|
|
||||||
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
||||||
pi.logger.debug("RevPiFiles.closeEvent")
|
log.debug("RevPiFiles.closeEvent")
|
||||||
helper.settings.setValue("files/geo", self.saveGeometry())
|
helper.settings.setValue("files/geo", self.saveGeometry())
|
||||||
helper.settings.setValue("files/splitter", self.splitter.sizes())
|
helper.settings.setValue("files/splitter", self.splitter.sizes())
|
||||||
|
|
||||||
@@ -197,7 +199,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
def _select_children(self, top_item: QtWidgets.QTreeWidgetItem, value: bool):
|
def _select_children(self, top_item: QtWidgets.QTreeWidgetItem, value: bool):
|
||||||
"""Recursive select children from parent."""
|
"""Recursive select children from parent."""
|
||||||
pi.logger.debug("RevPiFiles._select_children")
|
log.debug("RevPiFiles._select_children")
|
||||||
|
|
||||||
for i in range(top_item.childCount()):
|
for i in range(top_item.childCount()):
|
||||||
item = top_item.child(i)
|
item = top_item.child(i)
|
||||||
@@ -213,7 +215,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
if item is None:
|
if item is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
pi.logger.debug("RevPiFiles.__itemSelectionChanged")
|
log.debug("RevPiFiles.__itemSelectionChanged")
|
||||||
|
|
||||||
# Block while preselect other entries
|
# Block while preselect other entries
|
||||||
tree_view.blockSignals(True)
|
tree_view.blockSignals(True)
|
||||||
@@ -296,7 +298,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
:param silent: Do not show message boxes
|
:param silent: Do not show message boxes
|
||||||
"""
|
"""
|
||||||
pi.logger.debug("RevPiFiles._load_files_local")
|
log.debug("RevPiFiles._load_files_local")
|
||||||
|
|
||||||
self.tree_files_counter = 0
|
self.tree_files_counter = 0
|
||||||
self.tree_files_local.blockSignals(True)
|
self.tree_files_local.blockSignals(True)
|
||||||
@@ -316,7 +318,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
def file_list_local(self):
|
def file_list_local(self):
|
||||||
"""Generate a file list with full path of selected entries."""
|
"""Generate a file list with full path of selected entries."""
|
||||||
pi.logger.debug("RevPiFiles.file_list_local")
|
log.debug("RevPiFiles.file_list_local")
|
||||||
lst = []
|
lst = []
|
||||||
for item in self.tree_files_local.selectedItems():
|
for item in self.tree_files_local.selectedItems():
|
||||||
if item.type() == NodeType.DIR:
|
if item.type() == NodeType.DIR:
|
||||||
@@ -337,7 +339,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
:param silent: Do not show message boxes
|
:param silent: Do not show message boxes
|
||||||
"""
|
"""
|
||||||
pi.logger.debug("RevPiFiles._load_files_revpi")
|
log.debug("RevPiFiles._load_files_revpi")
|
||||||
|
|
||||||
self.tree_files_revpi.blockSignals(True)
|
self.tree_files_revpi.blockSignals(True)
|
||||||
self.tree_files_revpi.clear()
|
self.tree_files_revpi.clear()
|
||||||
@@ -421,7 +423,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
def file_list_revpi(self):
|
def file_list_revpi(self):
|
||||||
"""Generate a file list with full path of selected entries."""
|
"""Generate a file list with full path of selected entries."""
|
||||||
pi.logger.debug("RevPiFiles.file_list_revpi")
|
log.debug("RevPiFiles.file_list_revpi")
|
||||||
lst = []
|
lst = []
|
||||||
for item in self.tree_files_revpi.selectedItems():
|
for item in self.tree_files_revpi.selectedItems():
|
||||||
if item.type() == NodeType.DIR:
|
if item.type() == NodeType.DIR:
|
||||||
@@ -435,13 +437,13 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_all_clicked(self):
|
def on_btn_all_clicked(self):
|
||||||
pi.logger.debug("RevPiFiles.on_btn_all_clicked")
|
log.debug("RevPiFiles.on_btn_all_clicked")
|
||||||
self._do_my_job(True)
|
self._do_my_job(True)
|
||||||
self.file_list_revpi()
|
self.file_list_revpi()
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_select_local_clicked(self):
|
def on_btn_select_local_clicked(self):
|
||||||
pi.logger.debug("RevPiFiles.on_btn_select_clicked")
|
log.debug("RevPiFiles.on_btn_select_clicked")
|
||||||
|
|
||||||
diag_folder = QtWidgets.QFileDialog(
|
diag_folder = QtWidgets.QFileDialog(
|
||||||
self, self.tr("Select folder..."),
|
self, self.tr("Select folder..."),
|
||||||
@@ -472,25 +474,25 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_refresh_local_clicked(self):
|
def on_btn_refresh_local_clicked(self):
|
||||||
pi.logger.debug("RevPiFiles.on_btn_refresh_clicked")
|
log.debug("RevPiFiles.on_btn_refresh_clicked")
|
||||||
self._load_files_local(False)
|
self._load_files_local(False)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_refresh_revpi_clicked(self):
|
def on_btn_refresh_revpi_clicked(self):
|
||||||
pi.logger.debug("RevPiFiles.on_btn_refresh_revpi_clicked")
|
log.debug("RevPiFiles.on_btn_refresh_revpi_clicked")
|
||||||
self._load_files_revpi(False)
|
self._load_files_revpi(False)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_to_right_clicked(self):
|
def on_btn_to_right_clicked(self):
|
||||||
"""Upload selected files to revolution pi."""
|
"""Upload selected files to revolution pi."""
|
||||||
pi.logger.debug("RevPiFiles.on_btn_to_right_clicked")
|
log.debug("RevPiFiles.on_btn_to_right_clicked")
|
||||||
self._do_my_job(False)
|
self._do_my_job(False)
|
||||||
self._load_files_revpi(True)
|
self._load_files_revpi(True)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_to_left_clicked(self):
|
def on_btn_to_left_clicked(self):
|
||||||
"""Download selected file."""
|
"""Download selected file."""
|
||||||
pi.logger.debug("RevPiFiles.on_btn_to_left_clicked")
|
log.debug("RevPiFiles.on_btn_to_left_clicked")
|
||||||
|
|
||||||
override = None
|
override = None
|
||||||
for item in self.tree_files_revpi.selectedItems():
|
for item in self.tree_files_revpi.selectedItems():
|
||||||
@@ -524,7 +526,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
override = rc_diag == QtWidgets.QMessageBox.Yes
|
override = rc_diag == QtWidgets.QMessageBox.Yes
|
||||||
|
|
||||||
if os.path.exists(file_name) and not override:
|
if os.path.exists(file_name) and not override:
|
||||||
pi.logger.debug("Skip existing file '{0}'".format(file_name))
|
log.debug("Skip existing file '{0}'".format(file_name))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
os.makedirs(os.path.dirname(file_name), exist_ok=True)
|
os.makedirs(os.path.dirname(file_name), exist_ok=True)
|
||||||
@@ -537,7 +539,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files):
|
|||||||
@QtCore.pyqtSlot()
|
@QtCore.pyqtSlot()
|
||||||
def on_btn_delete_revpi_clicked(self):
|
def on_btn_delete_revpi_clicked(self):
|
||||||
"""Remove selected files from working directory on revolution pi."""
|
"""Remove selected files from working directory on revolution pi."""
|
||||||
pi.logger.debug("RevPiFiles.btn_delete_revpi_clicked")
|
log.debug("RevPiFiles.btn_delete_revpi_clicked")
|
||||||
|
|
||||||
lst_delete = []
|
lst_delete = []
|
||||||
for item in self.tree_files_revpi.selectedItems():
|
for item in self.tree_files_revpi.selectedItems():
|
||||||
|
|||||||
@@ -5,13 +5,15 @@ __copyright__ = "Copyright (C) 2023 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from . import helper
|
from . import helper
|
||||||
from . import proginit as pi
|
|
||||||
from .ui.revpilogfile_ui import Ui_win_revpilogfile
|
from .ui.revpilogfile_ui import Ui_win_revpilogfile
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LogType(IntEnum):
|
class LogType(IntEnum):
|
||||||
NONE = 0
|
NONE = 0
|
||||||
@@ -60,7 +62,7 @@ class DataThread(QtCore.QThread):
|
|||||||
# The log file was rotated by log rotate on the Revolution Pi
|
# The log file was rotated by log rotate on the Revolution Pi
|
||||||
start_position = 0
|
start_position = 0
|
||||||
eof = False
|
eof = False
|
||||||
pi.logger.info("RevPi started a new log file.")
|
log.info("RevPi started a new log file.")
|
||||||
|
|
||||||
elif buff_log:
|
elif buff_log:
|
||||||
start_position += len(buff_log)
|
start_position += len(buff_log)
|
||||||
@@ -71,16 +73,16 @@ class DataThread(QtCore.QThread):
|
|||||||
|
|
||||||
def pause(self):
|
def pause(self):
|
||||||
"""Stop checking new log lines, but leave thread alive."""
|
"""Stop checking new log lines, but leave thread alive."""
|
||||||
pi.logger.debug("DataThread.pause")
|
log.debug("DataThread.pause")
|
||||||
self._paused = True
|
self._paused = True
|
||||||
|
|
||||||
def resume(self):
|
def resume(self):
|
||||||
"""Start checking for new log lines."""
|
"""Start checking for new log lines."""
|
||||||
pi.logger.debug("DataThread.resume")
|
log.debug("DataThread.resume")
|
||||||
self._paused = False
|
self._paused = False
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
pi.logger.debug("DataThread.run")
|
log.debug("DataThread.run")
|
||||||
|
|
||||||
while not self.isInterruptionRequested():
|
while not self.isInterruptionRequested():
|
||||||
eof_app = False
|
eof_app = False
|
||||||
@@ -191,7 +193,7 @@ class RevPiLogfile(QtWidgets.QMainWindow, Ui_win_revpilogfile):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot(LogType, bool, str)
|
@QtCore.pyqtSlot(LogType, bool, str)
|
||||||
def on_line_logged(self, log_type: LogType, success: bool, text: str):
|
def on_line_logged(self, log_type: LogType, success: bool, text: str):
|
||||||
pi.logger.debug("RevPiLogfile.on_line_logged")
|
log.debug("RevPiLogfile.on_line_logged")
|
||||||
|
|
||||||
if log_type == LogType.APP:
|
if log_type == LogType.APP:
|
||||||
textwidget = self.txt_app
|
textwidget = self.txt_app
|
||||||
|
|||||||
@@ -4,14 +4,17 @@ __author__ = "Sven Sager"
|
|||||||
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
__copyright__ = "Copyright (C) 2023 Sven Sager"
|
||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from . import helper
|
from . import helper
|
||||||
from . import proginit as pi
|
|
||||||
from .aclmanager import AclManager
|
from .aclmanager import AclManager
|
||||||
from .mqttmanager import MqttManager
|
from .mqttmanager import MqttManager
|
||||||
from .ui.revpioption_ui import Ui_diag_options
|
from .ui.revpioption_ui import Ui_diag_options
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class RevPiOption(QtWidgets.QDialog, Ui_diag_options):
|
class RevPiOption(QtWidgets.QDialog, Ui_diag_options):
|
||||||
"""Set options of RevPiPyLoad."""
|
"""Set options of RevPiPyLoad."""
|
||||||
@@ -110,7 +113,7 @@ class RevPiOption(QtWidgets.QDialog, Ui_diag_options):
|
|||||||
|
|
||||||
def _load_settings(self):
|
def _load_settings(self):
|
||||||
"""Load values to GUI widgets."""
|
"""Load values to GUI widgets."""
|
||||||
pi.logger.debug("RevPiOption._load_settings")
|
log.debug("RevPiOption._load_settings")
|
||||||
|
|
||||||
self.mrk_xml_ask = True
|
self.mrk_xml_ask = True
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2023 Sven Sager"
|
|||||||
__license__ = "GPLv2"
|
__license__ = "GPLv2"
|
||||||
|
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
import keyring
|
import keyring
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
@@ -15,6 +16,8 @@ from . import proginit as pi
|
|||||||
from .helper import RevPiSettings, WidgetData
|
from .helper import RevPiSettings, WidgetData
|
||||||
from .ui.revpiplclist_ui import Ui_diag_connections
|
from .ui.revpiplclist_ui import Ui_diag_connections
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class NodeType(IntEnum):
|
class NodeType(IntEnum):
|
||||||
CON = 1000
|
CON = 1000
|
||||||
@@ -58,7 +61,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
|
|
||||||
def _load_settings(self):
|
def _load_settings(self):
|
||||||
"""Load values to GUI widgets."""
|
"""Load values to GUI widgets."""
|
||||||
pi.logger.debug("RevPiPlcList._load_settings")
|
log.debug("RevPiPlcList._load_settings")
|
||||||
|
|
||||||
self.tre_connections.clear()
|
self.tre_connections.clear()
|
||||||
|
|
||||||
@@ -95,7 +98,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
self._edit_state()
|
self._edit_state()
|
||||||
|
|
||||||
def accept(self) -> None:
|
def accept(self) -> None:
|
||||||
pi.logger.debug("RevPiPlcList.accept")
|
log.debug("RevPiPlcList.accept")
|
||||||
|
|
||||||
for internal_id, ssh_user in self._keyring_cleanup_id_user:
|
for internal_id, ssh_user in self._keyring_cleanup_id_user:
|
||||||
service_name = "{0}.{1}_{2}".format(
|
service_name = "{0}.{1}_{2}".format(
|
||||||
@@ -107,7 +110,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
# Remove information from os keyring, which we collected on_btn_delete_clicked
|
# Remove information from os keyring, which we collected on_btn_delete_clicked
|
||||||
keyring.delete_password(service_name, ssh_user)
|
keyring.delete_password(service_name, ssh_user)
|
||||||
except KeyringError as e:
|
except KeyringError as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
|
|
||||||
helper.settings.remove("connections")
|
helper.settings.remove("connections")
|
||||||
|
|
||||||
@@ -127,7 +130,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
super().accept()
|
super().accept()
|
||||||
|
|
||||||
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
||||||
pi.logger.debug("RevPiPlcList.closeEvent")
|
log.debug("RevPiPlcList.closeEvent")
|
||||||
if self.changes:
|
if self.changes:
|
||||||
ask = QtWidgets.QMessageBox.question(
|
ask = QtWidgets.QMessageBox.question(
|
||||||
self, self.tr("Question"), self.tr(
|
self, self.tr("Question"), self.tr(
|
||||||
@@ -165,7 +168,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
|
|
||||||
def _edit_state(self):
|
def _edit_state(self):
|
||||||
"""Set enabled status of all controls, depending on selected item."""
|
"""Set enabled status of all controls, depending on selected item."""
|
||||||
pi.logger.debug("RevPiPlcList._edit_state")
|
log.debug("RevPiPlcList._edit_state")
|
||||||
|
|
||||||
item = self.tre_connections.currentItem()
|
item = self.tre_connections.currentItem()
|
||||||
if item is None:
|
if item is None:
|
||||||
@@ -409,7 +412,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot(str)
|
@QtCore.pyqtSlot(str)
|
||||||
def on_cbb_folder_currentIndexChanged(self, text: str):
|
def on_cbb_folder_currentIndexChanged(self, text: str):
|
||||||
pi.logger.debug("RevPiPlcList.on_cbb_folder_currentIndexChanged({0})".format(text))
|
log.debug("RevPiPlcList.on_cbb_folder_currentIndexChanged({0})".format(text))
|
||||||
|
|
||||||
if self.__current_item.type() == NodeType.CON:
|
if self.__current_item.type() == NodeType.CON:
|
||||||
new_dir_node = self._get_folder_item(text)
|
new_dir_node = self._get_folder_item(text)
|
||||||
@@ -443,7 +446,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
|
|||||||
|
|
||||||
@QtCore.pyqtSlot(str)
|
@QtCore.pyqtSlot(str)
|
||||||
def on_cbb_folder_editTextChanged(self, text: str):
|
def on_cbb_folder_editTextChanged(self, text: str):
|
||||||
pi.logger.debug("RevPiPlcList.on_cbb_folder_editTextChanged({0})".format(text))
|
log.debug("RevPiPlcList.on_cbb_folder_editTextChanged({0})".format(text))
|
||||||
|
|
||||||
if self.__current_item.type() == NodeType.DIR and self.__current_item.text(0) != text:
|
if self.__current_item.type() == NodeType.DIR and self.__current_item.text(0) != text:
|
||||||
# We just have to rename the dir node
|
# We just have to rename the dir node
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import gzip
|
|||||||
import os
|
import os
|
||||||
import tarfile
|
import tarfile
|
||||||
import zipfile
|
import zipfile
|
||||||
|
from logging import getLogger
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
from tempfile import mkdtemp
|
from tempfile import mkdtemp
|
||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
@@ -15,9 +16,10 @@ from xmlrpc.client import Binary
|
|||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from . import helper
|
from . import helper
|
||||||
from . import proginit as pi
|
|
||||||
from .ui.revpiprogram_ui import Ui_diag_program
|
from .ui.revpiprogram_ui import Ui_diag_program
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):
|
class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):
|
||||||
"""Program options of RevPiPyLoad."""
|
"""Program options of RevPiPyLoad."""
|
||||||
@@ -67,7 +69,7 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):
|
|||||||
|
|
||||||
def _load_settings(self, files_only=False):
|
def _load_settings(self, files_only=False):
|
||||||
"""Load values to GUI widgets."""
|
"""Load values to GUI widgets."""
|
||||||
pi.logger.debug("RevPiProgram._load_settings")
|
log.debug("RevPiProgram._load_settings")
|
||||||
|
|
||||||
if files_only:
|
if files_only:
|
||||||
mrk_program = self.cbb_plcprogram.currentText()
|
mrk_program = self.cbb_plcprogram.currentText()
|
||||||
@@ -88,7 +90,7 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):
|
|||||||
is_in_list = True
|
is_in_list = True
|
||||||
|
|
||||||
if not is_in_list:
|
if not is_in_list:
|
||||||
pi.logger.warning("File {0} is not in list".format(mrk_program or self.dc.get("plcprogram", "")))
|
log.warning("File {0} is not in list".format(mrk_program or self.dc.get("plcprogram", "")))
|
||||||
|
|
||||||
if files_only:
|
if files_only:
|
||||||
self.cbb_plcprogram.setCurrentText(mrk_program)
|
self.cbb_plcprogram.setCurrentText(mrk_program)
|
||||||
@@ -382,7 +384,7 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):
|
|||||||
fh.close()
|
fh.close()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pi.logger.error(e)
|
log.error(e)
|
||||||
QtWidgets.QMessageBox.critical(
|
QtWidgets.QMessageBox.critical(
|
||||||
self, self.tr("Error"), self.tr(
|
self, self.tr("Error"), self.tr(
|
||||||
"Coud not save the archive or extract the files!\n"
|
"Coud not save the archive or extract the files!\n"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from keyring.errors import KeyringError
|
|||||||
|
|
||||||
from .ui.sshauth_ui import Ui_diag_sshauth
|
from .ui.sshauth_ui import Ui_diag_sshauth
|
||||||
|
|
||||||
log = getLogger()
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SSHAuth(QtWidgets.QDialog, Ui_diag_sshauth):
|
class SSHAuth(QtWidgets.QDialog, Ui_diag_sshauth):
|
||||||
|
|||||||
Reference in New Issue
Block a user