src/eric7/MicroPython/MicroPythonWebreplDeviceInterface.py

Sat, 23 Dec 2023 15:48:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 23 Dec 2023 15:48:12 +0100
branch
eric7
changeset 10439
21c28b0f9e41
parent 10230
1311cd5d117e
child 10683
779cda568acb
permissions
-rw-r--r--

Updated copyright for 2024.

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
10439
21c28b0f9e41 Updated copyright for 2024.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10230
diff changeset
3 # Copyright (c) 2023 - 2024 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 an interface to talk to a connected MicroPython device via
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 a webrepl connection.
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 QThread, pyqtSlot
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 from PyQt6.QtWidgets import QInputDialog, QLineEdit
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 eric7 import Preferences
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 from eric7.EricWidgets import EricMessageBox
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 .MicroPythonDeviceInterface import MicroPythonDeviceInterface
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 from .MicroPythonWebreplSocket import MicroPythonWebreplSocket
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 class MicroPythonWebreplDeviceInterface(MicroPythonDeviceInterface):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Class implementing an interface to talk to a connected MicroPython device via
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 a webrepl connection.
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 def __init__(self, parent=None):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 Constructor
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param parent reference to the parent object
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @type QObject
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 super().__init__(parent)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 self.__socket = MicroPythonWebreplSocket(
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 timeout=Preferences.getMicroPython("WebreplTimeout"), parent=self
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.__socket.readyRead.connect(self.__readSocket)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @pyqtSlot()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 def __readSocket(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 Private slot to read all available data and emit it with the
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 "dataReceived" signal for further processing.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 if not self.__blockReadyRead:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 data = bytes(self.__socket.readAll())
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.dataReceived.emit(data)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 def __readAll(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 Private method to read all data and emit it for further processing.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 data = self.__socket.readAll()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.dataReceived.emit(data)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 def connectToDevice(self, connection):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 """
10229
e50bbf250343 Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10069
diff changeset
63 Public method to connect to the device.
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 @param connection name of the connection to be used in the form of an URL string
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 (ws://password@host:port)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @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: 10069
diff changeset
68 @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: 10069
diff changeset
69 @rtype tuple of (bool, str)
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 connection = connection.replace("ws://", "")
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 try:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 password, hostPort = connection.split("@", 1)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 except ValueError:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 password, hostPort = None, connection
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 if password is None:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 password, ok = QInputDialog.getText(
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 None,
10016
8db27a64d434 Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10012
diff changeset
79 self.tr("WebREPL Password"),
8db27a64d434 Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10012
diff changeset
80 self.tr("Enter the WebREPL password:"),
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 QLineEdit.EchoMode.Password,
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 )
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 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: 10069
diff changeset
84 return False, self.tr("No password given")
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 try:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 host, port = hostPort.split(":", 1)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 port = int(port)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 except ValueError:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 host, port = hostPort, 8266 # default port is 8266
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 self.__blockReadyRead = 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: 10069
diff changeset
93 ok, error = self.__socket.connectToDevice(host, port)
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 if 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: 10069
diff changeset
95 ok, error = self.__socket.login(password)
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 if not ok:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 EricMessageBox.warning(
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 None,
10016
8db27a64d434 Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10012
diff changeset
99 self.tr("WebREPL Login"),
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 self.tr(
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 "The login to the selected device 'webrepl' failed. The given"
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 " password may be incorrect."
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 ),
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 )
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 self.__connected = ok
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
10229
e50bbf250343 Extended the MicroPython code to give an indication, why the connection to a device failed.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10069
diff changeset
109 return self.__connected, error
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 @pyqtSlot()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 def disconnectFromDevice(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 Public slot to disconnect from the device.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 self.__socket.disconnect()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 self.__connected = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 def isConnected(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 Public method to get the connection status.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 @return flag indicating the connection status
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 @rtype bool
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 return self.__connected
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 @pyqtSlot()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 def handlePreferencesChanged(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 Public slot to handle a change of the preferences.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 self.__socket.setTimeout(Preferences.getMicroPython("WebreplTimeout"))
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 def write(self, data):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 Public method to write data to the connected device.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 @param data data to be written
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 @type bytes or bytearray
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 self.__connected and self.__socket.writeTextMessage(data)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 def probeDevice(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 Public method to check the device is responding.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 If the device has not been flashed with a MicroPython firmware, the
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 probe will fail.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 @return flag indicating a communicating MicroPython device
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 @rtype bool
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 if not self.__connected:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 return False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 # switch on paste mode
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 self.__blockReadyRead = True
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 ok = self.__pasteOn()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 if not ok:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 return False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 # switch off raw mode
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 QThread.msleep(10)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 self.__pasteOff()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 return True
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170
10069
435cc5875135 Corrected and checked some code style issues (unused function arguments).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10037
diff changeset
171 def execute(self, commands, *, mode="raw", timeout=0): # noqa: U100
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 Public method to send commands to the connected device and return the
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 result.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 @param commands list of commands to be executed
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 @type str or list of str
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 @keyparam mode submit mode to be used (one of 'raw' or 'paste') (defaults to
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 'raw'). This is ignored because webrepl always uses 'paste' mode.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 @type str
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 @keyparam timeout per command timeout in milliseconds (0 for configured default)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 (defaults to 0)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 @type int (optional)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 @return tuple containing stdout and stderr output of the device
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 @rtype tuple of (bytes, bytes)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 if not self.__connected:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 return b"", b"Device is not connected."
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 if isinstance(commands, list):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 commands = "\n".join(commands)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 # switch on paste mode
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 self.__blockReadyRead = True
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 ok = self.__pasteOn()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if not ok:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 return (b"", b"Could not switch to paste mode. Is the device switched on?")
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 # send commands
10019
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
201 for command in commands.splitlines(keepends=True):
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
202 # send the data as single lines
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
203 commandBytes = command.encode("utf-8")
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
204 self.__socket.writeTextMessage(commandBytes)
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
205 ok = self.__socket.readUntil(commandBytes)
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
206 if ok != commandBytes:
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
207 self.__blockReadyRead = False
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
208 return (
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
209 b"",
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
210 "Expected '{0}', got '{1}', followed by '{2}'".format(
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
211 commandBytes, ok, self.__socket.readAll()
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
212 ).encode("utf-8"),
e56089d00750 Fixed a few issue in the MicroPython support related to behavior of devices and change caused by MicroPython release 1.20.0 on ESP32 devices.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10016
diff changeset
213 )
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 # switch off paste mode causing the commands to be executed
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 self.__pasteOff()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 # read until Python prompt
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 result = (
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 self.__socket.readUntil(b">>> ", timeout=timeout)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 .replace(b">>> ", b"")
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 .strip()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 )
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 if self.__socket.hasTimedOut():
10037
e5d8dbcae771 Corrected a code formatting issue.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10033
diff changeset
225 out, err = b"", b"Timeout while processing commands."
10033
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
226 else:
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
227 # get rid of any OSD string and send it
10230
1311cd5d117e MicroPython interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10229
diff changeset
228 while result.startswith(b"\x1b]0;"):
10033
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
229 osd, result = result.split(b"\x1b\\", 1)
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
230 self.osdInfo.emit(osd[4:].decode("utf-8"))
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231
10033
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
232 if self.TracebackMarker in result:
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
233 errorIndex = result.find(self.TracebackMarker)
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
234 out, err = result[:errorIndex], result[errorIndex:].replace(">>> ", "")
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
235 else:
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
236 out = result
91b0939626ff Optimized the MicroPython execute() functions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10019
diff changeset
237 err = b""
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 return out, err
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241
10069
435cc5875135 Corrected and checked some code style issues (unused function arguments).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10037
diff changeset
242 def executeAsync(self, commandsList, submitMode): # noqa: U100
10008
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 Public method to execute a series of commands over a period of time
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 without returning any result (asynchronous execution).
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 @param commandsList list of commands to be execute on the device
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 @type list of str
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 @param submitMode mode to be used to submit the commands
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 @type str (one of 'raw' or 'paste')
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 self.__blockReadyRead = True
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 self.__pasteOn()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 command = b"\n".join(c.encode("utf-8)") for c in commandsList)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 self.__socket.writeTextMessage(command)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 self.__socket.readUntil(command)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 self.__blockReadyRead = False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 self.__pasteOff()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 self.executeAsyncFinished.emit()
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 def __pasteOn(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 Private method to switch the connected device to 'paste' mode.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 Note: switching to paste mode is done with synchronous writes.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 @return flag indicating success
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 @rtype bool
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 if not self.__connected:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 return False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 pasteMessage = b"paste mode; Ctrl-C to cancel, Ctrl-D to finish\r\n=== "
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 self.__socket.writeTextMessage(b"\x02") # end raw mode if required
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 for _i in range(3):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 # CTRL-C three times to break out of loops
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 self.__socket.writeTextMessage(b"\r\x03")
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 # time out after 500ms if device is not responding
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 self.__socket.readAll() # read all data and discard it
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 self.__socket.writeTextMessage(b"\r\x05") # send CTRL-E to enter paste mode
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 self.__socket.readUntil(pasteMessage)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 if self.__socket.hasTimedOut():
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 # it timed out; try it again and than fail
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 self.__socket.writeTextMessage(b"\r\x05") # send CTRL-E again
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 self.__socket.readUntil(pasteMessage)
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 if self.__socket.hasTimedOut():
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 return False
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 self.__socket.readAll() # read all data and discard it
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 return True
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 def __pasteOff(self):
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 Private method to switch 'paste' mode off.
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 """
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 if self.__connected:
c5bcafe3485c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 self.__socket.writeTextMessage(b"\x04") # send CTRL-D to cancel paste mode

eric ide

mercurial