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).
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
11090
|
3
|
# Copyright (c) 2023 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing a websocket class to be connect to the MicroPython webrepl |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
interface. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
from PyQt6.QtCore import ( |
10017
|
12
|
QCoreApplication, |
|
13
|
QEventLoop, |
|
14
|
QMutex, |
|
15
|
QTime, |
|
16
|
QTimer, |
|
17
|
QUrl, |
|
18
|
pyqtSignal, |
|
19
|
pyqtSlot, |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
from PyQt6.QtNetwork import QAbstractSocket |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
from PyQt6.QtWebSockets import QWebSocket |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
from eric7.EricUtilities.EricMutexLocker import EricMutexLocker |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
class MicroPythonWebreplSocket(QWebSocket): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
Class implementing a websocket client to be connected to the MicroPython webrepl |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
interface. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
@signal readyRead() emitted to signal the availability of data |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
readyRead = pyqtSignal() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
def __init__(self, timeout=10000, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
@param timeout timout in milliseconds to be set |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
@type int |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
@param parent reference to the parent object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
@type QObject |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
super().__init__(parent=parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
self.__connected = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
self.__timeout = timeout # 10s default timeout |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
self.__timedOut = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
self.__mutex = QMutex() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
self.__buffer = b"" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
self.textMessageReceived.connect(self.__textDataReceived) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
@pyqtSlot(str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
def __textDataReceived(self, strMessage): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
Private slot handling a received text message. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
@param strMessage received text message |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
with EricMutexLocker(self.__mutex): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
self.__buffer += strMessage.encode("utf-8") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
self.readyRead.emit() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
def setTimeout(self, timeout): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
Public method to set the socket timeout value. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
@param timeout timout in milliseconds to be set |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
@type int |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
self.__timeout = timeout |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
def waitForConnected(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
Public method to wait for the websocket being connected. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
@return flag indicating the connect result |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
loop = QEventLoop() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
self.connected.connect(loop.quit) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
self.errorOccurred.connect(loop.quit) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
def timeout(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
loop.quit() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
self.__timedOut = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
self.__timedOut = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
timer = QTimer() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
timer.setSingleShot(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
timer.timeout.connect(timeout) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
timer.start(self.__timeout) |
10017
|
98
|
|
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
loop.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
timer.stop() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
if self.state() == QAbstractSocket.SocketState.ConnectedState: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
self.__connected = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
self.__connected = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
def connectToDevice(self, host, port): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
Public method to connect to the given host and port. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
@param host host name or IP address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
@param port port number |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
@type int |
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
116
|
@return flag indicating success and an error message |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
117
|
@rtype tuple of (bool, str) |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
if self.__connected: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
self.disconnectFromDevice() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
url = QUrl(f"ws://{host}:{port}") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
self.open(url) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
ok = self.waitForConnected() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
if not ok: |
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
126
|
return False, self.tr("Connection to device webrepl failed.") |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
self.__connected = True |
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
129
|
return True, "" |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
def disconnect(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
Public method to disconnect the websocket. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
if self.__connected: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
self.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
self.__connected = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
def isConnected(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
Public method to check the connected state of the websocket. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
@return flag indicating the connected state |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
return self.__connected |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
def hasTimedOut(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
Public method to check, if the last 'readUntil()' has timed out. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
@return flag indicating a timeout |
10428
a071d4065202
Converted some source code documentation to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
153
|
@rtype bool |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
return self.__timedOut |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
def login(self, password): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
Public method to login to the webrepl console of the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
@param password password |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
@type str |
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
163
|
@return flag indicating a successful login and an error indication |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
164
|
@rtype tuple of (bool, str) |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
self.readUntil(expected=b": ") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
self.writeTextMessage(password.encode("utf-8") + b"\r") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
data = self.readUntil([b">>> ", b"denied\r\n"]) |
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
169
|
error = ( |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
170
|
self.tr("WebRepl login failed (access denied).") |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
171
|
if data.endswith(b"denied\r\n") |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
172
|
else "" |
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
173
|
) |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
|
10229
e50bbf250343
Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
175
|
return error == "", error |
10008
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
def writeTextMessage(self, data): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
Public method write some text data to the webrepl server of the connected |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
@param data text data to be sent |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
@type bytes |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
self.sendTextMessage(data.decode("utf-8")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
self.flush() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
def readAll(self, timeout=0): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
Public method to read all available data. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
@param timeout timeout in milliseconds (0 for no timeout) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
(defaults to 0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
@type int (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
@return received data |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
@rtype bytes |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
QCoreApplication.processEvents( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
if timeout > 0: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
# receive data for 'timeout' milliseconds |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
loop = QEventLoop() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
QTimer.singleShot(timeout, loop.quit) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
loop.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
# return all buffered data |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
with EricMutexLocker(self.__mutex): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
data = self.__buffer |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
self.__buffer = b"" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
return data |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
def readUntil(self, expected=b"\n", size=None, timeout=0): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
r""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
Public method to read data until an expected sequence is found |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
(default: \n) or a specific size is exceeded. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
@param expected expected bytes sequence |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
@type bytes |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
@param size maximum data to be read (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
@type int (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
@param timeout timeout in milliseconds (0 for configured default) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
(defaults to 0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
@type int (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
@return bytes read from the device including the expected sequence |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
@rtype bytes |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
data = b"" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
self.__timedOut = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
if timeout == 0: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
timeout = self.__timeout |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
if not isinstance(expected, list): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
expected = [expected] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
t = QTime.currentTime() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
while True: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
QCoreApplication.processEvents( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241
|
QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents, 500 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243
|
with EricMutexLocker(self.__mutex): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244
|
if any(e in self.__buffer for e in expected): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245
|
for e in expected: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246
|
index = self.__buffer.find(e) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247
|
if index >= 0: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248
|
endIndex = index + len(e) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249
|
data = self.__buffer[:endIndex] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250
|
self.__buffer = self.__buffer[endIndex:] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251
|
break |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252
|
break |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253
|
if size is not None and len(self.__buffer) >= size: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254
|
data = self.__buffer[:size] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255
|
self.__buffer = self.__buffer[size:] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256
|
break |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257
|
if t.msecsTo(QTime.currentTime()) > timeout: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258
|
self.__timedOut = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259
|
data = self.__buffer |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260
|
self.__buffer = b"" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261
|
break |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263
|
return data |