MicroPython mpy_network

Wed, 01 Mar 2023 19:54:23 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 01 Mar 2023 19:54:23 +0100
branch
mpy_network
changeset 9835
b4b07de1b695
parent 9834
1fdaebde6316
child 9836
902ec9a04ebe

MicroPython
- added the 'pico wireless' WiFi status functionality

src/eric7/MicroPython/Devices/RP2040Devices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/WifiDialogs/WifiStatusDialog.py file | annotate | diff | comparison | revisions
--- a/src/eric7/MicroPython/Devices/RP2040Devices.py	Wed Mar 01 19:53:49 2023 +0100
+++ b/src/eric7/MicroPython/Devices/RP2040Devices.py	Wed Mar 01 19:54:23 2023 +0100
@@ -58,9 +58,19 @@
                 3: self.tr("connected"),
             },
             "pimoroni": {
-                # TODO: not yet implemented
+                0: self.tr("idle"),
+                1: self.tr("no matching access point found"),
+                2: self.tr("network scan completed"),
+                3: self.tr("connected"),
+                4: self.tr("connection failed"),
+                5: self.tr("connection lost"),
+                6: self.tr("disconnected"),
+                7: self.tr("AP listening"),
+                8: self.tr("AP connected"),
+                9: self.tr("AP failed"),
             },
         }
+        # TODO: must be specific (picow, pimoroni)
         self.__securityTranslations = {
             0: self.tr("open", "open WiFi network"),
             1: "WEP",
@@ -167,6 +177,10 @@
         self.__flashMpyAct = self.__rp2040Menu.addAction(
             self.tr("Flash MicroPython Firmware"), self.__flashPython
         )
+        self.__rp2040Menu.addSeparator()
+        self.__resetAct = self.__rp2040Menu.addAction(
+            self.tr("Reset Device"), self.__resetDevice
+        )
 
     def addDeviceMenuEntries(self, menu):
         """
@@ -181,6 +195,7 @@
         self.__showMpyAct.setEnabled(connected)
         self.__bootloaderAct.setEnabled(connected)
         self.__flashMpyAct.setEnabled(not linkConnected)
+        self.__resetAct.setEnabled(connected)
 
         menu.addMenu(self.__rp2040Menu)
 
@@ -213,7 +228,8 @@
                 [
                     "import machine",
                     "machine.bootloader()",
-                ]
+                ],
+                mode=self._submitMode,
             )
             # simulate pressing the disconnect button
             self.microPython.on_connectButton_clicked()
@@ -302,6 +318,15 @@
             msg,
         )
 
+    @pyqtSlot()
+    def __resetDevice(self):
+        """
+        Private slot to reset the connected device.
+        """
+        self.microPython.deviceInterface().execute(
+            "import machine\nmachine.reset()\n", mode=self._submitMode
+        )
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
@@ -397,6 +422,9 @@
         @rtype tuple of (bool, str)
         @exception OSError raised to indicate an issue with the device
         """
+        # picowireless:
+        # It seems to take up to 20 sec to detect, that no Pico Wireless Pack is
+        # attached. Therefore the command will timeout before.
         command = """
 def has_wifi():
     try:
@@ -406,8 +434,8 @@
     except ImportError:
         try:
             import picowireless
-            if picowireless.get_fw_version() != '':
-                return True, 'pimoroni'
+            picowireless.init()
+            return True, 'pimoroni'
         except ImportError:
             pass
 
@@ -420,7 +448,10 @@
             command, mode=self._submitMode, timeout=10000
         )
         if err:
-            raise OSError(self._shortError(err))
+            if not err.startswith("Timeout "):
+                raise OSError(self._shortError(err))
+            else:
+                return False  # pimoroni firmware loaded but no pico wireless present
         return ast.literal_eval(out.decode("utf-8"))
 
     def getWifiData(self):
@@ -477,7 +508,54 @@
 """
         elif self._deviceData["wifi_type"] == "pimoroni":
             # TODO: not yet implemented
-            pass
+            command = """
+def wifi_status():
+    import picowireless as pw
+    import ubinascii
+    import ujson
+
+    def ip_str(ip):
+        return '.'.join(str(i) for i in ip)
+
+    station = {
+        'active': pw.get_connection_status() not in (0, 7, 8, 9),
+        'connected': pw.get_connection_status() == 3,
+        'status': pw.get_connection_status(),
+        'ifconfig': (
+            ip_str(pw.get_ip_address()),
+            ip_str(pw.get_subnet_mask()),
+            ip_str(pw.get_gateway_ip()),
+            '0.0.0.0'
+        ),
+        'mac': ubinascii.hexlify(pw.get_mac_address(), ':').decode(),
+    }
+    if station['connected']:
+        station.update({
+            'ap_ssid': pw.get_current_ssid(),
+            'ap_bssid': binascii.hexlify(pw.get_current_bssid(), ':'),
+            'ap_rssi': pw.get_current_rssi(),
+            'ap_security': pw.get_current_encryption_type(),
+        })
+    print(ujson.dumps(station))
+
+    ap = {
+        'active': pw.get_connection_status() in (7, 8, 9),
+        'connected': pw.get_connection_status() == 8,
+        'status': pw.get_connection_status(),
+        'mac': ubinascii.hexlify(pw.get_mac_address(), ':').decode(),
+    }
+    if ap['active']:
+        ap['essid'] = pw.get_current_ssid()
+    print(ujson.dumps(ap))
+
+    overall = {
+        'active': pw.get_connection_status() != 0
+    }
+    print(ujson.dumps(overall))
+
+wifi_status()
+del wifi_status
+"""
         else:
             return super().getWifiData()
 
--- a/src/eric7/MicroPython/WifiDialogs/WifiStatusDialog.py	Wed Mar 01 19:53:49 2023 +0100
+++ b/src/eric7/MicroPython/WifiDialogs/WifiStatusDialog.py	Wed Mar 01 19:54:23 2023 +0100
@@ -107,9 +107,10 @@
                     QTreeWidgetItem(
                         apHeader, [self.tr("Name"), clientStatus["ap_ssid"]]
                     )
-                    QTreeWidgetItem(
-                        apHeader, [self.tr("Channel"), str(clientStatus["ap_channel"])]
-                    )
+                    with contextlib.suppress(KeyError):
+                        QTreeWidgetItem(
+                            apHeader, [self.tr("Channel"), str(clientStatus["ap_channel"])]
+                        )
                     QTreeWidgetItem(
                         apHeader, [self.tr("MAC-Address"), clientStatus["ap_bssid"]]
                     )
@@ -119,9 +120,10 @@
                     QTreeWidgetItem(
                         apHeader, [self.tr("Security"), clientStatus["ap_security"]]
                     )
-                    QTreeWidgetItem(
-                        apHeader, [self.tr("Country"), clientStatus["ap_country"]]
-                    )
+                    with contextlib.suppress(KeyError):
+                        QTreeWidgetItem(
+                            apHeader, [self.tr("Country"), clientStatus["ap_country"]]
+                        )
 
         # access point interface
         if apStatus:
@@ -145,12 +147,13 @@
                     QTreeWidgetItem(header, [self.tr("Status"), apStatus["status"]])
                 with contextlib.suppress(KeyError):
                     QTreeWidgetItem(header, [self.tr("Hostname"), apStatus["hostname"]])
-                QTreeWidgetItem(
-                    header, [self.tr("IPv4 Address"), apStatus["ifconfig"][0]]
-                )
-                QTreeWidgetItem(header, [self.tr("Netmask"), apStatus["ifconfig"][1]])
-                QTreeWidgetItem(header, [self.tr("Gateway"), apStatus["ifconfig"][2]])
-                QTreeWidgetItem(header, [self.tr("DNS"), apStatus["ifconfig"][3]])
+                with contextlib.suppress(KeyError):
+                    QTreeWidgetItem(
+                        header, [self.tr("IPv4 Address"), apStatus["ifconfig"][0]]
+                    )
+                    QTreeWidgetItem(header, [self.tr("Netmask"), apStatus["ifconfig"][1]])
+                    QTreeWidgetItem(header, [self.tr("Gateway"), apStatus["ifconfig"][2]])
+                    QTreeWidgetItem(header, [self.tr("DNS"), apStatus["ifconfig"][3]])
                 with contextlib.suppress(KeyError):
                     QTreeWidgetItem(header, [self.tr("SSID"), apStatus["essid"]])
                 QTreeWidgetItem(header, [self.tr("MAC-Address"), apStatus["mac"]])

eric ide

mercurial