diff -r df9520c864f2 -r 5d409223cf3f src/eric7/MicroPython/MicroPythonWidget.py --- a/src/eric7/MicroPython/MicroPythonWidget.py Wed Feb 08 11:54:36 2023 +0100 +++ b/src/eric7/MicroPython/MicroPythonWidget.py Wed Feb 08 18:09:19 2023 +0100 @@ -279,6 +279,7 @@ self.__interface = None self.__device = None self.__connected = False + self.__linkConnected = False self.__setConnected(False) if not HAS_QTSERIALPORT: @@ -382,7 +383,7 @@ if index == -1: # entry is no longer present index = 0 - if self.__connected: + if self.__linkConnected: # we are still connected, so disconnect self.on_connectButton_clicked() @@ -524,17 +525,19 @@ @type dict """ if "open" in kwargs: - self.openButton.setEnabled(kwargs["open"]) + self.openButton.setEnabled(kwargs["open"] and self.__connected) if "save" in kwargs: - self.saveButton.setEnabled(kwargs["save"]) + self.saveButton.setEnabled(kwargs["save"] and self.__connected) if "run" in kwargs: - self.runButton.setEnabled(kwargs["run"]) + self.runButton.setEnabled(kwargs["run"] and self.__connected) if "repl" in kwargs: - self.replButton.setEnabled(kwargs["repl"]) + self.replButton.setEnabled(kwargs["repl"] and self.__linkConnected) if "files" in kwargs: - self.filesButton.setEnabled(kwargs["files"]) + self.filesButton.setEnabled(kwargs["files"] and self.__connected) if "chart" in kwargs: - self.chartButton.setEnabled(kwargs["chart"] and HAS_QTCHART) + self.chartButton.setEnabled( + kwargs["chart"] and HAS_QTCHART and self.__connected + ) @pyqtSlot(QPoint) def __showContextMenu(self, pos): @@ -554,33 +557,29 @@ selectAllKeys = QKeySequence("Ctrl+Shift+A") menu = QMenu(self) - act = menu.addAction( + menu.addAction( EricPixmapCache.getIcon("editDelete"), self.tr("Clear"), self.__clear - ) - act.setEnabled(bool(self.replEdit.toPlainText())) + ).setEnabled(bool(self.replEdit.toPlainText())) menu.addSeparator() - act = menu.addAction( + menu.addAction( EricPixmapCache.getIcon("editCopy"), self.tr("Copy"), copyKeys, self.replEdit.copy, - ) - act.setEnabled(self.replEdit.textCursor().hasSelection()) - act = menu.addAction( + ).setEnabled(self.replEdit.textCursor().hasSelection()) + menu.addAction( EricPixmapCache.getIcon("editPaste"), self.tr("Paste"), pasteKeys, self.__paste, - ) - act.setEnabled(self.replEdit.canPaste() and self.__interface.isConnected()) + ).setEnabled(self.replEdit.canPaste() and self.__connected) menu.addSeparator() - act = menu.addAction( + menu.addAction( EricPixmapCache.getIcon("editSelectAll"), self.tr("Select All"), selectAllKeys, self.replEdit.selectAll, - ) - act.setEnabled(bool(self.replEdit.toPlainText())) + ).setEnabled(bool(self.replEdit.toPlainText())) menu.exec(self.replEdit.mapToGlobal(pos)) @@ -592,14 +591,15 @@ @type bool """ self.__connected = connected + self.__linkConnected = self.__interface.isConnected() - self.deviceConnectedLed.setOn(connected) + self.deviceConnectedLed.setOn(self.__linkConnected) if self.__fileManagerWidget: self.__fileManagerWidget.deviceConnectedLed.setOn(connected) - self.deviceTypeComboBox.setEnabled(not connected) + self.deviceTypeComboBox.setEnabled(not self.__linkConnected) - if connected: + if self.__linkConnected: self.connectButton.setIcon(EricPixmapCache.getIcon("linkDisconnect")) self.connectButton.setToolTip( self.tr("Press to disconnect the current device") @@ -612,13 +612,22 @@ def isConnected(self): """ - Public method to get the connection state. + Public method to get the MicroPython device connection state. @return connection state @rtype bool """ return self.__connected + def isLinkConnected(self): + """ + Public method to get the link connection state. + + @return connection state + @rtype bool + """ + return self.__linkConnected + def __showNoDeviceMessage(self): """ Private method to show a message dialog indicating a missing device. @@ -689,7 +698,7 @@ Private slot to connect to the selected device or disconnect from the currently connected device. """ - if self.__connected: + if self.__linkConnected: with EricOverrideCursor(): self.__disconnectFromDevice() @@ -1109,7 +1118,6 @@ self.__device = MicroPythonDevices.getDevice( deviceType, self, vid, pid ) - self.__device.setButtons() self.__lastPort = port self.__lastDeviceType = deviceType @@ -1117,13 +1125,25 @@ return if self.__interface.connectToDevice(port): - self.__setConnected(True) - - if ( - Preferences.getMicroPython("SyncTimeAfterConnect") - and self.__device.hasTimeCommands() - ): - self.__synchronizeTime(quiet=True) + deviceResponding = self.__interface.probeDevice() + self.__setConnected(deviceResponding) + if deviceResponding: + if ( + Preferences.getMicroPython("SyncTimeAfterConnect") + and self.__device.hasTimeCommands() + ): + self.__synchronizeTime(quiet=True) + else: + with EricOverridenCursor(): + EricMessageBox.warning( + self, + self.tr("Serial Device Connect"), + self.tr( + """<p>The device at serial port <b>{0}</b> does not""" + """ respond. It may not have a MicroPython firmware""" + """ flashed.</p>""" + ).format(port), + ) else: with EricOverridenCursor(): EricMessageBox.warning( @@ -1135,6 +1155,8 @@ ).format(port), ) + self.__device.setButtons() + def __disconnectFromDevice(self): """ Private method to disconnect from the device. @@ -1937,10 +1959,13 @@ from .ShowModulesDialog import ShowModulesDialog if self.__connected: - moduleNames = self.__interface.getModules() - dlg = ShowModulesDialog( - moduleNames, - info=self.tr("Plus any modules on the filesystem."), - parent=self, - ) - dlg.show() + try: + moduleNames = self.__interface.getModules() + dlg = ShowModulesDialog( + moduleNames, + info=self.tr("Plus any modules on the filesystem."), + parent=self, + ) + dlg.show() + except Exception as exc: + self.__showError("getModules()", str(exc))