--- 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.