src/eric7/MicroPython/MicroPythonWebreplSocket.py

Fri, 06 Oct 2023 15:52:33 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 06 Oct 2023 15:52:33 +0200
branch
eric7
changeset 10229
e50bbf250343
parent 10017
6d5ba2c97a8a
child 10428
a071d4065202
permissions
-rw-r--r--

Extended the MicroPython code to give an indication, why the connection to a device failed.

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 (
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
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 @@rtype bool
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