src/eric7/MicroPython/BluetoothDialogs/BluetoothScanWindow.py

Wed, 08 Mar 2023 17:40:14 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 08 Mar 2023 17:40:14 +0100
branch
mpy_network
changeset 9858
6518c336fcd3
parent 9857
0122ae72618d
child 9859
829c1edbf253
permissions
-rw-r--r--

Fixed some bugs in MicroPython Bluetooth support.

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:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 for res in scanResults.values():
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 name = res.name
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 if not name:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 name = self.tr("N/A")
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 itm = QTreeWidgetItem(
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 self.devicesList, [name, res.address, str(res.rssi)]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 )
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 for service, isComplete in res.services:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 if len(service) == 6:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 bits = 16
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 elif len(service) == 10:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 bits = 32
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 else:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 bits = 128
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 template = (
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 self.tr("Complete {0}-bit Service UUID: {1}")
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 if isComplete
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 else self.tr("Incomplete {0}-bit Service UUID: {1}")
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 )
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 sitm = QTreeWidgetItem(itm, [template.format(bits, service)])
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 sitm.setFirstColumnSpanned(True)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 for mid, _, mname in res.manufacturer(withName=True):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 mitm = QTreeWidgetItem(
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 itm,
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 [
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 self.tr("Manufacturer ID: 0x{0:x} ({1})").format(mid, mname)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 if bool(mname)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 else self.tr("Manufacturer ID: 0x{0:x}").format(mid)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 ],
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 )
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 mitm.setFirstColumnSpanned(True)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 self.__resizeColumns()
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 self.__resort()
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 def __resort(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 Private method to resort the devices list.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 self.devicesList.sortItems(
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 self.devicesList.sortColumn(),
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 self.devicesList.header().sortIndicatorOrder(),
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 )
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 def __resizeColumns(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 Private method to resize the columns of the result list.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 self.devicesList.header().resizeSections(
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 QHeaderView.ResizeMode.ResizeToContents
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 )
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 self.devicesList.header().setStretchLastSection(True)

eric ide

mercurial