Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
__pycache__/*
.vscode/*
.qt_for_python/*
.clinerules
profiles.json*
/.venv
117 changes: 69 additions & 48 deletions errors.py → about_ui.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
from base_ui import WidgetUI
from PyQt6.QtWidgets import QDialog, QTableWidgetItem, QHeaderView
from PyQt6.QtWidgets import (
QMessageBox,
QVBoxLayout,
QCheckBox,
QButtonGroup,
QPushButton,
QLabel,
QSpinBox,
QComboBox,
)
import PyQt6.QtWidgets
from PyQt6 import uic
from PyQt6.QtCore import QAbstractTableModel, Qt, QModelIndex
from base_ui import CommunicationHandler

import base_ui
import helper
import activelist
import activetasks

class ErrorsModel(QAbstractTableModel):
def __init__(self, parent):
Expand Down Expand Up @@ -69,41 +61,74 @@ def setErrors(self, errors):
self.errors = errors
self.endResetModel()

class AboutUI(base_ui.WidgetUI, base_ui.CommunicationHandler):
"""
About page widget
"""

def __init__(self, main_ui, version_str, fw_version_str):
base_ui.WidgetUI.__init__(self, main_ui, "about_page.ui")
base_ui.CommunicationHandler.__init__(self)
self.main = main_ui

verstr = "Version: " + version_str
if fw_version_str:
verstr += " / Firmware: " + fw_version_str
self.version.setText(verstr)

try:
with open("LICENSE", "r") as f:
self.textBrowser_license.setText(f.read())
except FileNotFoundError:
self.textBrowser_license.setText("LICENSE file not found.")

# Setup logging for all apps to get event here
self.logger.register_to_logger(self.append_log)

class ErrorsDialog(QDialog):
def __init__(self, main=None):
QDialog.__init__(self, main)
self.main = main
self.ui = ErrorsUI(main, self)
self.layout = QVBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.ui)
self.setLayout(self.layout)
self.setWindowTitle("Errors")

def registerCallbacks(self):
self.ui.registerCallbacks()

def connected_cb(self,connected):
if connected:
self.ui.clear_stored_errors()

class ErrorsUI(WidgetUI, CommunicationHandler):
def __init__(self, main=None, parent=None):
WidgetUI.__init__(self, parent, "errors.ui")
CommunicationHandler.__init__(self)
self.main = main
self.parent = parent

# Setup logic for Errors tab
self.pushButton_refresh.clicked.connect(self.readErrors)
self.pushButton_clearErrors.clicked.connect(self.clear_errors)
self.pushButton_clearLogs.clicked.connect(self.clear_logs)
self.errors = ErrorsModel(self.tableView)
self.tableView.setModel(self.errors)
header = self.tableView.horizontalHeader()
header.setStretchLastSection(True)
self.registerCallbacks()
self.logger.register_to_logger(self.append_log)

# Setup Modules tab
self.active_class_ui = activelist.ActiveClassUI(self)
self.active_task_ui = activetasks.ActiveTaskUI(self)

# Push content in groupBox_features
layout = self.groupBox_features.layout()
for i in reversed(range(layout.count())):
widgetToRemove = layout.itemAt(i).widget()
layout.removeWidget(widgetToRemove)
widgetToRemove.setParent(None)
layout.addWidget(self.active_class_ui)

# Replace content in groupBox_thread
layout = self.groupBox_thread.layout()
for i in reversed(range(layout.count())):
widgetToRemove = layout.itemAt(i).widget()
layout.removeWidget(widgetToRemove)
widgetToRemove.setParent(None)
layout.addWidget(self.active_task_ui)

def showEvent(self, a0):
self.tableView.resizeColumnsToContents()

def set_connected(self, connected):
self.tab_log.setEnabled(connected)
self.tab_module.setEnabled(connected)
self.active_task_ui.connect(connected)
if connected:
self.registerCallbacks()
else:
# remove the handler on disconnect
self.remove_callbacks()


def append_log(self, message):
"""Display the log message."""
self.logBox_1.append(message)
Expand All @@ -125,17 +150,13 @@ def clear_logs(self):
def registerCallbacks(self):
self.register_callback("sys", "errors", self.errorCallback, 0, typechar="?")

def showEvent(self, a0):
self.tableView.resizeColumnsToContents()
# self.readErrors()

def readErrors(self):
if self.isEnabled:
if self.isEnabled():
self.send_command("sys", "errors", 0)

def errorCallback(self, errorstring):
if errorstring != "None":
self.parent.show()
if errorstring != "None" and not self.main.isVisible():
self.main.show()
errors = []
for errorline in errorstring.split("\n"):
e = errorline.split(":", 2)
Expand All @@ -144,4 +165,4 @@ def errorCallback(self, errorstring):
error = {"code": e[0], "level": e[1], "info": e[2]}
errors.append(error)
self.errors.setErrors(errors)
self.tableView.resizeColumnsToContents()
self.tableView.resizeColumnsToContents()
13 changes: 1 addition & 12 deletions activelist.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,6 @@ def setItems(self,items):
self.items = items
self.endResetModel()

class ActiveClassDialog(PyQt6.QtWidgets.QDialog):
def __init__(self, parent = None):
PyQt6.QtWidgets.QDialog.__init__(self, parent)
self.active_class_ui = ActiveClassUI(parent)
self.layout = PyQt6.QtWidgets.QVBoxLayout()
self.layout.setContentsMargins(0,0,0,0)
self.layout.addWidget(self.active_class_ui)
self.setLayout(self.layout)
self.setWindowTitle("Active modules")

class ActiveClassUI(WidgetUI, CommunicationHandler):
def __init__(self, parent = None):
WidgetUI.__init__(self, parent, 'activelist.ui')
Expand All @@ -84,7 +74,7 @@ def __init__(self, parent = None):
self.tableView.setModel(self.items)
header = self.tableView.horizontalHeader()
header.setSectionResizeMode(0,PyQt6.QtWidgets.QHeaderView.ResizeMode.Stretch) # Stretch first section

def showEvent(self, a0):
self.tableView.resizeColumnsToContents()
self.read()
Expand All @@ -93,7 +83,6 @@ def read(self):
self.get_value_async("sys","lsactive",self.updateCb)

def updateCb(self,string):
self.parent.show()
items = []
for line in string.split("\n"):
e = line.split(":")
Expand Down
62 changes: 37 additions & 25 deletions activetasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,22 +66,6 @@ def setItems(self,items):
self.items = items
self.endResetModel()

class ActiveTaskDialog(PyQt6.QtWidgets.QDialog):
def __init__(self, parent = None):
PyQt6.QtWidgets.QDialog.__init__(self, parent)
self.active_class_ui = ActiveTaskUI(parent)
self.layout = PyQt6.QtWidgets.QVBoxLayout()
self.layout.setContentsMargins(0,0,0,0)
self.layout.addWidget(self.active_class_ui)
self.setLayout(self.layout)
self.setWindowTitle("Active threads")

def set_taskstats_enabled(self,enabled):
self.active_class_ui.taskstats_enabled = enabled

def set_tasklist_enabled(self,enabled):
self.active_class_ui.tasklist_enabled = enabled

class ActiveTaskUI(WidgetUI, CommunicationHandler):
def __init__(self, parent = None):
WidgetUI.__init__(self, parent, 'activelist.ui')
Expand All @@ -96,27 +80,58 @@ def __init__(self, parent = None):
header = self.tableView.horizontalHeader()
header.setSectionResizeMode(0,PyQt6.QtWidgets.QHeaderView.ResizeMode.Stretch) # Stretch first section
self.tableView.setSortingEnabled(True)
self.timer = QTimer(self)
self.timer.timeout.connect(self.read)

self.isConnected = False

self.items_list = []
self.items_stats = []

self.taskstats_enabled = False
self.tasklist_enabled = False


self.timer = QTimer(self)
self.timer.timeout.connect(self.timer_cb)

def connect(self, is_connected):
self.isConnected = is_connected
if is_connected:
self.check_taskstats()
if self.isVisible():
self.timer.start(1000)
else:
self.timer.stop()

def showEvent(self, a0):
self.tableView.resizeColumnsToContents()
self.read()
self.timer.start(1000)
return super().showEvent(a0)
if self.isConnected:
self.timer.start(1000)

def hideEvent(self, a0: QHideEvent) -> None:
self.timer.stop()
return super().hideEvent(a0)

def timer_cb(self):
if self.isConnected:
self.read()

def set_taskstats_enabled(self, enabled):
self.taskstats_enabled = enabled

def set_tasklist_enabled(self, enabled):
self.tasklist_enabled = enabled

def check_taskstats(self):
# Check if the taskstats and tasklist command are available
self.get_value_async("sys", "cmdinfo", adr=18, conversion=int, callback=lambda x: self.set_taskstats_enabled(x==1))
# Vérifier tasklist
self.get_value_async("sys", "cmdinfo", adr=25, conversion=int, callback=lambda x: self.set_tasklist_enabled(x==1))


def read(self):
# Don't refresh if connection is down
if not self.isConnected:
return

self.items_stats.clear()
self.items_list.clear()
if self.taskstats_enabled:
Expand All @@ -138,8 +153,6 @@ def updateItems(self):
items.setdefault(item["name"], {})
items[item["name"]].update(item)
self.items.setItems(list(items.values()))
self.parent.show()


def updateStatsCb(self,string):
for line in string.split("\n"):
Expand All @@ -163,4 +176,3 @@ def updateListCb(self,string):
self.items_list.append(item)

self.updateItems()

Loading
Loading