2026-01-27 13:16:20 -05:00
|
|
|
"""
|
|
|
|
|
Pre-upload script that sends FLASH command to device before firmware upload.
|
|
|
|
|
|
|
|
|
|
This allows the firmware to display "Flashing firmware..." on the e-ink display
|
|
|
|
|
before the actual flash begins. The e-ink retains this message throughout the
|
|
|
|
|
flash process since it doesn't require power to maintain the display.
|
|
|
|
|
|
2026-01-30 22:00:15 -05:00
|
|
|
Protocol (Plan A - Simple timing):
|
|
|
|
|
1. Host opens serial port and sends "FLASH:version"
|
|
|
|
|
2. Host keeps port open briefly for device to receive and process
|
|
|
|
|
3. Device displays flash screen when it receives the command
|
|
|
|
|
4. Host proceeds with flash
|
2026-01-27 13:16:20 -05:00
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
Import("env")
|
|
|
|
|
import serial
|
|
|
|
|
import time
|
|
|
|
|
from version_utils import get_version
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def before_upload(source, target, env):
|
2026-01-30 22:00:15 -05:00
|
|
|
"""Send FLASH command to device before uploading firmware."""
|
2026-01-27 13:16:20 -05:00
|
|
|
port = env.GetProjectOption("upload_port", None)
|
|
|
|
|
|
|
|
|
|
if not port:
|
|
|
|
|
import serial.tools.list_ports
|
|
|
|
|
|
|
|
|
|
# Look for common ESP32-C3 USB serial port patterns
|
|
|
|
|
ports = [
|
|
|
|
|
p.device
|
|
|
|
|
for p in serial.tools.list_ports.comports()
|
|
|
|
|
if "usbmodem" in p.device.lower() or "ttyacm" in p.device.lower()
|
|
|
|
|
]
|
|
|
|
|
port = ports[0] if ports else None
|
|
|
|
|
|
2026-01-30 22:00:15 -05:00
|
|
|
if not port:
|
2026-01-27 13:16:20 -05:00
|
|
|
print("[pre_flash] No serial port found, skipping notification")
|
2026-01-30 22:00:15 -05:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
version = get_version(env)
|
|
|
|
|
ser = serial.Serial(port, 115200, timeout=1)
|
|
|
|
|
ser.write(f"FLASH:{version}\n".encode())
|
|
|
|
|
ser.flush()
|
|
|
|
|
time.sleep(4.0) # Keep port open for device to receive and complete full refresh (~2-3s)
|
|
|
|
|
ser.close()
|
|
|
|
|
print(f"[pre_flash] Flash notification sent to {port} (version {version})")
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"[pre_flash] Notification skipped: {e}")
|
2026-01-27 13:16:20 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
env.AddPreAction("upload", before_upload)
|