main: enforce event-driven behavior; run selected pattern once per message; clarify comments; fix pattern lookup
This commit is contained in:
27
src/main.py
27
src/main.py
@@ -29,14 +29,21 @@ def main():
|
|||||||
wdt = machine.WDT(timeout=10000)
|
wdt = machine.WDT(timeout=10000)
|
||||||
wdt.feed()
|
wdt.feed()
|
||||||
while True:
|
while True:
|
||||||
# patterns.tick()
|
# advance pattern based on its own returned schedule
|
||||||
|
# due = patterns.tick(due)
|
||||||
wdt.feed()
|
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", {})
|
defaults = data.get("d", {})
|
||||||
bar = data.get(settings.get("name"), {})
|
bar = data.get(settings.get("name"), {})
|
||||||
|
|
||||||
@@ -44,18 +51,18 @@ def main():
|
|||||||
patterns.delay = bar.get("delay", defaults.get("delay", patterns.delay))
|
patterns.delay = bar.get("delay", defaults.get("delay", patterns.delay))
|
||||||
colors = bar.get("colors", defaults.get("colors", patterns.colors))
|
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.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.n1 = bar.get("n1", defaults.get("n1", patterns.n1))
|
||||||
patterns.n2 = bar.get("n2", defaults.get("n2", patterns.n2))
|
patterns.n2 = bar.get("n2", defaults.get("n2", patterns.n2))
|
||||||
patterns.step = bar.get("pattern_step", defaults.get("step", patterns.step))
|
patterns.step = bar.get("pattern_step", defaults.get("step", patterns.step))
|
||||||
|
|
||||||
selected_pattern = bar.get("pattern", defaults.get("pattern", "off"))
|
selected_pattern = bar.get("pattern", defaults.get("pattern", "off"))
|
||||||
if selected_pattern in patterns.patterns:
|
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]()
|
patterns.patterns[selected_pattern]()
|
||||||
else:
|
else:
|
||||||
print(f"Pattern {selected_pattern} not found")
|
print(f"Pattern {selected_pattern} not found")
|
||||||
|
except Exception as ex:
|
||||||
except:
|
print(f"Failed to load espnow data {last_msg}: {ex}")
|
||||||
print(f"Failed to load espnow data {msg}")
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
@@ -18,10 +18,6 @@ PATTERN_SUITE = [
|
|||||||
{"pattern": "n_chase", "n1": 5, "n2": 5, "delay": 250, "iterations": 40, "repeat_delay": 120, "colors": ["#00ff88"]},
|
{"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": "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"]},
|
{"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))
|
interval_ms = int(cfg.get("interval_ms", cfg.get("delay", 100) or 100))
|
||||||
repeat_ms = int(cfg.get("repeat_delay", interval_ms))
|
repeat_ms = int(cfg.get("repeat_delay", interval_ms))
|
||||||
for i in range(iterations):
|
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(
|
msg = build_message(
|
||||||
cfg.get("pattern", "off"),
|
cfg.get("pattern", "off"),
|
||||||
i,
|
i,
|
||||||
@@ -84,7 +77,7 @@ async def run_suite(uri: str):
|
|||||||
colors=cfg.get("colors"),
|
colors=cfg.get("colors"),
|
||||||
brightness=cfg.get("brightness", 127),
|
brightness=cfg.get("brightness", 127),
|
||||||
num_leds=cfg.get("num_leds"),
|
num_leds=cfg.get("num_leds"),
|
||||||
n1=n1_val,
|
n1=cfg.get("n1"),
|
||||||
n2=cfg.get("n2"),
|
n2=cfg.get("n2"),
|
||||||
name=cfg.get("name", "0"),
|
name=cfg.get("name", "0"),
|
||||||
pattern_step=cfg.get("pattern_step"),
|
pattern_step=cfg.get("pattern_step"),
|
||||||
|
Reference in New Issue
Block a user