48 from . import ConvertToUF2Dialog, Devices, UF2FlashDialog |
48 from . import ConvertToUF2Dialog, Devices, UF2FlashDialog |
49 from .BluetoothDialogs.BluetoothController import BluetoothController |
49 from .BluetoothDialogs.BluetoothController import BluetoothController |
50 from .EthernetDialogs.EthernetController import EthernetController |
50 from .EthernetDialogs.EthernetController import EthernetController |
51 from .MicroPythonFileManager import MicroPythonFileManager |
51 from .MicroPythonFileManager import MicroPythonFileManager |
52 from .MicroPythonFileManagerWidget import MicroPythonFileManagerWidget |
52 from .MicroPythonFileManagerWidget import MicroPythonFileManagerWidget |
|
53 from .MicroPythonWebreplDeviceInterface import MicroPythonWebreplDeviceInterface |
53 from .Ui_MicroPythonWidget import Ui_MicroPythonWidget |
54 from .Ui_MicroPythonWidget import Ui_MicroPythonWidget |
54 from .WifiDialogs.WifiController import WifiController |
55 from .WifiDialogs.WifiController import WifiController |
55 |
56 |
56 try: |
57 try: |
57 from .MicroPythonGraphWidget import MicroPythonGraphWidget |
58 from .MicroPythonGraphWidget import MicroPythonGraphWidget |
214 DevicePortRole = Qt.ItemDataRole.UserRole + 2 |
215 DevicePortRole = Qt.ItemDataRole.UserRole + 2 |
215 DeviceVidRole = Qt.ItemDataRole.UserRole + 3 |
216 DeviceVidRole = Qt.ItemDataRole.UserRole + 3 |
216 DevicePidRole = Qt.ItemDataRole.UserRole + 4 |
217 DevicePidRole = Qt.ItemDataRole.UserRole + 4 |
217 DeviceSerNoRole = Qt.ItemDataRole.UserRole + 5 |
218 DeviceSerNoRole = Qt.ItemDataRole.UserRole + 5 |
218 DeviceInterfaceTypeRole = Qt.ItemDataRole.UserRole + 6 |
219 DeviceInterfaceTypeRole = Qt.ItemDataRole.UserRole + 6 |
|
220 DeviceWebreplUrlRole = Qt.ItemDataRole.UserRole + 7 |
219 |
221 |
220 dataReceived = pyqtSignal(bytes) |
222 dataReceived = pyqtSignal(bytes) |
221 |
223 |
222 ManualMarker = "<manual>" |
224 ManualMarker = "<manual>" |
223 |
225 |
344 |
346 |
345 self.deviceTypeComboBox.addItem("", "") |
347 self.deviceTypeComboBox.addItem("", "") |
346 devices, unknownDevices, unknownPorts = Devices.getFoundDevices() |
348 devices, unknownDevices, unknownPorts = Devices.getFoundDevices() |
347 if devices: |
349 if devices: |
348 supportedMessage = self.tr( |
350 supportedMessage = self.tr( |
349 "%n supported device(s) detected.", "", len(devices) |
351 "%n supported serial device(s) detected.", "", len(devices) |
350 ) |
352 ) |
351 |
353 |
352 for index, ( |
354 for index, ( |
353 boardType, |
355 boardType, |
354 boardName, |
356 boardName, |
380 self.deviceTypeComboBox.setItemData( |
382 self.deviceTypeComboBox.setItemData( |
381 index, "serial", self.DeviceInterfaceTypeRole |
383 index, "serial", self.DeviceInterfaceTypeRole |
382 ) |
384 ) |
383 |
385 |
384 else: |
386 else: |
385 supportedMessage = self.tr("No supported devices detected.") |
387 supportedMessage = self.tr("No supported serial devices detected.") |
386 |
388 |
387 self.__unknownPorts = unknownPorts |
389 self.__unknownPorts = unknownPorts |
388 if self.__unknownPorts: |
390 if self.__unknownPorts: |
389 unknownMessage = self.tr( |
391 unknownMessage = self.tr( |
390 "\n%n unknown device(s) for manual selection.", |
392 "\n%n unknown device(s) for manual selection.", |
399 self.ManualMarker, |
401 self.ManualMarker, |
400 self.DeviceTypeRole, |
402 self.DeviceTypeRole, |
401 ) |
403 ) |
402 else: |
404 else: |
403 unknownMessage = "" |
405 unknownMessage = "" |
|
406 |
|
407 # add webrepl entries |
|
408 self.deviceTypeComboBox.insertSeparator(self.deviceTypeComboBox.count()) |
|
409 # TODO: replace this test data with real code |
|
410 self.deviceTypeComboBox.addItem("Raspberry Pico W #2") |
|
411 index = self.deviceTypeComboBox.count() - 1 |
|
412 self.deviceTypeComboBox.setItemData(index, "rp2040", self.DeviceTypeRole) |
|
413 self.deviceTypeComboBox.setItemData( |
|
414 index, "webrepl", self.DeviceInterfaceTypeRole |
|
415 ) |
|
416 self.deviceTypeComboBox.setItemData( |
|
417 index, "ws://repl#3179@192.168.1.52", self.DeviceWebreplUrlRole |
|
418 ) |
|
419 ############################# |
404 |
420 |
405 self.deviceInfoLabel.setText(supportedMessage + unknownMessage) |
421 self.deviceInfoLabel.setText(supportedMessage + unknownMessage) |
406 |
422 |
407 index = self.deviceTypeComboBox.findText( |
423 index = self.deviceTypeComboBox.findText( |
408 currentDevice, Qt.MatchFlag.MatchExactly |
424 currentDevice, Qt.MatchFlag.MatchExactly |
762 def __clear(self): |
778 def __clear(self): |
763 """ |
779 """ |
764 Private slot to clear the REPL pane. |
780 Private slot to clear the REPL pane. |
765 """ |
781 """ |
766 self.replEdit.clear() |
782 self.replEdit.clear() |
767 self.__interface.isConnected() and self.__interface.write(b"\r") |
783 if bool(self.__interface) and self.__interface.isConnected(): |
|
784 self.__interface.write(b"\r") |
768 |
785 |
769 @pyqtSlot() |
786 @pyqtSlot() |
770 def __paste(self, mode=QClipboard.Mode.Clipboard): |
787 def __paste(self, mode=QClipboard.Mode.Clipboard): |
771 """ |
788 """ |
772 Private slot to perform a paste operation. |
789 Private slot to perform a paste operation. |
779 if clipboard: |
796 if clipboard: |
780 pasteText = clipboard.text(mode=mode) |
797 pasteText = clipboard.text(mode=mode) |
781 if pasteText: |
798 if pasteText: |
782 pasteText = pasteText.replace("\n\r", "\r") |
799 pasteText = pasteText.replace("\n\r", "\r") |
783 pasteText = pasteText.replace("\n", "\r") |
800 pasteText = pasteText.replace("\n", "\r") |
784 if self.__interface.isConnected(): |
801 if bool(self.__interface) and self.__interface.isConnected(): |
785 self.__interface.write(b"\x05") |
802 self.__interface.write(b"\x05") |
786 self.__interface.write(pasteText.encode("utf-8")) |
803 self.__interface.write(pasteText.encode("utf-8")) |
787 self.__interface.write(b"\x04") |
804 self.__interface.write(b"\x04") |
788 |
805 |
789 def eventFilter(self, obj, evt): |
806 def eventFilter(self, obj, evt): |
844 msg = b"" |
861 msg = b"" |
845 elif key in (Qt.Key.Key_Return, Qt.Key.Key_Enter): |
862 elif key in (Qt.Key.Key_Return, Qt.Key.Key_Enter): |
846 tc = self.replEdit.textCursor() |
863 tc = self.replEdit.textCursor() |
847 tc.movePosition(QTextCursor.MoveOperation.EndOfLine) |
864 tc.movePosition(QTextCursor.MoveOperation.EndOfLine) |
848 self.replEdit.setTextCursor(tc) |
865 self.replEdit.setTextCursor(tc) |
849 self.__interface.isConnected() and self.__interface.write(msg) |
866 if bool(self.__interface) and self.__interface.isConnected(): |
|
867 self.__interface.write(msg) |
850 return True |
868 return True |
851 else: |
869 else: |
852 # standard event processing |
870 # standard event processing |
853 return super().eventFilter(obj, evt) |
871 return super().eventFilter(obj, evt) |
854 |
872 |
865 @type QMouseEvent |
883 @type QMouseEvent |
866 """ |
884 """ |
867 if evt.button() == Qt.MouseButton.MiddleButton: |
885 if evt.button() == Qt.MouseButton.MiddleButton: |
868 self.__paste(mode=QClipboard.Mode.Selection) |
886 self.__paste(mode=QClipboard.Mode.Selection) |
869 msg = b"" |
887 msg = b"" |
870 if self.__interface.isConnected(): |
888 if bool(self.__interface) and self.__interface.isConnected(): |
871 self.__interface.write(msg) |
889 self.__interface.write(msg) |
872 evt.accept() |
890 evt.accept() |
873 else: |
891 else: |
874 self.__origReplEditMouseReleaseEvent(evt) |
892 self.__origReplEditMouseReleaseEvent(evt) |
875 |
893 |
1214 else: |
1232 else: |
1215 return |
1233 return |
1216 |
1234 |
1217 self.__interface = MicroPythonSerialDeviceInterface(self) |
1235 self.__interface = MicroPythonSerialDeviceInterface(self) |
1218 elif interfaceType == "webrepl": |
1236 elif interfaceType == "webrepl": |
1219 # TODO: not yet implemented |
1237 port = self.deviceTypeComboBox.currentData(self.DeviceWebreplUrlRole) |
1220 return |
1238 if not port: |
|
1239 # TODO: implement Webrepl parameter dialog (ws:// URL) |
|
1240 return |
|
1241 |
|
1242 self.__interface = MicroPythonWebreplDeviceInterface(self) |
1221 |
1243 |
1222 if self.__interface.connectToDevice(port): |
1244 if self.__interface.connectToDevice(port): |
1223 deviceResponding = self.__interface.probeDevice() |
1245 deviceResponding = self.__interface.probeDevice() |
1224 self.__setConnected(deviceResponding) |
1246 self.__setConnected(deviceResponding) |
1225 self.__device.setConnected(deviceResponding) |
1247 self.__device.setConnected(deviceResponding) |