3
3
import wx
4
4
import wx .lib .inspection
5
5
import wx .lib .mixins .inspection
6
- import sys
6
+ import sys , os
7
7
import esptool
8
8
import threading
9
+ import json
9
10
import images as images
10
11
from serial .tools import list_ports
11
12
from esptool import ESPROM
@@ -85,6 +86,28 @@ def __init__(self):
85
86
self .firmware_path = None
86
87
self .port = None
87
88
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
+
88
111
def is_complete (self ):
89
112
return self .firmware_path is not None and self .port is not None
90
113
@@ -97,7 +120,7 @@ class NodeMcuFlasher(wx.Frame):
97
120
def __init__ (self , parent , title ):
98
121
wx .Frame .__init__ (self , parent , - 1 , title , size = (700 , 650 ),
99
122
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 () )
101
124
102
125
self ._build_status_bar ()
103
126
self ._set_icons ()
@@ -152,6 +175,7 @@ def on_pick_file(event):
152
175
153
176
self .choice = wx .Choice (panel , choices = self ._get_serial_ports ())
154
177
self .choice .Bind (wx .EVT_CHOICE , on_select_port )
178
+ self ._select_configured_port ()
155
179
bmp = images .Reload .GetBitmap ()
156
180
reload_button = wx .BitmapButton (panel , id = wx .ID_ANY , bitmap = bmp ,
157
181
size = (bmp .GetWidth () + 7 , bmp .GetHeight () + 7 ))
@@ -181,28 +205,33 @@ def add_baud_radio_button(sizer, idx, rate):
181
205
add_baud_radio_button (baud_boxsizer , idx , rate )
182
206
183
207
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" )
194
220
195
221
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 )
206
235
207
236
button = wx .Button (panel , - 1 , "Flash NodeMCU" )
208
237
button .Bind (wx .EVT_BUTTON , on_clicked )
@@ -233,6 +262,14 @@ def add_baud_radio_button(sizer, idx, rate):
233
262
hbox .Add (fgs , proportion = 2 , flag = wx .ALL | wx .EXPAND , border = 15 )
234
263
panel .SetSizer (hbox )
235
264
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
+
236
273
def _get_serial_ports (self ):
237
274
ports = ["" ]
238
275
for port , desc , hwid in sorted (list_ports .comports ()):
@@ -267,8 +304,12 @@ def _build_menu_bar(self):
267
304
268
305
self .SetMenuBar (self .menuBar )
269
306
307
+ def _get_config_file_path (self ):
308
+ return wx .StandardPaths .Get ().GetUserConfigDir () + "/nodemcu-pyflasher.json"
309
+
270
310
# Menu methods
271
311
def _on_exit_app (self , event ):
312
+ self ._config .safe (self ._get_config_file_path ())
272
313
self .Close (True )
273
314
274
315
def _on_help_about (self , event ):
0 commit comments