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
This commit is contained in:
137
debug_led_bar.py
Normal file
137
debug_led_bar.py
Normal file
@@ -0,0 +1,137 @@
|
||||
#!/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")
|
Reference in New Issue
Block a user