From ec39df00fca9a951e9c166418bf6478d7ed8f595 Mon Sep 17 00:00:00 2001 From: pi Date: Thu, 26 Mar 2026 00:40:21 +1300 Subject: [PATCH] feat(settings/espnow): validate wifi_channel and wire into firmware --- esp32/main.py | 8 +++++++- led-driver | 2 +- src/controllers/settings.py | 15 ++++++++++++++- src/settings.py | 3 +++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/esp32/main.py b/esp32/main.py index 8e43d92..8126444 100644 --- a/esp32/main.py +++ b/esp32/main.py @@ -8,8 +8,14 @@ import time UART_BAUD = 912000 BROADCAST = b"\xff\xff\xff\xff\xff\xff" MAX_PEERS = 20 +# Match led-driver / controller default settings wifi_channel (1–11) +WIFI_CHANNEL = 6 + +sta = network.WLAN(network.STA_IF) +sta.active(True) +sta.config(pm=network.WLAN.PM_NONE, channel=WIFI_CHANNEL) +print("WiFi STA channel:", sta.config("channel"), "(WIFI_CHANNEL=%s)" % WIFI_CHANNEL) -network.WLAN(network.STA_IF).active(True) esp = espnow.ESPNow() esp.active(True) esp.add_peer(BROADCAST) diff --git a/led-driver b/led-driver index fb53f90..c42dff8 160000 --- a/led-driver +++ b/led-driver @@ -1 +1 @@ -Subproject commit fb53f900fbcd6731431c890774cdda2dc57ea736 +Subproject commit c42dff8975bc4c16d0a07ef5116dd21e4826c00f diff --git a/src/controllers/settings.py b/src/controllers/settings.py index 8f05ed0..02795eb 100644 --- a/src/controllers/settings.py +++ b/src/controllers/settings.py @@ -55,15 +55,28 @@ async def configure_ap(request): except Exception as e: return json.dumps({"error": str(e)}), 500 +def _validate_wifi_channel(value): + """Return int 1–11 or raise ValueError.""" + ch = int(value) + if ch < 1 or ch > 11: + raise ValueError("wifi_channel must be between 1 and 11") + return ch + + @controller.put('/settings') async def update_settings(request): """Update general settings.""" try: data = request.json for key, value in data.items(): - settings[key] = value + if key == 'wifi_channel' and value is not None: + settings[key] = _validate_wifi_channel(value) + else: + settings[key] = value settings.save() return json.dumps({"message": "Settings updated successfully"}), 200, {'Content-Type': 'application/json'} + except ValueError as e: + return json.dumps({"error": str(e)}), 400 except Exception as e: return json.dumps({"error": str(e)}), 500 diff --git a/src/settings.py b/src/settings.py index 9d9f9cc..89127d6 100644 --- a/src/settings.py +++ b/src/settings.py @@ -45,6 +45,9 @@ class Settings(dict): self['session_secret_key'] = self.generate_secret_key() # Save immediately when generating a new key self.save() + # ESP-NOW STA channel (2.4 GHz) for LED drivers / bridge alignment; 1–11 + if 'wifi_channel' not in self: + self['wifi_channel'] = 6 def save(self): try: