Skip to content

Commit 2c134ef

Browse files
committed
Remember settings by writing a file in the user dir, fixes #5
1 parent 1c12a9c commit 2c134ef

File tree

1 file changed

+63
-22
lines changed

1 file changed

+63
-22
lines changed

Main.py

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import wx
44
import wx.lib.inspection
55
import wx.lib.mixins.inspection
6-
import sys
6+
import sys, os
77
import esptool
88
import threading
9+
import json
910
import images as images
1011
from serial.tools import list_ports
1112
from esptool import ESPROM
@@ -85,6 +86,28 @@ def __init__(self):
8586
self.firmware_path = None
8687
self.port = None
8788

89+
@classmethod
90+
def load(cls, file_path):
91+
conf = cls()
92+
if os.path.exists(file_path):
93+
with open(file_path, 'r') as f:
94+
data = json.load(f)
95+
conf.port = data['port']
96+
conf.baud = data['baud']
97+
conf.mode = data['mode']
98+
conf.erase_before_flash = data['erase']
99+
return conf
100+
101+
def safe(self, file_path):
102+
data = {
103+
'port': self.port,
104+
'baud': self.baud,
105+
'mode': self.mode,
106+
'erase': self.erase_before_flash,
107+
}
108+
with open(file_path, 'w') as f:
109+
json.dump(data, f)
110+
88111
def is_complete(self):
89112
return self.firmware_path is not None and self.port is not None
90113

@@ -97,7 +120,7 @@ class NodeMcuFlasher(wx.Frame):
97120
def __init__(self, parent, title):
98121
wx.Frame.__init__(self, parent, -1, title, size=(700, 650),
99122
style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
100-
self._config = FlashConfig()
123+
self._config = FlashConfig.load(self._get_config_file_path())
101124

102125
self._build_status_bar()
103126
self._set_icons()
@@ -152,6 +175,7 @@ def on_pick_file(event):
152175

153176
self.choice = wx.Choice(panel, choices=self._get_serial_ports())
154177
self.choice.Bind(wx.EVT_CHOICE, on_select_port)
178+
self._select_configured_port()
155179
bmp = images.Reload.GetBitmap()
156180
reload_button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
157181
size=(bmp.GetWidth() + 7, bmp.GetHeight() + 7))
@@ -181,28 +205,33 @@ def add_baud_radio_button(sizer, idx, rate):
181205
add_baud_radio_button(baud_boxsizer, idx, rate)
182206

183207
flashmode_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
184-
qio_button = wx.RadioButton(panel, name="mode-qio", label="Quad Flash I/O (qio)", style=wx.RB_GROUP)
185-
qio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
186-
qio_button.mode = "qio"
187-
qio_button.SetValue(True)
188-
dio_button = wx.RadioButton(panel, name="mode-dio", label="Dual Flash I/O (dio), usually for >=4MB flash chips")
189-
dio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
190-
dio_button.mode = "dio"
191-
flashmode_boxsizer.Add(qio_button)
192-
flashmode_boxsizer.AddSpacer(10)
193-
flashmode_boxsizer.Add(dio_button)
208+
209+
def add_flash_mode_radio_button(sizer, idx, mode, label):
210+
style = wx.RB_GROUP if idx == 0 else 0
211+
radio_button = wx.RadioButton(panel, name="mode-%s" % mode, label="%s" % label, style=style)
212+
radio_button.Bind(wx.EVT_RADIOBUTTON, on_mode_changed)
213+
radio_button.mode = mode
214+
radio_button.SetValue(mode == self._config.mode)
215+
sizer.Add(radio_button)
216+
sizer.AddSpacer(10)
217+
218+
add_flash_mode_radio_button(flashmode_boxsizer, 0, "qio", "Quad Flash I/O (qio)")
219+
add_flash_mode_radio_button(flashmode_boxsizer, 1, "dio", "Dual Flash I/O (dio), usually for >=4MB flash chips")
194220

195221
erase_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
196-
erase_no_button = wx.RadioButton(panel, name="erase-no", label="no", style=wx.RB_GROUP)
197-
erase_no_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
198-
erase_no_button.erase = False
199-
erase_no_button.SetValue(True)
200-
erase_yes_button = wx.RadioButton(panel, name="erase-yes", label="yes, wipes all data")
201-
erase_yes_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
202-
erase_yes_button.erase = True
203-
erase_boxsizer.Add(erase_no_button)
204-
erase_boxsizer.AddSpacer(10)
205-
erase_boxsizer.Add(erase_yes_button)
222+
223+
def add_erase_radio_button(sizer, idx, erase_before_flash, label, value):
224+
style = wx.RB_GROUP if idx == 0 else 0
225+
radio_button = wx.RadioButton(panel, name="erase-%s" % erase_before_flash, label="%s" % label, style=style)
226+
radio_button.Bind(wx.EVT_RADIOBUTTON, on_erase_changed)
227+
radio_button.erase = erase_before_flash
228+
radio_button.SetValue(value)
229+
sizer.Add(radio_button)
230+
sizer.AddSpacer(10)
231+
232+
erase = self._config.erase_before_flash
233+
add_erase_radio_button(erase_boxsizer, 0, False, "no", erase is False)
234+
add_erase_radio_button(erase_boxsizer, 1, True, "yes, wipes all data", erase is True)
206235

207236
button = wx.Button(panel, -1, "Flash NodeMCU")
208237
button.Bind(wx.EVT_BUTTON, on_clicked)
@@ -233,6 +262,14 @@ def add_baud_radio_button(sizer, idx, rate):
233262
hbox.Add(fgs, proportion=2, flag=wx.ALL | wx.EXPAND, border=15)
234263
panel.SetSizer(hbox)
235264

265+
def _select_configured_port(self):
266+
count = 0
267+
for item in self.choice.GetItems():
268+
if item == self._config.port:
269+
self.choice.Select(count)
270+
break
271+
count += 1
272+
236273
def _get_serial_ports(self):
237274
ports = [""]
238275
for port, desc, hwid in sorted(list_ports.comports()):
@@ -267,8 +304,12 @@ def _build_menu_bar(self):
267304

268305
self.SetMenuBar(self.menuBar)
269306

307+
def _get_config_file_path(self):
308+
return wx.StandardPaths.Get().GetUserConfigDir() + "/nodemcu-pyflasher.json"
309+
270310
# Menu methods
271311
def _on_exit_app(self, event):
312+
self._config.safe(self._get_config_file_path())
272313
self.Close(True)
273314

274315
def _on_help_about(self, event):

0 commit comments

Comments
 (0)