diff --git a/src/python/adgui.py b/src/python/adgui.py
index d0d7e621..9a207d53 100755
--- a/src/python/adgui.py
+++ b/src/python/adgui.py
@@ -292,6 +292,7 @@ class adgui(QObject):
gsc = QGraphicsScene()
gsc.addPixmap(logo)
self.memories.avr.setScene(gsc)
+ self.memories.ee_avr.setScene(gsc)
self.adgui.show()
@@ -350,6 +351,12 @@ class adgui(QObject):
self.memories.erase.pressed.connect(self.chip_erase)
self.memories.clear.pressed.connect(self.clear_buffer)
self.memories.filename.editingFinished.connect(self.detect_flash_file)
+ self.memories.ee_choose.pressed.connect(self.ask_eeprom_file)
+ self.memories.ee_read.pressed.connect(self.eeprom_read)
+ self.memories.ee_program.pressed.connect(self.eeprom_write)
+ self.memories.ee_save.pressed.connect(self.eeprom_save)
+ self.memories.ee_load.pressed.connect(self.eeprom_load)
+ self.memories.ee_filename.editingFinished.connect(self.detect_eeprom_file)
self.load_settings()
self.buffer_empty = 'background-color: rgb(255,240,240);'
@@ -721,7 +728,7 @@ class adgui(QObject):
self.log("No data to write into 'flash' memory", ad.MSG_WARNING)
return
amnt = ad.avr_write_mem(self.pgm, self.dev, m, self.flash_size)
- self.log(f"Programmed {amnt} bytes")
+ self.log(f"Programmed {amnt} bytes")
def clear_buffer(self):
m = ad.avr_locate_mem(self.dev, 'flash')
@@ -767,7 +774,7 @@ class adgui(QObject):
fmt = ad.FMT_AUTO
elif self.memories.ffELF.isChecked():
fmt = ad.FMT_ELF
- if self.memories.ffIhex.isChecked():
+ elif self.memories.ffIhex.isChecked():
fmt = ad.FMT_IHEX
elif self.memories.ffSrec.isChecked():
fmt = ad.FMT_SREC
@@ -815,6 +822,129 @@ class adgui(QObject):
except Exception as e:
self.log(f"Cannot write log file: {str(e)}", ad.LOG_WXT_ERROR)
+ def ask_eeprom_file(self):
+ dlg = QFileDialog(caption = "Select file",
+ filter = "Load files (*.elf *.hex *.eep *.srec *.bin);; All Files (*)")
+ if dlg.exec():
+ self.memories.ee_filename.setText(dlg.selectedFiles()[0])
+ self.detect_eeprom_file()
+
+ def detect_eeprom_file(self):
+ # If file exists, try finding out real format. If file doesn't
+ # exist, try guessing the intended file format based on the
+ # suffix.
+ fname = self.memories.ee_filename.text()
+ if len(fname) > 0:
+ self.eepromname = fname
+ self.memories.ee_load.setEnabled(True)
+ self.memories.ee_save.setEnabled(True)
+ else:
+ # no filename, disable load/save buttons
+ self.eepromname = None
+ self.memories.ee_load.setEnabled(False)
+ self.memories.ee_save.setEnabled(False)
+ return
+ p = pathlib.Path(fname)
+ if p.is_file():
+ fmt = ad.fileio_fmt_autodetect(fname)
+ if fmt == ad.FMT_ELF:
+ self.memories.ee_ffELF.setChecked(True)
+ elif fmt == ad.FMT_IHEX:
+ self.memories.ee_ffIhex.setChecked(True)
+ elif fmt == ad.FMT_SREC:
+ self.memories.ee_ffSrec.setChecked(True)
+ else:
+ if fname.endswith('.hex') or fname.endswith('.ihex') \
+ or fname.endswith('.eep'): # common name for EEPROM Intel hex files
+ self.memories.ee_ffIhex.setChecked(True)
+ elif fname.endswith('.srec'):
+ self.memories.ee_ffSrec.setChecked(True)
+ elif fname.endswith('.bin'):
+ self.memories.ee_ffRbin.setChecked(True)
+
+ def eeprom_read(self):
+ self.adgui.progressBar.setEnabled(True)
+ m = ad.avr_locate_mem(self.dev, 'eeprom')
+ if not m:
+ self.log("Could not find 'eeprom' memory", ad.MSG_ERROR)
+ return
+ amnt = ad.avr_read_mem(self.pgm, self.dev, m)
+ self.eeprom_size = amnt
+ self.log(f"Read {amnt} bytes")
+ if amnt > 0:
+ self.memories.ee_buffer.setStyleSheet(self.buffer_full)
+
+ def eeprom_write(self):
+ self.adgui.progressBar.setEnabled(True)
+ m = ad.avr_locate_mem(self.dev, 'eeprom')
+ if not m:
+ self.log("Could not find 'eeprom' memory", ad.MSG_ERROR)
+ return
+ if self.eeprom_size == 0:
+ self.log("No data to write into 'eeprom' memory", ad.MSG_WARNING)
+ return
+ amnt = ad.avr_write_mem(self.pgm, self.dev, m, self.eeprom_size)
+ self.log(f"Programmed {amnt} bytes")
+
+ def clear_buffer(self):
+ m = ad.avr_locate_mem(self.dev, 'eeprom')
+ if not m:
+ self.log("Could not find 'eeprom' memory", ad.MSG_ERROR)
+ return
+ m.clear(m.size)
+ self.log(f"Cleared {m.size} bytes of buffer, and allocation flags")
+ self.eeprom_size = 0
+ self.memories.ee_buffer.setStyleSheet(self.buffer_empty)
+
+ def eeprom_save(self):
+ if self.memories.ee_ffAuto.isChecked() or \
+ self.memories.ee_ffELF.isChecked():
+ self.log("Auto or ELF are not valid for saving files", ad.MSG_ERROR)
+ return
+ if self.memories.ee_ffIhex.isChecked():
+ fmt = ad.FMT_IHEX
+ elif self.memories.ee_ffSrec.isChecked():
+ fmt = ad.FMT_SREC
+ elif self.memories.ee_ffRbin.isChecked():
+ fmt = ad.FMT_RBIN
+ else:
+ self.log("Internal error: cannot determine file format", ad.MSG_ERROR)
+ return
+ fname = self.eepromname
+ p = pathlib.Path(fname)
+ if p.is_file():
+ result = QMessageBox.question(self.memories,
+ f"Overwrite {fname}?",
+ f"Do you want to overwrite {fname}?")
+ if result != QMessageBox.StandardButton.Yes:
+ return
+ if self.eeprom_size != 0:
+ amnt = self.eeprom_size
+ else:
+ amnt = -1
+ amnt = ad.fileio(ad.FIO_WRITE, self.eepromname, fmt, self.dev, "eeprom", amnt)
+ self.log(f"Wrote {amnt} bytes to {self.eepromname}")
+
+ def eeprom_load(self):
+ if self.memories.ee_ffAuto.isChecked():
+ fmt = ad.FMT_AUTO
+ elif self.memories.ee_ffELF.isChecked():
+ fmt = ad.FMT_ELF
+ elif self.memories.ee_ffIhex.isChecked():
+ fmt = ad.FMT_IHEX
+ elif self.memories.ee_ffSrec.isChecked():
+ fmt = ad.FMT_SREC
+ elif self.memories.ee_ffRbin.isChecked():
+ fmt = ad.FMT_RBIN
+ else:
+ self.log("Internal error: cannot determine file format", ad.MSG_ERROR)
+ return
+ amnt = ad.fileio(ad.FIO_READ, self.eepromname, fmt, self.dev, "eeprom", -1)
+ self.log(f"Read {amnt} bytes from {self.eepromname}")
+ self.eeprom_size = amnt
+ if amnt > 0:
+ self.memories.ee_buffer.setStyleSheet(self.buffer_full)
+
def main():
gui = adgui(sys.argv)
diff --git a/src/python/memories.ui b/src/python/memories.ui
index 8fbd9e41..4e094066 100644
--- a/src/python/memories.ui
+++ b/src/python/memories.ui
@@ -418,7 +418,7 @@ color: rgb(180, 180, 180);
- Read devuce into buffer
+ Read device into buffer
Read →
@@ -481,6 +481,266 @@ color: rgb(180, 180, 180);
EEPROM
+
+
+
+ 560
+ 50
+ 101
+ 251
+
+
+
+ background-color: rgb(255,240,240);
+
+
+ QFrame::Box
+
+
+ QFrame::Raised
+
+
+ 2
+
+
+ Buffer
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 40
+ 30
+ 481
+ 191
+
+
+
+ File:
+
+
+
+ false
+
+
+
+ 370
+ 60
+ 83
+ 25
+
+
+
+ Load section from file into buffer
+
+
+ Load →
+
+
+
+
+ false
+
+
+
+ 370
+ 120
+ 83
+ 25
+
+
+
+ Save memory buffer to file
+
+
+ ← Save
+
+
+
+
+
+ 10
+ 80
+ 321
+ 91
+
+
+
+ Format:
+
+
+
+
+ 10
+ 30
+ 141
+ 23
+
+
+
+ Auto (load only)
+
+
+ true
+
+
+
+
+
+ 10
+ 50
+ 141
+ 23
+
+
+
+ ELF (load only)
+
+
+
+
+
+ 170
+ 20
+ 107
+ 23
+
+
+
+ Intel Hex
+
+
+
+
+
+ 170
+ 40
+ 141
+ 23
+
+
+
+ Motorola S-Record
+
+
+
+
+
+ 170
+ 60
+ 107
+ 23
+
+
+
+ Raw Binary
+
+
+
+
+
+
+ 10
+ 40
+ 271
+ 25
+
+
+
+
+
+
+ 290
+ 40
+ 41
+ 25
+
+
+
+ Choose filename for load or save
+
+
+ …
+
+
+
+
+
+
+ 570
+ 330
+ 83
+ 25
+
+
+
+ Clear buffer and "allocated" flags
+
+
+ Clear
+
+
+
+
+
+ 40
+ 230
+ 481
+ 141
+
+
+
+ Device:
+
+
+
+
+ 370
+ 50
+ 83
+ 25
+
+
+
+ Read device into buffer
+
+
+ Read →
+
+
+
+
+
+ 370
+ 90
+ 83
+ 25
+
+
+
+ Programm buffer into device
+
+
+ ← Program
+
+
+
+
+
+ 150
+ 30
+ 171
+ 101
+
+
+
+ false
+
+
+