src/eric7/MicroPython/MicroPythonWebreplSocket.py

Sun, 16 Mar 2025 12:53:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 16 Mar 2025 12:53:12 +0100
branch
eric7
changeset 11170
6d6199d668fb
parent 11090
f5f5f5803935
permissions
-rw-r--r--

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

eric ide

mercurial