Skip to content

Commit db84ce5

Browse files
committed
Add flash mode 'dout'
Fixes #20
1 parent 4d73e11 commit db84ce5

File tree

5 files changed

+158
-4
lines changed

5 files changed

+158
-4
lines changed

HtmlPopupTransientWindow.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
# coding=utf-8
3+
4+
import wx
5+
import wx.html
6+
import webbrowser
7+
8+
9+
class HtmlPopupTransientWindow(wx.PopupTransientWindow):
10+
def __init__(self, parent, style, html_body_content, bgcolor, size):
11+
wx.PopupTransientWindow.__init__(self, parent, style)
12+
panel = wx.Panel(self)
13+
panel.SetBackgroundColour(bgcolor)
14+
15+
html_window = self.HtmlWindow(panel, wx.ID_ANY, size=size)
16+
html_window.SetPage('<body bgcolor="' + bgcolor + '">' + html_body_content + '</body>')
17+
18+
sizer = wx.BoxSizer(wx.VERTICAL)
19+
sizer.Add(html_window, 0, wx.ALL, 5)
20+
panel.SetSizer(sizer)
21+
22+
sizer.Fit(panel)
23+
sizer.Fit(self)
24+
self.Layout()
25+
26+
class HtmlWindow(wx.html.HtmlWindow):
27+
def OnLinkClicked(self, link):
28+
# get a hold of the PopupTransientWindow to close it
29+
self.GetParent().GetParent().Dismiss()
30+
webbrowser.open(link.GetHref())

Main.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@
1515
from argparse import Namespace
1616

1717
__version__ = "2.1"
18+
__flash_help__ = '''
19+
<p>This setting is highly dependent on your device!<p>
20+
<p>
21+
Details at <a style="color: #004CE5;"
22+
href="https://www.esp32.com/viewtopic.php?p=5523&sid=08ef44e13610ecf2a2a33bb173b0fd5c#p5523">http://bit.ly/2v5Rd32</a>
23+
and in the <a style="color: #004CE5;" href="https://github.com/espressif/esptool/#flash-modes">esptool
24+
documentation</a>
25+
<ul>
26+
<li>Most ESP32 and ESP8266 ESP-12 use 'dio'.</li>
27+
<li>Most ESP8266 ESP-01/07 use 'qio'.</li>
28+
<li>ESP8285 requires 'dout'.</li>
29+
</ul>
30+
</p>
31+
'''
1832
__supported_baud_rates__ = [9600, 57600, 74880, 115200, 230400, 460800, 921600]
1933

2034
# ---------------------------------------------------------------------------
@@ -95,7 +109,7 @@ class FlashConfig:
95109
def __init__(self):
96110
self.baud = 115200
97111
self.erase_before_flash = False
98-
self.mode = "qio"
112+
self.mode = "dio"
99113
self.firmware_path = None
100114
self.port = None
101115

@@ -193,6 +207,7 @@ def on_pick_file(event):
193207
reload_button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
194208
size=(bmp.GetWidth() + 7, bmp.GetHeight() + 7))
195209
reload_button.Bind(wx.EVT_BUTTON, on_reload)
210+
reload_button.SetToolTipString("Reload serial device list")
196211

197212
file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_USE_TEXTCTRL)
198213
file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, on_pick_file)
@@ -228,8 +243,9 @@ def add_flash_mode_radio_button(sizer, idx, mode, label):
228243
sizer.Add(radio_button)
229244
sizer.AddSpacer(10)
230245

231-
add_flash_mode_radio_button(flashmode_boxsizer, 0, "qio", "Quad Flash I/O (qio)")
232-
add_flash_mode_radio_button(flashmode_boxsizer, 1, "dio", "Dual Flash I/O (dio), usually for >=4MB flash chips")
246+
add_flash_mode_radio_button(flashmode_boxsizer, 0, "qio", "Quad I/O (qio)")
247+
add_flash_mode_radio_button(flashmode_boxsizer, 1, "dio", "Dual I/O (dio)")
248+
add_flash_mode_radio_button(flashmode_boxsizer, 2, "dout", "Dual Output (dout)")
233249

234250
erase_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
235251

@@ -259,14 +275,34 @@ def add_erase_radio_button(sizer, idx, erase_before_flash, label, value):
259275
file_label = wx.StaticText(panel, label="NodeMCU firmware")
260276
baud_label = wx.StaticText(panel, label="Baud rate")
261277
flashmode_label = wx.StaticText(panel, label="Flash mode")
278+
279+
def on_info_hover(event):
280+
from HtmlPopupTransientWindow import HtmlPopupTransientWindow
281+
win = HtmlPopupTransientWindow(self, wx.SIMPLE_BORDER, __flash_help__, "#FFB6C1", (410, 140))
282+
283+
image = event.GetEventObject()
284+
image_position = image.ClientToScreen((0, 0))
285+
image_size = image.GetSize()
286+
win.Position(image_position, (0, image_size[1]))
287+
288+
win.Popup()
289+
290+
icon = wx.StaticBitmap(panel, wx.ID_ANY, images.Info.GetBitmap())
291+
icon.Bind(wx.EVT_MOTION, on_info_hover)
292+
293+
flashmode_label_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
294+
flashmode_label_boxsizer.Add(flashmode_label, 1, wx.EXPAND)
295+
flashmode_label_boxsizer.AddStretchSpacer(0)
296+
flashmode_label_boxsizer.Add(icon, 0, wx.ALIGN_RIGHT, 20)
297+
262298
erase_label = wx.StaticText(panel, label="Erase flash")
263299
console_label = wx.StaticText(panel, label="Console")
264300

265301
fgs.AddMany([
266302
port_label, (serial_boxsizer, 1, wx.EXPAND),
267303
file_label, (file_picker, 1, wx.EXPAND),
268304
baud_label, baud_boxsizer,
269-
flashmode_label, flashmode_boxsizer,
305+
flashmode_label_boxsizer, flashmode_boxsizer,
270306
erase_label, erase_boxsizer,
271307
(wx.StaticText(panel, label="")), (button, 1, wx.EXPAND),
272308
(console_label, 1, wx.EXPAND), (self.console_ctrl, 1, wx.EXPAND)])

encode-bitmaps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"-F -n Exit images/exit.png images.py",
1111
"-a -F -n Reload images/reload.png images.py",
1212
"-a -F -n Splash images/splash.png images.py",
13+
"-a -F -n Info images/info.png images.py",
1314
"-a -F -i -n Icon images/icon-256.png images.py",
1415
]
1516

images.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7606,6 +7606,93 @@
76067606
"OuPbk3NlUi8yrl/3VYFP7sMlU31aO8jWC1dyUeDftTTrOv6coEp+yK7/QzFrnT7WTSOBiWd8"
76077607
"DzjhI4F6KouFx5ME0tQbgfvfmHIzmcf7eP0AAAAASUVORK5CYII=")
76087608

7609+
#----------------------------------------------------------------------
7610+
Info = PyEmbeddedImage(
7611+
"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAMFmlDQ1BJQ0MgUHJvZmlsZQAA"
7612+
"SImVVwdYU8kWnltSCEkogQhICb0J0qv0XgSkg42QBAglQkJQsaOLCq4FFRGs6CqIomsBZK1Y"
7613+
"sLAIWLA/UFFZWRcLNlTepICur33vfN/c+e+Zc878Z+65880AoGTDzs3NRpUByBHkC6ODfFmJ"
7614+
"ScksUi/AARGggArobI4o1ycqKhxAGe3/Lu9uAUTSX7eSxPrX8f8qKlyeiAMAEgVxKlfEyYH4"
7615+
"KAC4BidXmA8AoQ3qDWfn50rwIMRqQkgQACIuwekyrCHBqTI8QWoTG+0HsTcAZCqbLUwHgC7h"
7616+
"zSrgpMM4dAlHGwGXL4B4C8SenAw2F+L7EE/IyZkFsRIZYrPU7+Kk/y1m6lhMNjt9DMtykQrZ"
7617+
"ny/KzWbP/T+X439LTrZ4dA4D2KgZwuBoSc5w3WqyZoVJMBXiE4LUiEiIVSG+xOdK7SX4boY4"
7618+
"OE5uP8AR+cE1A0wAPzWX7R8GsTbETHFWnI8c27GFUl9oj0bw80Ni5ThVOCtaHh8tEGRHhMvj"
7619+
"rMjghYzibTxRQMyoTRo/MARiWGno0cKM2AQZT/R8AT8+AmI6xB2irJgwue/Dwgy/iFEboTha"
7620+
"wtkI4rdpwsBomQ2mkSMazQuz5rClc8FawLzzM2KDZb5YIk+UGD7KgcvzD5BxwLg8QZycGwar"
7621+
"yzda7lucmx0lt8e28bKDomXrjB0SFcSM+nblwwKTrQP2KJMdGiWf611uflSsjBuOgnDgB/wB"
7622+
"C4hhSwWzQCbgtw80DsA32UggYAMhSAc8YCXXjHokSEcE8BkDCsGfEPGAaMzPVzrKAwVQ/2VM"
7623+
"K3tagTTpaIHUIws8hTgH18I9cXc8HD69YbPDXXDXUT+W0uisxACiPzGYGEg0H+PBgayzYRMC"
7624+
"/r/RhcGeB7OTcBGM5vAtHuEpoZPwiHCT0EO4A+LBE2kUudVMfpHwB+YsMBn0wGiB8uxSv88O"
7625+
"N4GsHXFf3APyh9xxJq4FrHAHmIkP7gVzc4Ta7xmKx7h9W8sf55Ow/j4fuZ5uQXeUs0gd+zJ+"
7626+
"Y1Y/RvH7bo24sA/70RJbgR3BWrGz2GXsBNYIWNhprAlrw05K8FglPJFWwuhs0VJuWTAOf9TG"
7627+
"ps6m3+bzD3Oz5fNL1kuUz5uTL/kZ/GblzhXy0zPyWT5wN+axQgQc6wksOxtbZwAke7ts63jD"
7628+
"lO7ZCPPKN13eGQBcS6Ay/ZuObQjA8acAMN590xm+huW+FoCTHRyxsECmk2zHgAAoQAn+FZpA"
7629+
"FxgCM5iPHXAC7sAbBIBQEAliQRKYAVc8A+RAzrPBfLAEFINSsBZsBJVgO9gFasABcBg0ghPg"
7630+
"LLgIroIOcBPcg3XRB16AQfAODCMIQkJoCAPRRPQQY8QSsUNcEE8kAAlHopEkJAVJRwSIGJmP"
7631+
"LEVKkTKkEtmJ1CK/IseRs8hlpBO5g/Qi/chr5BOKoVRUDdVBTdCJqAvqg4ahseh0NB3NQwvR"
7632+
"ZehqtAKtRvejDehZ9Cp6E+1BX6BDGMAUMSamj1lhLpgfFoklY2mYEFuIlWDlWDVWjzXD73wd"
7633+
"68EGsI84EWfgLNwK1mYwHodz8Dx8Ib4Kr8Rr8Ab8PH4d78UH8a8EGkGbYElwI4QQEgnphNmE"
7634+
"YkI5YQ/hGOEC/G/6CO+IRCKTaEp0hv9lEjGTOI+4iriVeJB4hthJfEwcIpFImiRLkgcpksQm"
7635+
"5ZOKSZtJ+0mnSV2kPtIHsiJZj2xHDiQnkwXkInI5eR/5FLmL/Iw8rKCsYKzgphCpwFWYq7BG"
7636+
"YbdCs8I1hT6FYYoKxZTiQYmlZFKWUCoo9ZQLlPuUN4qKigaKropTFPmKixUrFA8pXlLsVfxI"
7637+
"VaVaUP2o06hi6mrqXuoZ6h3qGxqNZkLzpiXT8mmrabW0c7SHtA90Bt2aHkLn0hfRq+gN9C76"
7638+
"SyUFJWMlH6UZSoVK5UpHlK4pDSgrKJso+ymzlRcqVykfV+5WHlJhqNiqRKrkqKxS2adyWeW5"
7639+
"KknVRDVAlau6THWX6jnVxwyMYcjwY3AYSxm7GRcYfWpENVO1ELVMtVK1A2rtaoPqquoO6vHq"
7640+
"c9Sr1E+q9zAxpgkzhJnNXMM8zLzF/DROZ5zPON64lePqx3WNe68xXsNbg6dRonFQ46bGJ02W"
7641+
"ZoBmluY6zUbNB1q4loXWFK3ZWtu0LmgNjFcb7z6eM75k/OHxd7VRbQvtaO152ru027SHdHR1"
7642+
"gnRydTbrnNMZ0GXqeutm6m7QPaXbr8fQ89Tj623QO633B0ud5cPKZlWwzrMG9bX1g/XF+jv1"
7643+
"2/WHDUwN4gyKDA4aPDCkGLoYphluMGwxHDTSM5psNN+ozuiusYKxi3GG8SbjVuP3JqYmCSbL"
7644+
"TRpNnptqmIaYFprWmd43o5l5meWZVZvdMCeau5hnmW8177BALRwtMiyqLK5ZopZOlnzLrZad"
7645+
"EwgTXCcIJlRP6LaiWvlYFVjVWfVaM63DrYusG61fTjSamDxx3cTWiV9tHG2ybXbb3LNVtQ21"
7646+
"LbJttn1tZ2HHsauyu2FPsw+0X2TfZP/KwdKB57DN4bYjw3Gy43LHFscvTs5OQqd6p35nI+cU"
7647+
"5y3O3S5qLlEuq1wuuRJcfV0XuZ5w/ejm5JbvdtjtL3cr9yz3fe7PJ5lO4k3aPemxh4EH22On"
7648+
"R48nyzPFc4dnj5e+F9ur2uuRt6E313uP9zMfc59Mn/0+L31tfIW+x3zf+7n5LfA744/5B/mX"
7649+
"+LcHqAbEBVQGPAw0CEwPrAscDHIMmhd0JpgQHBa8Lrg7RCeEE1IbMhjqHLog9HwYNSwmrDLs"
7650+
"UbhFuDC8eTI6OXTy+sn3I4wjBBGNkSAyJHJ95IMo06i8qN+mEKdETama8jTaNnp+dGsMI2Zm"
7651+
"zL6Yd7G+sWti78WZxYnjWuKV4qfF18a/T/BPKEvoSZyYuCDxapJWEj+pKZmUHJ+8J3loasDU"
7652+
"jVP7pjlOK552a7rp9DnTL8/QmpE94+RMpZnsmUdSCCkJKftSPrMj2dXsodSQ1C2pgxw/zibO"
7653+
"C643dwO3n+fBK+M9S/NIK0t7nu6Rvj69P8MrozxjgO/Hr+S/ygzO3J75Pisya2/WSHZC9sEc"
7654+
"ck5KznGBqiBLcH6W7qw5szpzLXOLc3vy3PI25g0Kw4R7RIhouqgpXw0ec9rEZuKfxL0FngVV"
7655+
"BR9mx88+MkdljmBO21yLuSvnPisMLPxlHj6PM69lvv78JfN7F/gs2LkQWZi6sGWR4aJli/oW"
7656+
"By2uWUJZkrXk9yKborKit0sTljYv01m2eNnjn4J+qiumFwuLu5e7L9++Al/BX9G+0n7l5pVf"
7657+
"S7glV0ptSstLP6/irLrys+3PFT+PrE5b3b7Gac22tcS1grW31nmtqylTKSsse7x+8vqGDawN"
7658+
"JRvebpy58XK5Q/n2TZRN4k09FeEVTZuNNq/d/Lkyo/JmlW/VwS3aW1Zueb+Vu7Vrm/e2+u06"
7659+
"20u3f9rB33F7Z9DOhmqT6vJdxF0Fu57ujt/d+ovLL7V7tPaU7vmyV7C3pya65nytc23tPu19"
7660+
"a+rQOnFd//5p+zsO+B9oqreq33mQebD0EDgkPvTHrym/3jocdrjliMuR+qPGR7ccYxwraUAa"
7661+
"5jYMNmY09jQlNXUeDz3e0uzefOw369/2ntA/UXVS/eSaU5RTy06NnC48PXQm98zA2fSzj1tm"
7662+
"ttw7l3juxvkp59svhF24dDHw4rlWn9bTlzwunbjsdvn4FZcrjVedrja0ObYd+93x92PtTu0N"
7663+
"15yvNXW4djR3Tuo81eXVdfa6//WLN0JuXL0ZcbPzVtyt293Tuntuc28/v5N959XdgrvD9xbf"
7664+
"J9wveaD8oPyh9sPqf5j/42CPU8/JXv/etkcxj+495jx+8UT05HPfsqe0p+XP9J7VPrd7fqI/"
7665+
"sL/jj6l/9L3IfTE8UPynyp9bXpq9PPqX919tg4mDfa+Er0Zer3qj+WbvW4e3LUNRQw/f5bwb"
7666+
"fl/yQfNDzUeXj62fEj49G579mfS54ov5l+avYV/vj+SMjOSyhWzpUQCDDU1LA+D1XgBoSfDs"
7667+
"0AEAhS67e0kFkd0XpQj8Jyy7n0nFCYC93gDELQYgHJ5RtsFmDDEV9pKjd6w3QO3tx5pcRGn2"
7668+
"drJYVHiDIXwYGXmjAwCpGYAvwpGR4a0jI192Q7J3ADiTJ7vzSYQIz/c7JPdJ0NatDH6UfwI5"
7669+
"m2viYAPWEQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdVpVFh0WE1MOmNvbS5hZG9iZS54bXAA"
7670+
"AAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBD"
7671+
"b3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8x"
7672+
"OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6"
7673+
"YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90"
7674+
"aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4xPC90aWZmOkNvbXByZXNz"
7675+
"aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgog"
7676+
"ICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9t"
7677+
"ZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRm"
7678+
"OlJERj4KPC94OnhtcG1ldGE+CgLYgAUAAAM2SURBVDgRTVNNaBtHFP5mdle2JFvIazsiiWMj"
7679+
"G2KcprekuMQBhbbk4uJTpEMPgVwKLQ7kGApucushIZe2h97TUgUaCiEtKL5E9Bw3OAmuhUMc"
7680+
"2LYrGUn1alfen3l9oyTggWFm3sz73nvffA84NOjSJePQUW+HeWYO2+jGDXn4LN4dtLO4dy/5"
7681+
"DMh9df58OXv69MfDk5PT0jBk4HmO5ziP1123ulqrOQQIEEEIQQOAd85/AGdnL1/+bnJh4axh"
7682+
"24BSQCoFjIwAvg9nZ6ex3eutlW7f/kkHJiIhqhy5zJG188KVKw/H5ucnQiDRt/LMGQgN0miQ"
7683+
"HB0VIpUy93Z2sBlFX5bW1r7nTKTUzqucdnF5+duxI0cm/E7nIGo2DWVZplkqmfLcOTMJAiva"
7684+
"2zPj/f1o/OhRFIm++fXu3QucvjJ1Kp8X5ypjtv2B1+kmMI0U4yJ++hT9+/chuFbqdCByOSTd"
7685+
"riUzmWg6lxt1HecaZ1kfAAwXJj+ykgRhP1AUhoYsFpGqVCDiGNTvg9JpULcLwWuklGFx0HwY"
7686+
"Lv5Yr58yPwTSJtFMzCQlpik0q8p1ofb3kb54EcTA/safQLvN1DP9USyUFJRSys4GwSnzfbap"
7687+
"OJaq14Pi1IVm/PlzHHDqQ0tLEGxTgT/4BTHMsjBCwWJRNDRkSClH5Q98FRI58DxQEJDilQGB"
7688+
"iQnNMZhpEJ8Tbecg5PuUdDriwLJC5HLNgapC2358oB/4vlRhiGRrC3Gj8UYHnEny6hWo1YJi"
7689+
"PkS/ryIG6BYKLo4dezYAeLmy8vNePr891O0aanc3EsvLGLl5EzKbBbOOzPXroPl5qHab6PVr"
7690+
"1Zmagjc7+/DTEye2ZZWrWlldddxS6ev28eMwGw2L2Y/iZlN5tRp5jx5R7LrEtkSur8d+Pm/t"
7691+
"Li7+FU1P3+HqBkMMtM3b+q1bX7yoVP5rptP0N5fOU/3DqvxXf4xt08urV6lerW7VNjaWtKcW"
7692+
"65te0JrmxtDG3x88uGBvbl7LtlqLpueNcceY0fh42Juacr25ud/UzMydT06efFGtVo1yuZwM"
7693+
"AN6iCd1ebFAMbf7y5Ml7ac9b4C8biTOZVlIoPNM1v30r+SU3CfA/ZNahIBhUgOQAAAAASUVO"
7694+
"RK5CYII=")
7695+
76097696
#----------------------------------------------------------------------
76107697
Icon = PyEmbeddedImage(
76117698
"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAACBjSFJN"

images/info.png

4.38 KB
Loading

0 commit comments

Comments
 (0)