Files
lighting-controller/debug_led_bar.py
Pi User e4a83e8f0d Add segmented_movement pattern with n4 parameter support
- Add n4 parameter to control server, LED bar receiver, and test script
- Create segmented_movement pattern with alternating forward/backward movement
- Pattern supports n1 (segment length), n2 (spacing), n3 (forward speed), n4 (backward speed)
- Fix test script to send all messages instead of just the first one
- Add segmented_movement to patterns_needing_params for proper parameter transmission
- Pattern intelligently handles all cases: alternating, forward-only, backward-only, or static
- Implements repeating segments with configurable spacing across LED strip
2025-10-03 19:54:43 +13:00

138 lines
4.8 KiB
Python

#!/usr/bin/env python3
"""
Enhanced LED bar debugging script.
Adds timestamp and message sequence debugging to LED bar main.py
"""
debug_main_content = '''
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)
wdt = machine.WDT(timeout=10000)
wdt.feed()
# Debug counters
msg_count = 0
last_msg_time = 0
gap_count = 0
print(f"[DEBUG] Bar '{settings.get('name', 'unknown')}' starting ESP NOW debug mode")
print(f"[DEBUG] Expected message types: 'b' (beat), 'u' (update)")
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
msg_received = False
while True:
host, msg = e.recv(0)
if not msg:
break
last_msg = msg
msg_received = True
if last_msg:
msg_count += 1
current_time = time.ticks_ms()
# Calculate gap between messages
if last_msg_time > 0:
gap = time.ticks_diff(current_time, last_msg_time)
if gap > 1000: # > 1 second gap
gap_count += 1
print(f"[DEBUG] Message gap detected: {gap}ms (gap #{gap_count})")
last_msg_time = current_time
try:
data = json.loads(last_msg)
msg_type = data.get("d", {}).get("t", "unknown")
timestamp = time.strftime("%H:%M:%S")
print(f"[{timestamp}] MSG#{msg_count}: type='{msg_type}' gap={time.ticks_diff(current_time, last_msg_time) if last_msg_time > 0 else 0}ms")
# Full data print for debugging
print(f"[DEBUG] Full message: {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.step = bar.get("s", defaults.get("s", 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:
print(f"[DEBUG] Executing pattern: {selected_pattern}")
patterns.patterns[selected_pattern]()
else:
print(f"[DEBUG] Pattern '{selected_pattern}' not found")
elif message_type == "u": # Update message
print(f"[DEBUG] Parameters updated: brightness={patterns.brightness}, delay={patterns.delay}")
else:
print(f"[DEBUG] Unknown message type: '{message_type}'")
except Exception as ex:
print(f"[DEBUG] Failed to load espnow data {last_msg}: {ex}")
continue
# Periodic status every 100 loops (about every 10 seconds)
if msg_count > 0 and msg_count % 100 == 0:
print(f"[STATUS] Processed {msg_count} messages, {gap_count} gaps detected")
main()
'''
if __name__ == "__main__":
print("Enhanced LED bar debugging output generated.")
print("This script would replace the main.py with enhanced debugging.")
print("The debug version adds:")
print("- Timestamped messages")
print("- Message sequence numbers")
print("- Gap detection between messages")
print("- Detailed pattern execution logging")
print("- Status summaries")