src/eric7/MicroPython/MicroPythonWebreplSocket.py

Tue, 02 May 2023 12:01:40 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 02 May 2023 12:01:40 +0200
branch
mpy_network
changeset 10008
c5bcafe3485c
child 10017
6d5ba2c97a8a
permissions
-rw-r--r--

MicroPython
- Added an interface to the `WebRepl` of some devices.

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

eric ide

mercurial