From c1b0c41ef231529dac2d10229a1c99dcdbd9d584 Mon Sep 17 00:00:00 2001 From: Jimmy Date: Sun, 3 May 2026 15:07:16 +1200 Subject: [PATCH] fix(transport): disable UART ESP-NOW bridge by default Require serial_enabled true in settings to open serial_port; default false in set_defaults for Wi-Fi-only and dev machines. Co-authored-by: Cursor --- src/models/transport.py | 24 +++++++++++++++++++++++- src/settings.py | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/models/transport.py b/src/models/transport.py index 44a29e6..236bee6 100644 --- a/src/models/transport.py +++ b/src/models/transport.py @@ -33,6 +33,13 @@ async def _to_thread(func, *args): return await loop.run_in_executor(None, func, *args) +class NullSender: + """Used when no ESP-NOW UART bridge is configured or the port cannot be opened.""" + + async def send(self, data, addr=None): + return True + + class SerialSender: def __init__(self, port, baudrate, default_addr=None): import serial @@ -62,7 +69,22 @@ def get_current_sender(): def get_sender(settings): + # Serial ESP-NOW bridge is opt-in (serial_enabled true); default off for dev / Wi-Fi-only. + if not settings.get("serial_enabled"): + print("[startup] serial bridge disabled (set serial_enabled true in settings.json to enable)") + return NullSender() port = settings.get("serial_port", "/dev/ttyS0") + raw_port = str(port).strip() if port is not None else "" + if not raw_port or raw_port.lower() in ("none", "off"): + print("[startup] serial bridge disabled (empty serial_port)") + return NullSender() baudrate = settings.get("serial_baudrate", 912000) default_addr = settings.get("serial_destination_mac", "ffffffffffff") - return SerialSender(port, baudrate, default_addr=default_addr) + try: + return SerialSender(raw_port, baudrate, default_addr=default_addr) + except Exception as e: + print( + f"[startup] serial open failed ({raw_port!r}): {e}; " + "continuing without ESP-NOW bridge (Wi-Fi drivers unchanged)" + ) + return NullSender() diff --git a/src/settings.py b/src/settings.py index 00267bd..f7a74a9 100644 --- a/src/settings.py +++ b/src/settings.py @@ -57,6 +57,9 @@ class Settings(dict): # down (0 disables). Helps drivers that reconnect after seeing traffic on 8766. if 'wifi_driver_hello_interval_s' not in self: self['wifi_driver_hello_interval_s'] = 10.0 + # UART to ESP32 ESP-NOW bridge; default off (Wi-Fi drivers need no serial). + if 'serial_enabled' not in self: + self['serial_enabled'] = False def save(self): try: