mirror of
https://github.com/marcelstoer/nodemcu-pyflasher.git
synced 2025-07-24 19:56:38 +00:00
Remember settings by writing a file in the user dir, fixes #5
This commit is contained in:
parent
1c12a9cffa
commit
2c134ef03f
85
Main.py
85
Main.py
@ -3,9 +3,10 @@
|
|||||||
import wx
|
import wx
|
||||||
import wx.lib.inspection
|
import wx.lib.inspection
|
||||||
import wx.lib.mixins.inspection
|
import wx.lib.mixins.inspection
|
||||||
import sys
|
import sys, os
|
||||||
import esptool
|
import esptool
|
||||||
import threading
|
import threading
|
||||||
|
import json
|
||||||
import images as images
|
import images as images
|
||||||
from serial.tools import list_ports
|
from serial.tools import list_ports
|
||||||
from esptool import ESPROM
|
from esptool import ESPROM
|
||||||
@ -85,6 +86,28 @@ class FlashConfig:
|
|||||||
self.firmware_path = None
|
self.firmware_path = None
|
||||||
self.port = None
|
self.port = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load(cls, file_path):
|
||||||
|
conf = cls()
|
||||||
|
if os.path.exists(file_path):
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
conf.port = data['port']
|
||||||
|
conf.baud = data['baud']
|
||||||
|
conf.mode = data['mode']
|
||||||
|
conf.erase_before_flash = data['erase']
|
||||||
|
return conf
|
||||||
|
|
||||||
|
def safe(self, file_path):
|
||||||
|
data = {
|
||||||
|
'port': self.port,
|
||||||
|
'baud': self.baud,
|
||||||
|
'mode': self.mode,
|
||||||
|
'erase': self.erase_before_flash,
|
||||||
|
}
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(data, f)
|
||||||
|
|
||||||
def is_complete(self):
|
def is_complete(self):
|
||||||
return self.firmware_path is not None and self.port is not None
|
return self.firmware_path is not None and self.port is not None
|
||||||
|
|
||||||
@ -97,7 +120,7 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
def __init__(self, parent, title):
|
def __init__(self, parent, title):
|
||||||
wx.Frame.__init__(self, parent, -1, title, size=(700, 650),
|
wx.Frame.__init__(self, parent, -1, title, size=(700, 650),
|
||||||
style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
|
style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
|
||||||
self._config = FlashConfig()
|
self._config = FlashConfig.load(self._get_config_file_path())
|
||||||
|
|
||||||
self._build_status_bar()
|
self._build_status_bar()
|
||||||
self._set_icons()
|
self._set_icons()
|
||||||
@ -152,6 +175,7 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
|
|
||||||
self.choice = wx.Choice(panel, choices=self._get_serial_ports())
|
self.choice = wx.Choice(panel, choices=self._get_serial_ports())
|
||||||
self.choice.Bind(wx.EVT_CHOICE, on_select_port)
|
self.choice.Bind(wx.EVT_CHOICE, on_select_port)
|
||||||
|
self._select_configured_port()
|
||||||
bmp = images.Reload.GetBitmap()
|
bmp = images.Reload.GetBitmap()
|
||||||
reload_button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
|
reload_button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
|
||||||
size=(bmp.GetWidth() + 7, bmp.GetHeight() + 7))
|
size=(bmp.GetWidth() + 7, bmp.GetHeight() + 7))
|
||||||
@ -181,28 +205,33 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
add_baud_radio_button(baud_boxsizer, idx, rate)
|
add_baud_radio_button(baud_boxsizer, idx, rate)
|
||||||
|
|
||||||
flashmode_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
flashmode_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
qio_button = wx.RadioButton(panel, name="mode-qio", label="Quad Flash I/O (qio)", style=wx.RB_GROUP)
|
|
||||||
qio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
|
def add_flash_mode_radio_button(sizer, idx, mode, label):
|
||||||
qio_button.mode = "qio"
|
style = wx.RB_GROUP if idx == 0 else 0
|
||||||
qio_button.SetValue(True)
|
radio_button = wx.RadioButton(panel, name="mode-%s" % mode, label="%s" % label, style=style)
|
||||||
dio_button = wx.RadioButton(panel, name="mode-dio", label="Dual Flash I/O (dio), usually for >=4MB flash chips")
|
radio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
|
||||||
dio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
|
radio_button.mode = mode
|
||||||
dio_button.mode = "dio"
|
radio_button.SetValue(mode == self._config.mode)
|
||||||
flashmode_boxsizer.Add(qio_button)
|
sizer.Add(radio_button)
|
||||||
flashmode_boxsizer.AddSpacer(10)
|
sizer.AddSpacer(10)
|
||||||
flashmode_boxsizer.Add(dio_button)
|
|
||||||
|
add_flash_mode_radio_button(flashmode_boxsizer, 0, "qio", "Quad Flash I/O (qio)")
|
||||||
|
add_flash_mode_radio_button(flashmode_boxsizer, 1, "dio", "Dual Flash I/O (dio), usually for >=4MB flash chips")
|
||||||
|
|
||||||
erase_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
erase_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
erase_no_button = wx.RadioButton(panel, name="erase-no", label="no", style=wx.RB_GROUP)
|
|
||||||
erase_no_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
|
def add_erase_radio_button(sizer, idx, erase_before_flash, label, value):
|
||||||
erase_no_button.erase = False
|
style = wx.RB_GROUP if idx == 0 else 0
|
||||||
erase_no_button.SetValue(True)
|
radio_button = wx.RadioButton(panel, name="erase-%s" % erase_before_flash, label="%s" % label, style=style)
|
||||||
erase_yes_button = wx.RadioButton(panel, name="erase-yes", label="yes, wipes all data")
|
radio_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
|
||||||
erase_yes_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
|
radio_button.erase = erase_before_flash
|
||||||
erase_yes_button.erase = True
|
radio_button.SetValue(value)
|
||||||
erase_boxsizer.Add(erase_no_button)
|
sizer.Add(radio_button)
|
||||||
erase_boxsizer.AddSpacer(10)
|
sizer.AddSpacer(10)
|
||||||
erase_boxsizer.Add(erase_yes_button)
|
|
||||||
|
erase = self._config.erase_before_flash
|
||||||
|
add_erase_radio_button(erase_boxsizer, 0, False, "no", erase is False)
|
||||||
|
add_erase_radio_button(erase_boxsizer, 1, True, "yes, wipes all data", erase is True)
|
||||||
|
|
||||||
button = wx.Button(panel, -1, "Flash NodeMCU")
|
button = wx.Button(panel, -1, "Flash NodeMCU")
|
||||||
button.Bind(wx.EVT_BUTTON, on_clicked)
|
button.Bind(wx.EVT_BUTTON, on_clicked)
|
||||||
@ -233,6 +262,14 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
hbox.Add(fgs, proportion=2, flag=wx.ALL | wx.EXPAND, border=15)
|
hbox.Add(fgs, proportion=2, flag=wx.ALL | wx.EXPAND, border=15)
|
||||||
panel.SetSizer(hbox)
|
panel.SetSizer(hbox)
|
||||||
|
|
||||||
|
def _select_configured_port(self):
|
||||||
|
count = 0
|
||||||
|
for item in self.choice.GetItems():
|
||||||
|
if item == self._config.port:
|
||||||
|
self.choice.Select(count)
|
||||||
|
break
|
||||||
|
count += 1
|
||||||
|
|
||||||
def _get_serial_ports(self):
|
def _get_serial_ports(self):
|
||||||
ports = [""]
|
ports = [""]
|
||||||
for port, desc, hwid in sorted(list_ports.comports()):
|
for port, desc, hwid in sorted(list_ports.comports()):
|
||||||
@ -267,8 +304,12 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
|
|
||||||
self.SetMenuBar(self.menuBar)
|
self.SetMenuBar(self.menuBar)
|
||||||
|
|
||||||
|
def _get_config_file_path(self):
|
||||||
|
return wx.StandardPaths.Get().GetUserConfigDir() + "/nodemcu-pyflasher.json"
|
||||||
|
|
||||||
# Menu methods
|
# Menu methods
|
||||||
def _on_exit_app(self, event):
|
def _on_exit_app(self, event):
|
||||||
|
self._config.safe(self._get_config_file_path())
|
||||||
self.Close(True)
|
self.Close(True)
|
||||||
|
|
||||||
def _on_help_about(self, event):
|
def _on_help_about(self, event):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user