#!/usr/bin/env python3 import utime from machine import WDT from settings import Settings from patterns import Patterns def run_for(p, wdt, duration_ms): """Run pattern for specified duration.""" start = utime.ticks_ms() while utime.ticks_diff(utime.ticks_ms(), start) < duration_ms: wdt.feed() p.tick() utime.sleep_ms(10) def main(): s = Settings() pin = s.get("led_pin", 10) num = s.get("num_leds", 30) p = Patterns(pin=pin, num_leds=num) wdt = WDT(timeout=10000) print("=" * 50) print("Testing Auto and Manual Modes") print("=" * 50) # Test 1: Rainbow in AUTO mode (continuous) print("\nTest 1: Rainbow pattern in AUTO mode (should run continuously)") p.edit("rainbow_auto", { "pattern": "rainbow", "brightness": 128, "delay": 50, "n1": 2, "auto": True }) p.select("rainbow_auto") print("Running rainbow_auto for 3 seconds...") run_for(p, wdt, 3000) print("✓ Auto mode: Pattern ran continuously") # Test 2: Rainbow in MANUAL mode (one step per tick) print("\nTest 2: Rainbow pattern in MANUAL mode (one step per tick)") p.edit("rainbow_manual", { "pattern": "rainbow", "brightness": 128, "delay": 50, "n1": 2, "auto": False }) p.select("rainbow_manual") print("Calling tick() 5 times (should advance 5 steps)...") for i in range(5): p.tick() utime.sleep_ms(100) # Small delay to see changes print(f" Tick {i+1}: generator={'active' if p.generator is not None else 'stopped'}") # Check if generator stopped after one cycle if p.generator is None: print("✓ Manual mode: Generator stopped after one step (as expected)") else: print("⚠ Manual mode: Generator still active (may need multiple ticks)") # Test 3: Pulse in AUTO mode (continuous cycles) print("\nTest 3: Pulse pattern in AUTO mode (should pulse continuously)") p.edit("pulse_auto", { "pattern": "pulse", "brightness": 128, "delay": 100, "n1": 500, # Attack "n2": 200, # Hold "n3": 500, # Decay "colors": [(255, 0, 0)], "auto": True }) p.select("pulse_auto") print("Running pulse_auto for 3 seconds...") run_for(p, wdt, 3000) print("✓ Auto mode: Pulse ran continuously") # Test 4: Pulse in MANUAL mode (one cycle then stop) print("\nTest 4: Pulse pattern in MANUAL mode (one cycle then stop)") p.edit("pulse_manual", { "pattern": "pulse", "brightness": 128, "delay": 100, "n1": 300, # Attack "n2": 200, # Hold "n3": 300, # Decay "colors": [(0, 255, 0)], "auto": False }) p.select("pulse_manual") print("Running pulse_manual until generator stops...") tick_count = 0 max_ticks = 200 # Safety limit while p.generator is not None and tick_count < max_ticks: p.tick() tick_count += 1 utime.sleep_ms(10) if p.generator is None: print(f"✓ Manual mode: Pulse completed one cycle after {tick_count} ticks") else: print(f"⚠ Manual mode: Pulse still running after {tick_count} ticks") # Test 5: Transition in AUTO mode (continuous transitions) print("\nTest 5: Transition pattern in AUTO mode (continuous transitions)") p.edit("transition_auto", { "pattern": "transition", "brightness": 128, "delay": 500, "colors": [(255, 0, 0), (0, 255, 0), (0, 0, 255)], "auto": True }) p.select("transition_auto") print("Running transition_auto for 3 seconds...") run_for(p, wdt, 3000) print("✓ Auto mode: Transition ran continuously") # Test 6: Transition in MANUAL mode (one transition then stop) print("\nTest 6: Transition pattern in MANUAL mode (one transition then stop)") p.edit("transition_manual", { "pattern": "transition", "brightness": 128, "delay": 500, "colors": [(255, 0, 0), (0, 255, 0)], "auto": False }) p.select("transition_manual") print("Running transition_manual until generator stops...") tick_count = 0 max_ticks = 200 while p.generator is not None and tick_count < max_ticks: p.tick() tick_count += 1 utime.sleep_ms(10) if p.generator is None: print(f"✓ Manual mode: Transition completed after {tick_count} ticks") else: print(f"⚠ Manual mode: Transition still running after {tick_count} ticks") # Test 7: Switching between auto and manual modes print("\nTest 7: Switching between auto and manual modes") p.edit("switch_test", { "pattern": "rainbow", "brightness": 128, "delay": 50, "n1": 2, "auto": True }) p.select("switch_test") print("Running in auto mode for 1 second...") run_for(p, wdt, 1000) # Switch to manual mode by editing the preset print("Switching to manual mode...") p.edit("switch_test", {"auto": False}) p.select("switch_test") # Re-select to apply changes print("Calling tick() 3 times in manual mode...") for i in range(3): p.tick() utime.sleep_ms(100) print(f" Tick {i+1}: generator={'active' if p.generator is not None else 'stopped'}") # Switch back to auto mode print("Switching back to auto mode...") p.edit("switch_test", {"auto": True}) p.select("switch_test") print("Running in auto mode for 1 second...") run_for(p, wdt, 1000) print("✓ Successfully switched between auto and manual modes") # Cleanup print("\nCleaning up...") p.edit("cleanup_off", {"pattern": "off"}) p.select("cleanup_off") p.tick() utime.sleep_ms(100) print("\n" + "=" * 50) print("All tests completed!") print("=" * 50) if __name__ == "__main__": main()