|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog to show information about a connected board. |
|
8 """ |
|
9 |
|
10 import contextlib |
|
11 |
|
12 from PyQt6.QtCore import QLocale |
|
13 from PyQt6.QtWidgets import QDialog, QTreeWidgetItem |
|
14 |
|
15 from .Ui_BoardDataDialog import Ui_BoardDataDialog |
|
16 |
|
17 |
|
18 class BoardDataDialog(QDialog, Ui_BoardDataDialog): |
|
19 """ |
|
20 Class implementing a dialog to show information about a connected board. |
|
21 """ |
|
22 def __init__(self, data, parent=None): |
|
23 """ |
|
24 Constructor |
|
25 |
|
26 @param data dictionary containing the data to be shown |
|
27 @type dict |
|
28 @param parent reference to the parent widget (defaults to None) |
|
29 @type QWidget (optional) |
|
30 """ |
|
31 super().__init__(parent) |
|
32 self.setupUi(self) |
|
33 |
|
34 loc = QLocale() |
|
35 |
|
36 self.dataTree.setColumnCount(2) |
|
37 |
|
38 header = self.__createHeader(self.tr("General")) |
|
39 QTreeWidgetItem(header, [ |
|
40 self.tr("Board ID"), |
|
41 data["mc_id"] |
|
42 ]) |
|
43 QTreeWidgetItem(header, [ |
|
44 self.tr("Board Frequency"), |
|
45 self.tr("{0} MHz").format( |
|
46 loc.toString(data["mc_frequency_mhz"], "f", 0)) |
|
47 ]) |
|
48 with contextlib.suppress(KeyError): |
|
49 QTreeWidgetItem(header, [ |
|
50 self.tr("Board Temperature"), |
|
51 self.tr("{0} °C").format( |
|
52 loc.toString(data["mc_temp_c"], "f", 1)) |
|
53 ]) |
|
54 |
|
55 header = self.__createHeader(self.tr("Python")) |
|
56 QTreeWidgetItem(header, [ |
|
57 self.tr("Python Version"), |
|
58 data["py_version"] |
|
59 ]) |
|
60 QTreeWidgetItem(header, [ |
|
61 self.tr("Platform"), |
|
62 data["py_platform"] |
|
63 ]) |
|
64 if data["mpy_name"] == "micropython": |
|
65 mpyName = "MicroPython" |
|
66 elif data["mpy_name"] == "circuitpython": |
|
67 mpyName = "CircuitPython" |
|
68 elif data["mpy_name"] == "unknown": |
|
69 mpyName = self.tr("unknown") |
|
70 else: |
|
71 mpyName = data["name"] |
|
72 QTreeWidgetItem(header, [ |
|
73 self.tr("Implementation"), |
|
74 self.tr("{0} V. {1}").format( |
|
75 mpyName, |
|
76 self.tr("unknown") |
|
77 if data["mpy_version"] == "unknown" else |
|
78 data["mpy_version"] |
|
79 ) |
|
80 ]) |
|
81 |
|
82 header = self.__createHeader(self.tr("System")) |
|
83 QTreeWidgetItem(header, [ |
|
84 self.tr("System Name"), |
|
85 data["sysname"] |
|
86 ]) |
|
87 QTreeWidgetItem(header, [ |
|
88 self.tr("Node Name"), |
|
89 data["nodename"] |
|
90 ]) |
|
91 QTreeWidgetItem(header, [ |
|
92 self.tr("Release"), |
|
93 data["release"] |
|
94 ]) |
|
95 QTreeWidgetItem(header, [ |
|
96 self.tr("Version"), |
|
97 data["version"] |
|
98 ]) |
|
99 QTreeWidgetItem(header, [ |
|
100 self.tr("Machine"), |
|
101 data["machine"] |
|
102 ]) |
|
103 |
|
104 header = self.__createHeader(self.tr("Memory")) |
|
105 QTreeWidgetItem(header, [ |
|
106 self.tr("total"), |
|
107 self.tr("{0} KBytes").format( |
|
108 loc.toString(data["mem_total_kb"], "f", 2)) |
|
109 ]) |
|
110 QTreeWidgetItem(header, [ |
|
111 self.tr("used"), |
|
112 self.tr("{0} KBytes ({1}%)").format( |
|
113 loc.toString(data["mem_used_kb"], "f", 2), |
|
114 loc.toString(data["mem_used_pc"], "f", 2)) |
|
115 ]) |
|
116 QTreeWidgetItem(header, [ |
|
117 self.tr("free"), |
|
118 self.tr("{0} KBytes ({1}%)").format( |
|
119 loc.toString(data["mem_free_kb"], "f", 2), |
|
120 loc.toString(data["mem_free_pc"], "f", 2)) |
|
121 ]) |
|
122 |
|
123 header = self.__createHeader(self.tr("Flash Memory")) |
|
124 QTreeWidgetItem(header, [ |
|
125 self.tr("total"), |
|
126 self.tr("{0} KBytes").format( |
|
127 loc.toString(data["flash_total_kb"], "f", 0)) |
|
128 ]) |
|
129 QTreeWidgetItem(header, [ |
|
130 self.tr("used"), |
|
131 self.tr("{0} KBytes ({1}%)").format( |
|
132 loc.toString(data["flash_used_kb"], "f", 0), |
|
133 loc.toString(data["flash_used_pc"], "f", 2)) |
|
134 ]) |
|
135 QTreeWidgetItem(header, [ |
|
136 self.tr("free"), |
|
137 self.tr("{0} KBytes ({1}%)").format( |
|
138 loc.toString(data["flash_free_kb"], "f", 0), |
|
139 loc.toString(data["flash_free_pc"], "f", 2)) |
|
140 ]) |
|
141 |
|
142 header = self.__createHeader(self.tr("µLab")) |
|
143 if data["ulab"] is not None: |
|
144 QTreeWidgetItem(header, [ |
|
145 self.tr("Version"), |
|
146 data["ulab"] |
|
147 ]) |
|
148 else: |
|
149 itm = QTreeWidgetItem(header, [ |
|
150 self.tr("µLab is not available") |
|
151 ]) |
|
152 itm.setFirstColumnSpanned(True) |
|
153 |
|
154 for col in range(self.dataTree.columnCount()): |
|
155 self.dataTree.resizeColumnToContents(col) |
|
156 |
|
157 def __createHeader(self, headerText): |
|
158 """ |
|
159 Private method to create a header item. |
|
160 |
|
161 @param headerText text for the header item |
|
162 @type str |
|
163 @return reference to the created header item |
|
164 @rtype QTreeWidgetItem |
|
165 """ |
|
166 headerItem = QTreeWidgetItem(self.dataTree, [headerText]) |
|
167 headerItem.setExpanded(True) |
|
168 headerItem.setFirstColumnSpanned(True) |
|
169 |
|
170 font = headerItem.font(0) |
|
171 font.setBold(True) |
|
172 |
|
173 headerItem.setFont(0, font) |
|
174 |
|
175 return headerItem |