Wed, 01 Mar 2023 19:54:23 +0100
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"]])