#!/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")