src/eric7/MicroPython/BluetoothDialogs/BluetoothScanWindow.py

Sat, 02 Dec 2023 12:19:16 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 02 Dec 2023 12:19:16 +0100
branch
eric7
changeset 10370
d84b074f772c
parent 10090
8be7dd9460c5
child 10439
21c28b0f9e41
permissions
-rw-r--r--

Fixed an issue in the MicroPython UF2 Flash dialog causing the wrong instructions being show in certain situations.

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

eric ide

mercurial