Fixed an issue in the MicroPython UF2 Flash dialog causing the wrong instructions being show in certain situations.
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3
|
# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing a dialog to scan for Bluetooth devices. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
from PyQt6.QtCore import Qt, pyqtSlot |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
from PyQt6.QtWidgets import QHeaderView, QTreeWidgetItem, QWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from eric7.EricGui.EricOverrideCursor import EricOverrideCursor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
from eric7.EricWidgets import EricMessageBox |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
from .Ui_BluetoothScanWindow import Ui_BluetoothScanWindow |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
class BluetoothScanWindow(QWidget, Ui_BluetoothScanWindow): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
Class implementing a dialog to scan for Bluetooth devices. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
def __init__(self, device, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
@param device reference to the connected device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
@type BaseDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
@param parent reference to the parent widget (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
@type QWidget (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
super().__init__(parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
self.setupUi(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
windowFlags = self.windowFlags() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
windowFlags |= Qt.WindowType.Window |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
windowFlags |= Qt.WindowType.WindowContextHelpButtonHint |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
self.setWindowFlags(windowFlags) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
self.__device = device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
self.devicesList.setColumnCount(4) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
self.devicesList.headerItem().setText(3, "") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
self.scanButton.clicked.connect(self.scanDevices) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
self.devicesList.sortByColumn(0, Qt.SortOrder.AscendingOrder) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
def scanDevices(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
Public slot to ask the device for a Bluetooth scan and display the result. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
self.devicesList.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
self.statusLabel.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
self.scanButton.setEnabled(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
with EricOverrideCursor(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
scanResults, error = self.__device.getDeviceScan( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
timeout=self.durationSpinBox.value() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
self.scanButton.setEnabled(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
if error: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
EricMessageBox.warning( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
self, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
self.tr("Bluetooth Scan"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
"""<p>The scan for available devices failed.</p>""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
"""<p>Reason: {0}</p>""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
).format(error), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
else: |
9859
|
76
|
self.statusLabel.setText( |
|
77
|
self.tr("<p>Detected <b>%n</b> device(s).</p>", "", len(scanResults)) |
|
78
|
) |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
for res in scanResults.values(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
name = res.name |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
if not name: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
name = self.tr("N/A") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
itm = QTreeWidgetItem( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
self.devicesList, [name, res.address, str(res.rssi)] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
|
10090
|
89
|
for serviceID, serviceName, isComplete in res.services: |
|
90
|
if len(serviceID) == 6: |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
bits = 16 |
10090
|
92
|
elif len(serviceID) == 10: |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
bits = 32 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
bits = 128 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
template = ( |
10090
|
97
|
self.tr("Complete {0}-bit Service UUID: {1}{2}") |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
if isComplete |
10090
|
99
|
else self.tr("Incomplete {0}-bit Service UUID: {1}{2}") |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
) |
10090
|
101
|
citm = QTreeWidgetItem( |
|
102
|
itm, |
|
103
|
[ |
|
104
|
template.format( |
|
105
|
bits, |
|
106
|
serviceID, |
|
107
|
self.tr(" - {0}").format(serviceName) |
|
108
|
if serviceName |
|
109
|
else "", |
|
110
|
) |
|
111
|
], |
|
112
|
) |
9859
|
113
|
citm.setFirstColumnSpanned(True) |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
|
9859
|
115
|
seenMIds = [] |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
for mid, _, mname in res.manufacturer(withName=True): |
9859
|
117
|
if mid not in seenMIds: |
|
118
|
citm = QTreeWidgetItem( |
|
119
|
itm, |
|
120
|
[ |
10090
|
121
|
self.tr("Manufacturer ID: 0x{0:x} - {1}").format( |
9859
|
122
|
mid, mname |
|
123
|
) |
|
124
|
if bool(mname) |
|
125
|
else self.tr("Manufacturer ID: 0x{0:x}").format(mid) |
|
126
|
], |
|
127
|
) |
|
128
|
citm.setFirstColumnSpanned(True) |
|
129
|
seenMIds.append(mid) |
|
130
|
|
|
131
|
txPower = res.txPower |
|
132
|
if txPower: |
|
133
|
citm = QTreeWidgetItem( |
|
134
|
itm, [self.tr("Tx Power Level [dBm]: {0}").format(txPower)] |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
) |
9859
|
136
|
citm.setFirstColumnSpanned(True) |
9857
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
self.__resizeColumns() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
self.__resort() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
def __resort(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
Private method to resort the devices list. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
self.devicesList.sortItems( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
self.devicesList.sortColumn(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
self.devicesList.header().sortIndicatorOrder(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
def __resizeColumns(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
Private method to resize the columns of the result list. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
self.devicesList.header().resizeSections( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
QHeaderView.ResizeMode.ResizeToContents |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
self.devicesList.header().setStretchLastSection(True) |