adding web flasher tool
This commit is contained in:
@@ -20,84 +20,150 @@ class ESP32FlasherGUI:
|
||||
self.root = root
|
||||
self.root.title("ESP32 Firmware Flasher")
|
||||
self.root.geometry("600x500")
|
||||
|
||||
|
||||
# Configure colors for dark mode compatibility
|
||||
self.setup_colors()
|
||||
|
||||
# Variables
|
||||
self.port_var = tk.StringVar()
|
||||
self.firmware_path_var = tk.StringVar()
|
||||
self.temp_dir = None
|
||||
|
||||
|
||||
self.setup_ui()
|
||||
self.refresh_ports()
|
||||
|
||||
def setup_colors(self):
|
||||
"""Configure colors that work in both light and dark mode"""
|
||||
# Try to detect dark mode on macOS
|
||||
try:
|
||||
import subprocess
|
||||
result = subprocess.run(
|
||||
['defaults', 'read', '-g', 'AppleInterfaceStyle'],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
is_dark_mode = (result.returncode == 0 and 'Dark' in result.stdout)
|
||||
except:
|
||||
is_dark_mode = False
|
||||
|
||||
if is_dark_mode:
|
||||
# Dark mode colors
|
||||
self.bg_color = '#2b2b2b'
|
||||
self.fg_color = '#ffffff'
|
||||
self.text_bg = '#1e1e1e'
|
||||
self.text_fg = '#d4d4d4'
|
||||
self.button_bg = '#3c3c3c'
|
||||
else:
|
||||
# Light mode colors
|
||||
self.bg_color = '#f0f0f0'
|
||||
self.fg_color = '#000000'
|
||||
self.text_bg = '#ffffff'
|
||||
self.text_fg = '#000000'
|
||||
self.button_bg = '#e0e0e0'
|
||||
|
||||
# Configure root window
|
||||
self.root.configure(bg=self.bg_color)
|
||||
|
||||
def setup_ui(self):
|
||||
# Main frame
|
||||
main_frame = ttk.Frame(self.root, padding="10")
|
||||
main_frame = tk.Frame(self.root, bg=self.bg_color, padx=10, pady=10)
|
||||
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
|
||||
|
||||
|
||||
# Configure grid weights
|
||||
self.root.columnconfigure(0, weight=1)
|
||||
self.root.rowconfigure(0, weight=1)
|
||||
main_frame.columnconfigure(1, weight=1)
|
||||
|
||||
|
||||
# Port selection
|
||||
ttk.Label(main_frame, text="Serial Port:").grid(row=0, column=0, sticky=tk.W, pady=5)
|
||||
port_frame = ttk.Frame(main_frame)
|
||||
tk.Label(main_frame, text="Serial Port:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=0, column=0, sticky=tk.W, pady=5)
|
||||
port_frame = tk.Frame(main_frame, bg=self.bg_color)
|
||||
port_frame.grid(row=0, column=1, sticky=(tk.W, tk.E), pady=5)
|
||||
port_frame.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
self.port_combo = ttk.Combobox(port_frame, textvariable=self.port_var, state="readonly")
|
||||
self.port_combo.grid(row=0, column=0, sticky=(tk.W, tk.E), padx=(0, 5))
|
||||
|
||||
ttk.Button(port_frame, text="Refresh", command=self.refresh_ports).grid(row=0, column=1)
|
||||
|
||||
tk.Button(port_frame, text="Refresh", command=self.refresh_ports,
|
||||
bg=self.button_bg, fg=self.fg_color, relief=tk.RAISED).grid(row=0, column=1)
|
||||
|
||||
# Firmware package selection
|
||||
ttk.Label(main_frame, text="Firmware Package:").grid(row=1, column=0, sticky=tk.W, pady=5)
|
||||
firmware_frame = ttk.Frame(main_frame)
|
||||
tk.Label(main_frame, text="Firmware Package:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=1, column=0, sticky=tk.W, pady=5)
|
||||
firmware_frame = tk.Frame(main_frame, bg=self.bg_color)
|
||||
firmware_frame.grid(row=1, column=1, sticky=(tk.W, tk.E), pady=5)
|
||||
firmware_frame.columnconfigure(0, weight=1)
|
||||
|
||||
self.firmware_entry = ttk.Entry(firmware_frame, textvariable=self.firmware_path_var, state="readonly")
|
||||
|
||||
self.firmware_entry = tk.Entry(firmware_frame, textvariable=self.firmware_path_var,
|
||||
state="readonly", bg=self.text_bg, fg=self.text_fg,
|
||||
relief=tk.SUNKEN, borderwidth=2)
|
||||
self.firmware_entry.grid(row=0, column=0, sticky=(tk.W, tk.E), padx=(0, 5))
|
||||
|
||||
ttk.Button(firmware_frame, text="Browse", command=self.browse_firmware).grid(row=0, column=1)
|
||||
|
||||
tk.Button(firmware_frame, text="Browse", command=self.browse_firmware,
|
||||
bg=self.button_bg, fg=self.fg_color, relief=tk.RAISED).grid(row=0, column=1)
|
||||
|
||||
# Flash settings frame
|
||||
settings_frame = ttk.LabelFrame(main_frame, text="Flash Settings", padding="5")
|
||||
settings_frame = tk.LabelFrame(main_frame, text="Flash Settings",
|
||||
bg=self.bg_color, fg=self.fg_color,
|
||||
relief=tk.GROOVE, borderwidth=2, padx=5, pady=5)
|
||||
settings_frame.grid(row=2, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=10)
|
||||
settings_frame.columnconfigure(1, weight=1)
|
||||
|
||||
|
||||
# Flash settings
|
||||
ttk.Label(settings_frame, text="Chip:").grid(row=0, column=0, sticky=tk.W, pady=2)
|
||||
tk.Label(settings_frame, text="Chip:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=0, column=0, sticky=tk.W, pady=2, padx=(0, 10))
|
||||
self.chip_var = tk.StringVar(value="esp32")
|
||||
ttk.Entry(settings_frame, textvariable=self.chip_var, width=15).grid(row=0, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
ttk.Label(settings_frame, text="Baud Rate:").grid(row=1, column=0, sticky=tk.W, pady=2)
|
||||
tk.Entry(settings_frame, textvariable=self.chip_var, width=15,
|
||||
bg=self.text_bg, fg=self.text_fg, relief=tk.SUNKEN).grid(row=0, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
tk.Label(settings_frame, text="Baud Rate:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=1, column=0, sticky=tk.W, pady=2, padx=(0, 10))
|
||||
self.baud_var = tk.StringVar(value="460800")
|
||||
ttk.Entry(settings_frame, textvariable=self.baud_var, width=15).grid(row=1, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
ttk.Label(settings_frame, text="Flash Mode:").grid(row=2, column=0, sticky=tk.W, pady=2)
|
||||
tk.Entry(settings_frame, textvariable=self.baud_var, width=15,
|
||||
bg=self.text_bg, fg=self.text_fg, relief=tk.SUNKEN).grid(row=1, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
tk.Label(settings_frame, text="Flash Mode:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=2, column=0, sticky=tk.W, pady=2, padx=(0, 10))
|
||||
self.flash_mode_var = tk.StringVar(value="dio")
|
||||
ttk.Entry(settings_frame, textvariable=self.flash_mode_var, width=15).grid(row=2, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
ttk.Label(settings_frame, text="Flash Freq:").grid(row=3, column=0, sticky=tk.W, pady=2)
|
||||
tk.Entry(settings_frame, textvariable=self.flash_mode_var, width=15,
|
||||
bg=self.text_bg, fg=self.text_fg, relief=tk.SUNKEN).grid(row=2, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
tk.Label(settings_frame, text="Flash Freq:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=3, column=0, sticky=tk.W, pady=2, padx=(0, 10))
|
||||
self.flash_freq_var = tk.StringVar(value="40m")
|
||||
ttk.Entry(settings_frame, textvariable=self.flash_freq_var, width=15).grid(row=3, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
ttk.Label(settings_frame, text="Flash Size:").grid(row=4, column=0, sticky=tk.W, pady=2)
|
||||
tk.Entry(settings_frame, textvariable=self.flash_freq_var, width=15,
|
||||
bg=self.text_bg, fg=self.text_fg, relief=tk.SUNKEN).grid(row=3, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
tk.Label(settings_frame, text="Flash Size:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=4, column=0, sticky=tk.W, pady=2, padx=(0, 10))
|
||||
self.flash_size_var = tk.StringVar(value="2MB")
|
||||
ttk.Entry(settings_frame, textvariable=self.flash_size_var, width=15).grid(row=4, column=1, sticky=tk.W, pady=2)
|
||||
tk.Entry(settings_frame, textvariable=self.flash_size_var, width=15,
|
||||
bg=self.text_bg, fg=self.text_fg, relief=tk.SUNKEN).grid(row=4, column=1, sticky=tk.W, pady=2)
|
||||
|
||||
# Flash button
|
||||
self.flash_button = ttk.Button(main_frame, text="Flash Firmware", command=self.flash_firmware)
|
||||
self.flash_button = tk.Button(main_frame, text="Flash Firmware", command=self.flash_firmware,
|
||||
bg=self.button_bg, fg=self.fg_color,
|
||||
relief=tk.RAISED, padx=20, pady=5,
|
||||
font=('TkDefaultFont', 10, 'bold'))
|
||||
self.flash_button.grid(row=3, column=0, columnspan=2, pady=10)
|
||||
|
||||
|
||||
# Progress bar
|
||||
self.progress = ttk.Progressbar(main_frame, mode='indeterminate')
|
||||
self.progress.grid(row=4, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
|
||||
|
||||
|
||||
# Log output
|
||||
ttk.Label(main_frame, text="Output:").grid(row=5, column=0, sticky=tk.W, pady=(10, 0))
|
||||
self.log_text = scrolledtext.ScrolledText(main_frame, height=15, width=70)
|
||||
tk.Label(main_frame, text="Output:", bg=self.bg_color, fg=self.fg_color).grid(
|
||||
row=5, column=0, sticky=tk.W, pady=(10, 0))
|
||||
self.log_text = scrolledtext.ScrolledText(
|
||||
main_frame,
|
||||
height=15,
|
||||
width=70,
|
||||
bg=self.text_bg,
|
||||
fg=self.text_fg,
|
||||
insertbackground=self.text_fg, # Cursor color
|
||||
relief=tk.SUNKEN,
|
||||
borderwidth=2
|
||||
)
|
||||
self.log_text.grid(row=6, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5)
|
||||
main_frame.rowconfigure(6, weight=1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user