19 class MicroPythonSerialDeviceInterface(MicroPythonDeviceInterface): |
19 class MicroPythonSerialDeviceInterface(MicroPythonDeviceInterface): |
20 """ |
20 """ |
21 Class implementing an interface to talk to a connected MicroPython device via |
21 Class implementing an interface to talk to a connected MicroPython device via |
22 a serial link. |
22 a serial link. |
23 """ |
23 """ |
24 |
|
25 PasteModePrompt = b"=== " |
|
26 TracebackMarker = b"Traceback (most recent call last):" |
|
27 |
24 |
28 def __init__(self, parent=None): |
25 def __init__(self, parent=None): |
29 """ |
26 """ |
30 Constructor |
27 Constructor |
31 |
28 |
213 return False |
210 return False |
214 |
211 |
215 if not self.__serial.isConnected(): |
212 if not self.__serial.isConnected(): |
216 return False |
213 return False |
217 |
214 |
218 # switch on raw mode |
215 # switch on paste mode |
219 self.__blockReadyRead = True |
216 self.__blockReadyRead = True |
220 ok = self.__pasteOn() |
217 ok = self.__pasteOn() |
221 if not ok: |
218 if not ok: |
222 self.__blockReadyRead = False |
219 self.__blockReadyRead = False |
223 return False |
220 return False |
224 |
221 |
225 # switch off raw mode |
222 # switch off paste mode |
226 QThread.msleep(10) |
223 QThread.msleep(10) |
227 self.__pasteOff() |
224 self.__pasteOff() |
228 self.__blockReadyRead = False |
225 self.__blockReadyRead = False |
229 |
226 |
230 return True |
227 return True |
351 """ |
348 """ |
352 if not self.__serial: |
349 if not self.__serial: |
353 return b"", b"" |
350 return b"", b"" |
354 |
351 |
355 if not self.__serial.isConnected(): |
352 if not self.__serial.isConnected(): |
356 return b"", b"Device not connected or not switched on." |
353 return b"", b"Device is not connected or not switched on." |
357 |
354 |
358 if isinstance(commands, list): |
355 if isinstance(commands, list): |
359 commands = "\n".join(commands) |
356 commands = "\n".join(commands) |
360 |
357 |
361 # switch on paste mode |
358 # switch on paste mode |
397 if self.__serial.hasTimedOut(): |
394 if self.__serial.hasTimedOut(): |
398 self.__blockReadyRead = False |
395 self.__blockReadyRead = False |
399 return b"", b"Timeout while processing commands." |
396 return b"", b"Timeout while processing commands." |
400 |
397 |
401 # get rid of any OSD string |
398 # get rid of any OSD string |
|
399 # TODO: emit the OSD data |
402 if result.startswith(b"\x1b]0;"): |
400 if result.startswith(b"\x1b]0;"): |
403 result = result.split(b"\x1b\\")[-1] |
401 result = result.split(b"\x1b\\")[-1] |
404 |
402 |
405 if self.TracebackMarker in result: |
403 if self.TracebackMarker in result: |
406 errorIndex = result.find(self.TracebackMarker) |
404 errorIndex = result.find(self.TracebackMarker) |
474 command = b"\n".join(c.encode("utf-8)") for c in commandsList) |
472 command = b"\n".join(c.encode("utf-8)") for c in commandsList) |
475 self.__serial.write(command) |
473 self.__serial.write(command) |
476 self.__serial.readUntil(command) |
474 self.__serial.readUntil(command) |
477 self.__blockReadyRead = False |
475 self.__blockReadyRead = False |
478 self.__pasteOff() |
476 self.__pasteOff() |
479 self.executeAsyncFinished.emit |
477 self.executeAsyncFinished.emit() |