Corrected some issues in the 'micro:bit' device class and enhanced the MPy file manager.
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) |