import patterns from settings import Settings from web import web from patterns import Patterns import gc import utime import machine import time import wifi import json from p2p import p2p import espnow import network def main(): settings = Settings() print(settings) if settings.get("color_order", "rgb") == "rbg": color_order = (1, 5, 3) else: color_order = (1, 3, 5) patterns = Patterns(settings["led_pin"], settings["num_leds"], selected="off") sta_if = network.WLAN(network.STA_IF) sta_if.active(True) e = espnow.ESPNow() e.config(rxbuf=1024) e.active(True) # Increase buffer size for 8-bar payloads (default 526 bytes might be too small) # Set to 1KB to handle larger multi-bar payloads wdt = machine.WDT(timeout=10000) wdt.feed() while True: # advance pattern based on its own returned schedule # due = patterns.tick(due) wdt.feed() # Drain all pending packets and only process the latest last_msg = None while True: host, msg = e.recv(0) if not msg: break last_msg = msg if last_msg: try: data = json.loads(last_msg) print(data) defaults = data.get("d", {}) bar = data.get(settings.get("name"), {}) # Check message type message_type = defaults.get("t", "b") # Default to beat if not specified # Always update parameters from message patterns.brightness = bar.get("br", defaults.get("br", patterns.brightness)) patterns.delay = bar.get("dl", defaults.get("dl", patterns.delay)) patterns.colors = bar.get("cl", defaults.get("cl", patterns.colors)) patterns.n1 = bar.get("n1", defaults.get("n1", patterns.n1)) patterns.n2 = bar.get("n2", defaults.get("n2", patterns.n2)) patterns.n3 = bar.get("n3", defaults.get("n3", patterns.n3)) patterns.n4 = bar.get("n4", defaults.get("n4", patterns.n4)) patterns.step = bar.get("s", defaults.get("s", patterns.step)) # Print received parameters print(f"Params: br={patterns.brightness}, dl={patterns.delay}, n1={patterns.n1}, n2={patterns.n2}, n3={patterns.n3}, n4={patterns.n4}, step={patterns.step}") # Only execute pattern if it's a beat message if message_type == "b": # Beat message selected_pattern = bar.get("pt", defaults.get("pt", "off")) if selected_pattern in patterns.patterns: # Run the selected pattern ONCE in response to this beat message patterns.patterns[selected_pattern]() else: print(f"Pattern {selected_pattern} not found") elif message_type == "u": # Update message # Just update parameters, don't execute pattern print(f"Parameters updated: brightness={patterns.brightness}, delay={patterns.delay}") else: print(f"Unknown message type: {message_type}") except Exception as ex: print(f"Failed to load espnow data {last_msg}: {ex}") continue main()