diff --git a/src/main.py b/src/main.py index aa8969d..5ef2f56 100644 --- a/src/main.py +++ b/src/main.py @@ -29,14 +29,21 @@ def main(): wdt = machine.WDT(timeout=10000) wdt.feed() while True: - # patterns.tick() + # advance pattern based on its own returned schedule + # due = patterns.tick(due) wdt.feed() - host, msg = e.recv(0) - if msg: - try: - data = json.loads(msg) - print(data) + # 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) defaults = data.get("d", {}) bar = data.get(settings.get("name"), {}) @@ -44,18 +51,18 @@ def main(): patterns.delay = bar.get("delay", defaults.get("delay", patterns.delay)) colors = bar.get("colors", defaults.get("colors", patterns.colors)) patterns.colors = [tuple(int(color[i:i+2], 16) for i in settings.color_order) for color in colors] - # patterns.select(bar.get("pattern", defaults.get("pattern", "off"))) patterns.n1 = bar.get("n1", defaults.get("n1", patterns.n1)) patterns.n2 = bar.get("n2", defaults.get("n2", patterns.n2)) patterns.step = bar.get("pattern_step", defaults.get("step", patterns.step)) + selected_pattern = bar.get("pattern", defaults.get("pattern", "off")) if selected_pattern in patterns.patterns: + # Run the selected pattern ONCE in response to this message. Do not auto-tick elsewhere. patterns.patterns[selected_pattern]() else: print(f"Pattern {selected_pattern} not found") - - except: - print(f"Failed to load espnow data {msg}") + except Exception as ex: + print(f"Failed to load espnow data {last_msg}: {ex}") continue diff --git a/test/main.py b/test/main.py index efc95b8..a019b46 100644 --- a/test/main.py +++ b/test/main.py @@ -18,10 +18,6 @@ PATTERN_SUITE = [ {"pattern": "n_chase", "n1": 5, "n2": 5, "delay": 250, "iterations": 40, "repeat_delay": 120, "colors": ["#00ff88"]}, {"pattern": "alternating", "n1": 6, "n2": 6, "delay": 300, "iterations": 20, "repeat_delay": 300, "colors": ["#ff8800"]}, {"pattern": "pulse", "delay": 200, "iterations": 6, "repeat_delay": 300, "colors": ["#ffffff"]}, - # Specto sweep demo: increase n1 from 0 to 30 repeatedly - {"pattern": "specto", "delay": 80, "iterations": 32, "repeat_delay": 80, "colors": ["#00ff00"], "n1_sequence": list(range(0, 31)) + [30]}, - # Radiate demo: origins every 8 LEDs, moderate speed - {"pattern": "radiate", "delay": 60, "iterations": 6, "repeat_delay": 600, "colors": ["#ffffff"], "n1": 8}, ] @@ -74,9 +70,6 @@ async def run_suite(uri: str): interval_ms = int(cfg.get("interval_ms", cfg.get("delay", 100) or 100)) repeat_ms = int(cfg.get("repeat_delay", interval_ms)) for i in range(iterations): - # Optional per-iteration n1 for specto - seq = cfg.get("n1_sequence") - n1_val = (seq[i % len(seq)] if seq else cfg.get("n1")) msg = build_message( cfg.get("pattern", "off"), i, @@ -84,7 +77,7 @@ async def run_suite(uri: str): colors=cfg.get("colors"), brightness=cfg.get("brightness", 127), num_leds=cfg.get("num_leds"), - n1=n1_val, + n1=cfg.get("n1"), n2=cfg.get("n2"), name=cfg.get("name", "0"), pattern_step=cfg.get("pattern_step"),