diff --git a/test/patterns/rainbow.py b/test/patterns/rainbow.py new file mode 100644 index 0000000..20661b6 --- /dev/null +++ b/test/patterns/rainbow.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +import uasyncio as asyncio +import utime +from machine import WDT +from settings import Settings +from patterns import Patterns + + +async 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) + + # Test 1: Basic rainbow with auto=True (continuous) + print("Test 1: Basic rainbow (auto=True, n1=1)") + p.set_param("br", 255) + p.set_param("dl", 100) # Delay affects animation speed + p.set_param("n1", 1) # Step increment of 1 + p.set_param("auto", True) # Run continuously + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 3 seconds to see rainbow animation + while utime.ticks_diff(utime.ticks_ms(), start) < 3000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 2: Fast rainbow + print("Test 2: Fast rainbow (low delay, n1=1)") + p.stopped = False + p.set_param("dl", 50) # Faster animation + p.set_param("n1", 1) + p.set_param("auto", True) + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 2000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 3: Slow rainbow + print("Test 3: Slow rainbow (high delay, n1=1)") + p.stopped = False + p.set_param("dl", 500) # Slower animation + p.set_param("n1", 1) + p.set_param("auto", True) + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 3000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 4: Low brightness rainbow + print("Test 4: Low brightness rainbow (n1=1)") + p.stopped = False + p.set_param("br", 64) # Low brightness + p.set_param("dl", 100) + p.set_param("n1", 1) + p.set_param("auto", True) + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 2000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 5: Single-step rainbow (auto=False) + print("Test 5: Single-step rainbow (auto=False, n1=1)") + p.stopped = False + p.set_param("br", 255) + p.set_param("dl", 100) + p.set_param("n1", 1) + p.set_param("auto", False) # Run once per call + p.set_param("step", 0) # Reset step + p.select("rainbow") + + # Call rainbow multiple times to see step progression + for i in range(10): + task = asyncio.create_task(p.run()) + await task + await asyncio.sleep_ms(100) # Small delay between steps + wdt.feed() + + # Test 6: Verify step updates correctly + print("Test 6: Verify step updates (auto=False, n1=1)") + p.stopped = False + p.set_param("n1", 1) + initial_step = p.step + p.select("rainbow") + task = asyncio.create_task(p.run()) + await task + final_step = p.step + print(f"Step updated from {initial_step} to {final_step} (expected increment: 1)") + + # Test 7: Fast step increment (n1=5) + print("Test 7: Fast rainbow (n1=5, auto=True)") + p.stopped = False + p.set_param("br", 255) + p.set_param("dl", 100) + p.set_param("n1", 5) # Step increment of 5 (5x faster) + p.set_param("auto", True) + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 2000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 8: Very fast step increment (n1=10) + print("Test 8: Very fast rainbow (n1=10, auto=True)") + p.stopped = False + p.set_param("n1", 10) # Step increment of 10 (10x faster) + p.set_param("auto", True) + p.select("rainbow") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 2000: + wdt.feed() + await asyncio.sleep_ms(10) + await p.stop() + await task + + # Test 9: Verify n1 controls step increment (auto=False) + print("Test 9: Verify n1 step increment (auto=False, n1=5)") + p.stopped = False + p.set_param("n1", 5) # Step increment of 5 + p.set_param("auto", False) + p.set_param("step", 0) # Reset step + initial_step = p.step + p.select("rainbow") + task = asyncio.create_task(p.run()) + await task + final_step = p.step + expected_step = (initial_step + 5) % 256 + print(f"Step updated from {initial_step} to {final_step} (expected: {expected_step})") + if final_step == expected_step: + print("✓ n1 step increment working correctly") + else: + print(f"✗ Step increment mismatch! Expected {expected_step}, got {final_step}") + + # Cleanup + print("Test complete, turning off") + p.stopped = False + p.select("off") + task = asyncio.create_task(p.run()) + await asyncio.sleep_ms(100) + await p.stop() + await task + + +if __name__ == "__main__": + asyncio.run(main()) + diff --git a/test/patterns/transition.py b/test/patterns/transition.py new file mode 100644 index 0000000..f4094c4 --- /dev/null +++ b/test/patterns/transition.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +import uasyncio as asyncio +import utime +from machine import WDT +from settings import Settings +from patterns import Patterns + + +async 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) + + # Test 1: Basic transition with 2 colors (auto=True, cycles continuously) + print("Test 1: Basic transition (2 colors, 1000ms delay, auto=True)") + p.set_param("br", 255) + p.set_param("dl", 1000) # 1 second transition time + p.set_param("auto", True) # Cycle continuously + p.set_param("cl", [(255, 0, 0), (0, 255, 0)]) # Red to Green + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 5 seconds to see multiple transitions + while utime.ticks_diff(utime.ticks_ms(), start) < 5000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 2: Fast transition (auto=True, cycles continuously) + print("Test 2: Fast transition (500ms delay, auto=True)") + p.stopped = False + p.set_param("dl", 500) # 500ms transition time + p.set_param("auto", True) # Cycle continuously + p.set_param("cl", [(0, 0, 255), (255, 255, 0)]) # Blue to Yellow + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 3 seconds + while utime.ticks_diff(utime.ticks_ms(), start) < 3000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 3: Multiple colors transition (auto=True, cycles continuously) + print("Test 3: Multiple colors transition (3 colors, auto=True)") + p.stopped = False + p.set_param("dl", 800) + p.set_param("auto", True) # Cycle continuously + p.set_param("cl", [ + (255, 0, 0), # Red + (0, 255, 0), # Green + (0, 0, 255), # Blue + ]) + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 8 seconds to see full cycles + while utime.ticks_diff(utime.ticks_ms(), start) < 8000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 4: Single color (should just stay that color) + print("Test 4: Single color (should stay that color)") + p.stopped = False + p.set_param("dl", 1000) + p.set_param("cl", [(255, 128, 0)]) # Orange + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 3 seconds + while utime.ticks_diff(utime.ticks_ms(), start) < 3000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 5: Many colors transition (auto=True, cycles continuously) + print("Test 5: Many colors transition (5 colors, auto=True)") + p.stopped = False + p.set_param("dl", 600) + p.set_param("auto", True) # Cycle continuously + p.set_param("cl", [ + (255, 0, 0), # Red + (255, 128, 0), # Orange + (255, 255, 0), # Yellow + (0, 255, 0), # Green + (0, 0, 255), # Blue + ]) + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 10 seconds to see multiple cycles + while utime.ticks_diff(utime.ticks_ms(), start) < 10000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 6: Low brightness transition (auto=True, cycles continuously) + print("Test 6: Low brightness transition (auto=True)") + p.stopped = False + p.set_param("br", 64) # Low brightness + p.set_param("dl", 1000) + p.set_param("auto", True) # Cycle continuously + p.set_param("cl", [(255, 0, 0), (0, 255, 0)]) + p.select("transition") + task = asyncio.create_task(p.run()) + start = utime.ticks_ms() + # Run for 3 seconds + while utime.ticks_diff(utime.ticks_ms(), start) < 3000: + wdt.feed() + await asyncio.sleep_ms(10) + p.stopped = True + await task + + # Test 7: Single-shot transition (auto=False, only color1 to color2) + print("Test 7: Single-shot transition (auto=False, color1 to color2 only)") + p.stopped = False + p.set_param("br", 255) + p.set_param("dl", 1000) # 1 second transition + p.set_param("auto", False) # Run only once + p.set_param("cl", [ + (255, 0, 0), # Red (color1) + (0, 255, 0), # Green (color2) + (0, 0, 255), # Blue (should be ignored) + (255, 255, 0), # Yellow (should be ignored) + ]) + p.select("transition") + task = asyncio.create_task(p.run()) + + # The transition should complete once (color1 to color2) and then stop + # Total time should be ~1000ms + # Wait a bit longer to verify it doesn't continue + start = utime.ticks_ms() + while utime.ticks_diff(utime.ticks_ms(), start) < 2000: + wdt.feed() + await asyncio.sleep_ms(10) + + # Task should have completed on its own (not stopped manually) + # Verify it's stopped + if not p.stopped: + print("Warning: Transition should have stopped automatically with auto=False") + p.stopped = True + await task + + # Cleanup + print("Test complete, turning off") + p.stopped = False + p.select("off") + task = asyncio.create_task(p.run()) + await asyncio.sleep_ms(100) + p.stopped = True + await task + + +if __name__ == "__main__": + asyncio.run(main()) +