eric6/MicroPython/EspDevices.py

changeset 7352
5f69f55b919f
parent 7346
9108d26211f7
child 7353
caa2ccd5677c
diff -r 79ae0af9558a -r 5f69f55b919f eric6/MicroPython/EspDevices.py
--- a/eric6/MicroPython/EspDevices.py	Thu Dec 05 19:44:27 2019 +0100
+++ b/eric6/MicroPython/EspDevices.py	Sat Dec 07 17:47:24 2019 +0100
@@ -24,13 +24,6 @@
 import Preferences
 
 
-# TODO: add backupFlash: python ./esptool.py --port /dev/ttyUSB4 --baud 115200 read_flash 0x00000 0x400000 backup.img
-#       selection of sizes: 1MB, 2MB, 4MB, 8MB, 16M (0x100000, 0x200000, 0x400000, 0x800000, 0x1000000)
-#       ESP8266: 256KB, 512KB (0x40000, 0x80000)
-# TODO: add restoreFlash: python esptool.py --port /dev/ttyUSB4 write_flash --flash_mode qio 0x00000 backup.img
-#       alternative modes for --flash_mode: qio,qout,dio,dout
-#       optional: --flash_size 1MB, 2MB, 4MB, 8MB, 16M (ESP8266 zusätzlich 256KB, 512KB)
-
 class EspDevice(MicroPythonDevice):
     """
     Class implementing the device for ESP32 and ESP8266 based boards.
@@ -143,6 +136,13 @@
                              self.__flashAddons)
         act.setEnabled(not connected)
         menu.addSeparator()
+        act = menu.addAction(self.tr("Backup Firmware"),
+                             self.__backupFlash)
+        act.setEnabled(not connected)
+        act = menu.addAction(self.tr("Restore Firmware"),
+                             self.__restoreFlash)
+        act.setEnabled(not connected)
+        menu.addSeparator()
         act = menu.addAction(self.tr("Show Chip ID"),
                              self.__showChipID)
         act.setEnabled(not connected)
@@ -238,6 +238,65 @@
                 dlg.exec_()
     
     @pyqtSlot()
+    def __backupFlash(self):
+        """
+        Private slot to backup the currently flashed firmware.
+        """
+        from .EspBackupRestoreFirmwareDialog import (
+            EspBackupRestoreFirmwareDialog
+        )
+        dlg = EspBackupRestoreFirmwareDialog(backupMode=True)
+        if dlg.exec_() == QDialog.Accepted:
+            chip, flashSize, flashMode, firmware = dlg.getData()
+            flashArgs = [
+                "-u",
+                "-m", "esptool",
+                "--chip", chip,
+                "--port", self.microPython.getCurrentPort(),
+                "read_flash",
+                "0x0", flashSize,
+                firmware,
+            ]
+            dlg = E5ProcessDialog(self.tr("'esptool read_flash' Output"),
+                                  self.tr("Backup Firmware"))
+            res = dlg.startProcess(sys.executable, flashArgs)
+            if res:
+                dlg.exec_()
+    
+    @pyqtSlot()
+    def __restoreFlash(self):
+        """
+        Private slot to restore a previously saved firmware.
+        """
+        from .EspBackupRestoreFirmwareDialog import (
+            EspBackupRestoreFirmwareDialog
+        )
+        dlg = EspBackupRestoreFirmwareDialog(backupMode=False)
+        if dlg.exec_() == QDialog.Accepted:
+            chip, flashSize, flashMode, firmware = dlg.getData()
+            flashArgs = [
+                "-u",
+                "-m", "esptool",
+                "--chip", chip,
+                "--port", self.microPython.getCurrentPort(),
+                "write_flash",
+                "--flash_mode", flashMode,
+            ]
+            if bool(flashSize):
+                flashArgs.extend([
+                    "--flash_size", flashSize,
+                ])
+            flashArgs.extend([
+                "0x0",
+                firmware,
+            ])
+            dlg = E5ProcessDialog(self.tr("'esptool write_flash' Output"),
+                                  self.tr("Restore Firmware"))
+            res = dlg.startProcess(sys.executable, flashArgs)
+            if res:
+                dlg.exec_()
+    
+    @pyqtSlot()
     def __showChipID(self):
         """
         Private slot to show the ID of the ESP chip.

eric ide

mercurial