91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
|
|
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()
|