src/eric7/MicroPython/MicroPythonWidget.py

branch
eric7
changeset 9749
5d409223cf3f
parent 9748
df9520c864f2
child 9751
606ac0e26533
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))

eric ide

mercurial