chore(release): beta-1.03

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-10 16:13:59 +12:00
parent 170a0e05ab
commit 2a768376d0
6 changed files with 232 additions and 35 deletions

View File

@@ -8,8 +8,10 @@ import gc
from microdot import Microdot
from microdot.websocket import WebSocketError, with_websocket
from presets import Presets
from controller_messages import process_data
from hello import broadcast_hello_udp
from controller_messages import apply_startup_pattern, process_data
from runtime_state import RuntimeState
from background_tasks import udp_hello_loop_after_http_ready
from wifi_sta import connect_until_up
try:
import uos as os
except ImportError:
@@ -33,10 +35,7 @@ presets.b = settings.get("brightness", 255)
presets.debug = bool(settings.get("debug", False))
gc.collect()
default_preset = settings.get("default", "")
if default_preset and default_preset in presets.presets:
if not presets.select(default_preset):
print("Startup preset failed (invalid pattern?):", default_preset)
apply_startup_pattern(settings, presets)
# On ESP32-C3, soft reboots can leave Wi-Fi driver state allocated.
# Reset both interfaces and collect before bringing STA up.
@@ -49,11 +48,9 @@ utime.sleep_ms(100)
gc.collect()
sta_if.active(True)
sta_if.config(pm=network.WLAN.PM_NONE)
sta_if.connect(settings["ssid"], settings["password"])
while not sta_if.isconnected():
print("Waiting for network connection...")
utime.sleep(1)
wdt.feed()
_boot_ssid = settings.get("ssid") or ""
if _boot_ssid:
connect_until_up(sta_if, _boot_ssid, settings.get("password") or "", wdt)
def _print_network_ips(controller_ip=None):
@@ -68,6 +65,8 @@ def _print_network_ips(controller_ip=None):
_print_network_ips()
runtime_state = RuntimeState()
app = Microdot()
@@ -84,6 +83,7 @@ def _safe_pattern_filename(name):
@app.route("/ws")
@with_websocket
async def ws_handler(request, ws):
runtime_state.ws_connected()
controller_ip = None
try:
client_addr = getattr(request, "client_addr", None)
@@ -104,6 +104,8 @@ async def ws_handler(request, ws):
print("WS client disconnected:", e)
except OSError as e:
print("WS client dropped (OSError):", e)
finally:
runtime_state.ws_disconnected()
@app.post("/patterns/upload")
@@ -173,24 +175,11 @@ async def presets_loop():
await asyncio.sleep(0)
async def _udp_hello_after_http_ready():
"""Hello must run after the HTTP server binds, or discovery clients time out on /ws."""
await asyncio.sleep(1)
try:
broadcast_hello_udp(
sta_if,
settings.get("name", ""),
wait_reply=False,
wdt=wdt,
dual_destinations=True,
)
except Exception as ex:
print("UDP hello broadcast failed:", ex)
async def main(port=80):
asyncio.create_task(presets_loop())
asyncio.create_task(_udp_hello_after_http_ready())
asyncio.create_task(
udp_hello_loop_after_http_ready(sta_if, settings, wdt, runtime_state)
)
await app.start_server(host="0.0.0.0", port=port)