Added the Adafruit Feather nRF52840 to the list of known NRF52 boards and changed the list of known CircuitPython boards to be more explicit with respect to Adafruit boards (i.e. VID 0x239A).
11167
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) 2025 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 the device interface class for NRF52 boards with UF2 support. |
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
|
import ast |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
import json |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from PyQt6.QtCore import QUrl, pyqtSlot |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
from PyQt6.QtWidgets import QMenu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
from eric7 import EricUtilities, Preferences |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
from eric7.EricWidgets import EricMessageBox |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
from eric7.EricWidgets.EricApplication import ericApp |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
from ..MicroPythonWidget import HAS_QTCHART |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
from . import FirmwareGithubUrls |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
from .DeviceBase import BaseDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
class Nrf52Device(BaseDevice): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
Class implementing the device for NRF52 boards with UF2 support. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
def __init__(self, microPythonWidget, deviceType, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
@param microPythonWidget reference to the main MicroPython widget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
@type MicroPythonWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
@param deviceType device type assigned to this device interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
@param parent reference to the parent object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
@type QObject |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
super().__init__(microPythonWidget, deviceType, parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
self.__createNrfMenu() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
def setButtons(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
Public method to enable the supported action buttons. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
super().setButtons() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
self.microPython.setActionButtons( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
run=True, repl=True, files=True, chart=HAS_QTCHART |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
def forceInterrupt(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
Public method to determine the need for an interrupt when opening the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
serial connection. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
@return flag indicating an interrupt is needed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
def deviceName(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
Public method to get the name of the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
@return name of the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
return self.tr("NRF52 with UF2") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
def canStartRepl(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
Public method to determine, if a REPL can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
@return tuple containing a flag indicating it is safe to start a REPL |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
def canStartPlotter(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
Public method to determine, if a Plotter can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
Plotter and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
def canRunScript(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
Public method to determine, if a script can be executed. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
Plotter and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
def runScript(self, script): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
Public method to run the given Python script. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
@param script script to be executed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
pythonScript = script.split("\n") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
self.sendCommands(pythonScript) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
def canStartFileManager(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
Public method to determine, if a File Manager can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
File Manager and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
def __createNrfMenu(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
Private method to create the NRF52 submenu. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
self.__nrfMenu = QMenu(self.tr("NRF52 Functions")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
self.__showMpyAct = self.__nrfMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
self.tr("Show MicroPython Versions"), self.__showFirmwareVersions |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
self.__nrfMenu.addSeparator() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
self.__bootloaderAct = self.__nrfMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
self.tr("Activate Bootloader"), self.__activateBootloader |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
self.__flashMpyAct = self.__nrfMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
self.tr("Flash MicroPython Firmware"), self.__flashPython |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
self.__nrfMenu.addSeparator() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
self.__resetAct = self.__nrfMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
self.tr("Reset Device"), self.__resetDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
def addDeviceMenuEntries(self, menu): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
Public method to add device specific entries to the given menu. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
@param menu reference to the context menu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
@type QMenu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
connected = self.microPython.isConnected() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
linkConnected = self.microPython.isLinkConnected() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
self.__showMpyAct.setEnabled(connected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
self.__bootloaderAct.setEnabled(connected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
self.__flashMpyAct.setEnabled(not linkConnected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
self.__resetAct.setEnabled(connected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
menu.addMenu(self.__nrfMenu) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
def hasFlashMenuEntry(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
Public method to check, if the device has its own flash menu entry. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
@return flag indicating a specific flash menu entry |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
def __flashPython(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
Private slot to flash a MicroPython firmware to the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
from ..UF2FlashDialog import UF2FlashDialog |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
dlg = UF2FlashDialog(boardType="nrf52", parent=self.microPython) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
dlg.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
def __activateBootloader(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
Private slot to switch the board into 'bootloader' mode. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
if self.microPython.isConnected(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
self.executeCommands( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
[ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
"import machine", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
"machine.bootloader()", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
], |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
mode=self._submitMode, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
# simulate pressing the disconnect button |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
self.microPython.on_connectButton_clicked() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
def __showFirmwareVersions(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
Private slot to show the firmware version of the connected device and the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
available firmware version. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
if self.microPython.isConnected(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
if self._deviceData["mpy_name"] != "micropython": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
self.microPython, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
self.tr("Show MicroPython Versions"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
"""The firmware of the connected device cannot be""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
""" determined or the board does not run MicroPython.""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
""" Aborting...""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
if self._deviceData["mpy_variant"] == "Pimoroni Pico": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
# MicroPython with Pimoroni add-on libraries |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
url = QUrl(FirmwareGithubUrls["pimoroni_pico"]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
url = QUrl(FirmwareGithubUrls["micropython"]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
ui = ericApp().getObject("UserInterface") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
request = QNetworkRequest(url) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
reply = ui.networkAccessManager().head(request) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
reply.finished.connect(lambda: self.__firmwareVersionResponse(reply)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
@pyqtSlot(QNetworkReply) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
def __firmwareVersionResponse(self, reply): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
Private slot handling the response of the latest version request. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
@param reply reference to the reply object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
@type QNetworkReply |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
latestUrl = reply.url().toString() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
tag = latestUrl.rsplit("/", 1)[-1] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
while tag and not tag[0].isdecimal(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
# get rid of leading non-decimal characters |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
tag = tag[1:] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
latestVersion = EricUtilities.versionToTuple(tag) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241
|
if self._deviceData["mpy_version"] == "unknown": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242
|
currentVersionStr = self.tr("unknown") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243
|
currentVersion = (0, 0, 0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245
|
currentVersionStr = ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246
|
self._deviceData["mpy_variant_version"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247
|
if bool(self._deviceData["mpy_variant_version"]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248
|
else self._deviceData["mpy_version"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250
|
currentVersion = EricUtilities.versionToTuple(currentVersionStr) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252
|
msg = self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253
|
"<h4>MicroPython Version Information</h4>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254
|
"<table>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255
|
"<tr><td>Installed:</td><td>{0}</td></tr>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256
|
"<tr><td>Available:</td><td>{1}</td></tr>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257
|
"{2}" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258
|
"</table>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259
|
).format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260
|
currentVersionStr, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261
|
tag, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262
|
( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263
|
self.tr("<tr><td>Variant:</td><td>{0}</td></tr>").format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264
|
self._deviceData["mpy_variant"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266
|
if self._deviceData["mpy_variant"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267
|
else "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270
|
if self._deviceData["mpy_variant"] in ["Pimoroni Pico"] and not bool( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271
|
self._deviceData["mpy_variant_version"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272
|
): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273
|
# cannot derive update info |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274
|
msg += self.tr("<p>Update may be available.</p>") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275
|
elif currentVersion < latestVersion: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276
|
msg += self.tr("<p><b>Update available!</b></p>") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
277
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278
|
EricMessageBox.information( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
279
|
self.microPython, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
280
|
self.tr("MicroPython Version"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
281
|
msg, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
282
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285
|
def __resetDevice(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
287
|
Private slot to reset the connected device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
288
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289
|
if self.microPython.isConnected(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
290
|
self.executeCommands( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
291
|
"import machine\nmachine.reset()\n", mode=self._submitMode |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
292
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
293
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
294
|
def getDocumentationUrl(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
295
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
296
|
Public method to get the device documentation URL. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
298
|
@return documentation URL of the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
301
|
return Preferences.getMicroPython("MicroPythonDocuUrl") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
302
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
303
|
def getDownloadMenuEntries(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
304
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
305
|
Public method to retrieve the entries for the downloads menu. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
306
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
307
|
@return list of tuples with menu text and URL to be opened for each |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
308
|
entry |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
309
|
@rtype list of tuple of (str, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
310
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
311
|
return [ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
312
|
( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
313
|
self.tr("MicroPython Firmware"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
314
|
Preferences.getMicroPython("MicroPythonFirmwareUrl"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
315
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
316
|
("<separator>", ""), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
317
|
( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
318
|
self.tr("CircuitPython Firmware"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
319
|
Preferences.getMicroPython("CircuitPythonFirmwareUrl"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
320
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
321
|
( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
322
|
self.tr("CircuitPython Libraries"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
323
|
Preferences.getMicroPython("CircuitPythonLibrariesUrl"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
324
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
325
|
] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
326
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
327
|
################################################################## |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
328
|
## Methods below implement Bluetooth related methods |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
329
|
################################################################## |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
330
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
331
|
def hasBluetooth(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
332
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
333
|
Public method to check the availability of Bluetooth. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
334
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
335
|
@return flag indicating the availability of Bluetooth |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
336
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
337
|
@exception OSError raised to indicate an issue with the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
338
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
339
|
command = """ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
340
|
def has_bt(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
341
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
342
|
import ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
343
|
if ble.address(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
344
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
345
|
except (ImportError, OSError): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
346
|
pass |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
347
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
348
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
349
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
350
|
print(has_bt()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
351
|
del has_bt |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
352
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
353
|
out, err = self.executeCommands(command, mode=self._submitMode, timeout=10000) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
354
|
if err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
355
|
raise OSError(self._shortError(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
356
|
return out.strip() == b"True" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
357
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
358
|
def getBluetoothStatus(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
359
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
360
|
Public method to get Bluetooth status data of the connected board. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
361
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
362
|
@return list of tuples containing the translated status data label and |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
363
|
the associated value |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
364
|
@rtype list of tuples of (str, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
365
|
@exception OSError raised to indicate an issue with the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
366
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
367
|
command = """ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
368
|
def ble_status(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
369
|
import ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
370
|
import json |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
371
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
372
|
res = { |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
373
|
'active': bool(ble.enabled()), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
374
|
'mac': ble.address(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
375
|
} |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
376
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
377
|
print(json.dumps(res)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
378
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
379
|
ble_status() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
380
|
del ble_status |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
381
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
382
|
out, err = self.executeCommands(command, mode=self._submitMode) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
383
|
if err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
384
|
raise OSError(self._shortError(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
385
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
386
|
bleStatus = json.loads(out.decode("utf-8")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
387
|
status = [ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
388
|
(self.tr("Active"), self.bool2str(bleStatus["active"])), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
389
|
(self.tr("MAC-Address"), bleStatus["mac"]), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
390
|
] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
391
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
392
|
return status |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
393
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
394
|
def activateBluetoothInterface(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
395
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
396
|
Public method to activate the Bluetooth interface. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
397
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
398
|
@return flag indicating the new state of the Bluetooth interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
399
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
400
|
@exception OSError raised to indicate an issue with the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
401
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
402
|
command = """ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
403
|
def activate_ble(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
404
|
import ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
405
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
406
|
if not ble.enabled(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
407
|
ble.enable() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
408
|
print(bool(ble.enabled())) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
409
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
410
|
activate_ble() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
411
|
del activate_ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
412
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
413
|
out, err = self.executeCommands(command, mode=self._submitMode) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
414
|
if err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
415
|
raise OSError(self._shortError(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
416
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
417
|
return out.strip() == b"True" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
418
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
419
|
def deactivateBluetoothInterface(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
420
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
421
|
Public method to deactivate the Bluetooth interface. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
422
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
423
|
@return flag indicating the new state of the Bluetooth interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
424
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
425
|
@exception OSError raised to indicate an issue with the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
426
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
427
|
command = """ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
428
|
def deactivate_ble(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
429
|
import ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
430
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
431
|
if ble.enabled(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
432
|
ble.disable() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
433
|
print(bool(ble.enabled())) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
434
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
435
|
deactivate_ble() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
436
|
del deactivate_ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
437
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
438
|
out, err = self.executeCommands(command, mode=self._submitMode) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
439
|
if err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
440
|
raise OSError(self._shortError(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
441
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
442
|
return out.strip() == b"True" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
443
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
444
|
def getDeviceScan(self, timeout=10): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
445
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
446
|
Public method to perform a Bluetooth device scan. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
447
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
448
|
@param timeout duration of the device scan in seconds (defaults |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
449
|
to 10) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
450
|
@type int (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
451
|
@return tuple containing a dictionary with the scan results and |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
452
|
an error string |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
453
|
@rtype tuple of (dict, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
454
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
455
|
from ..BluetoothDialogs.BluetoothAdvertisement import ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
456
|
SCAN_RSP, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
457
|
BluetoothAdvertisement, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
458
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
459
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
460
|
command = """ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
461
|
def ble_scan(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
462
|
import ble |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
463
|
import ubluepy as ub |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
464
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
465
|
ble_active = ble.enabled() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
466
|
if not ble_active: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
467
|
ble.enable() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
468
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
469
|
sc = ub.Scanner() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
470
|
scanResults = sc.scan({0} * 1000) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
471
|
for res in scanResults: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
472
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
473
|
scanData = res.getScanData() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
474
|
if res.addr(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
475
|
for data in scanData: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
476
|
print({{ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
477
|
'address': res.addr(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
478
|
'rssi': res.rssi(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
479
|
'adv_type': data[0], |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
480
|
'advertisement': bytes(data[2]), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
481
|
}}) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
482
|
except MemoryError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
483
|
pass |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
484
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
485
|
if not ble_active: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
486
|
ble.disable() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
487
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
488
|
ble_scan() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
489
|
del ble_scan |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
490
|
""".format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
491
|
timeout |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
492
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
493
|
out, err = self.executeCommands( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
494
|
command, mode=self._submitMode, timeout=(timeout + 5) * 1000 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
495
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
496
|
if err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
497
|
return {}, err |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
498
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
499
|
scanResults = {} |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
500
|
tempResults = {} |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
501
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
502
|
for line in out.decode("utf-8").splitlines(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
503
|
res = ast.literal_eval(line) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
504
|
address = res["address"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
505
|
if address not in tempResults: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
506
|
tempResults[address] = { |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
507
|
"advertisements": {}, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
508
|
} |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
509
|
tempResults[address]["rssi"] = res["rssi"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
510
|
tempResults[address]["advertisements"][res["adv_type"]] = res[ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
511
|
"advertisement" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
512
|
] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
513
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
514
|
for address in tempResults: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
515
|
advertisements = bytearray() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
516
|
for advType, advertisement in tempResults[address][ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
517
|
"advertisements" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
518
|
].items(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
519
|
advertisements += ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
520
|
(len(advertisement) + 1).to_bytes() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
521
|
+ advType.to_bytes() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
522
|
+ advertisement |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
523
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
524
|
scanResults[address] = BluetoothAdvertisement(address) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
525
|
scanResults[address].update( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
526
|
SCAN_RSP, tempResults[address]["rssi"], advertisements |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
527
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
528
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
529
|
return scanResults, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
530
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
531
|
def supportsDeviceScan(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
532
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
533
|
Public method to indicate, that the Bluetooth implementation supports |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
534
|
scanning for devices. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
535
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
536
|
@return flag indicating that the scanning function is supported |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
537
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
538
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
539
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
540
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
541
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
542
|
def createDevice(microPythonWidget, deviceType, _vid, _pid, _boardName, _serialNumber): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
543
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
544
|
Function to instantiate a MicroPython device object. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
545
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
546
|
@param microPythonWidget reference to the main MicroPython widget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
547
|
@type MicroPythonWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
548
|
@param deviceType device type assigned to this device interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
549
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
550
|
@param _vid vendor ID (unused) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
551
|
@type int |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
552
|
@param _pid product ID (unused) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
553
|
@type int |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
554
|
@param _boardName name of the board (unused) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
555
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
556
|
@param _serialNumber serial number of the board (unused) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
557
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
558
|
@return reference to the instantiated device object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
559
|
@rtype RP2Device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
560
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
561
|
return Nrf52Device(microPythonWidget, deviceType) |