Remember settings by writing a file in the user dir, fixes #5

This commit is contained in:
Marcel Stör 2017-02-28 22:25:58 +01:00
parent 1c12a9cffa
commit 2c134ef03f

85
Main.py
View File

@ -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):