#!/usr/bin/env python3 """ Random test - randomly selects and runs test patterns for 2-10 minutes each Run with: mpremote run test/random_test.py """ import patterns import utime import random import math from settings import Settings from machine import WDT def run_pattern(p, pattern_name, config, duration_ms): """Run a pattern for specified duration""" print(f"\n{'='*60}") print(f"Starting: {pattern_name}") print(f"Duration: {duration_ms//1000} seconds") # Configure parameters if pattern_name == "blink": p.delay = config.get("delay", 500) elif pattern_name == "circle_loading": p.n1 = config.get("n1", 50) p.n2 = config.get("n2", 100) p.n3 = config.get("n3", 200) p.n4 = config.get("n4", 0) p.delay = config.get("delay", 2000) elif pattern_name == "sine_brightness": p.n1 = config.get("n1", 50) p.brightness = config.get("brightness", 255) p.delay = config.get("delay", 1000) elif pattern_name == "rainbow": p.n1 = config.get("n1", 1) p.delay = config.get("delay", 1000) elif pattern_name == "flicker": p.n1 = config.get("n1", 50) p.delay = config.get("delay", 50) elif pattern_name == "n_chase": p.n1 = config.get("n1", 5) p.n2 = config.get("n2", 5) p.n3 = config.get("n3", 1) p.n4 = config.get("n4", 1) p.delay = config.get("delay", 100) # Set color if provided if "color" in config: p.colors = [config["color"]] # Start pattern p.select(config.get("short_name", "o")) # Run for duration start_time = utime.ticks_ms() while utime.ticks_diff(utime.ticks_ms(), start_time) < duration_ms: wdt.feed() utime.sleep_ms(100) # Stop pattern p.run = False while p.running: utime.sleep_ms(1) p.off() print(f"Completed: {pattern_name}") utime.sleep_ms(500) def random_test(): """Run random test patterns continuously""" print("Starting Random Test Suite") print("Patterns will change every 2-10 minutes") print("Press Ctrl+C to stop") # Load settings settings = Settings() # Initialize patterns p = patterns.Patterns( pin=settings["led_pin"], num_leds=settings["num_leds"], brightness=255 ) print(f"LED Pin: {settings['led_pin']}") print(f"LEDs: {settings['num_leds']}") # Initialize watchdog global wdt wdt = WDT(timeout=10000) wdt.feed() # Define all test configurations test_configs = [ # Blink patterns {"pattern": "blink", "short_name": "bl", "delay": 500, "color": (255, 0, 0)}, {"pattern": "blink", "short_name": "bl", "delay": 500, "color": (0, 255, 0)}, {"pattern": "blink", "short_name": "bl", "delay": 500, "color": (0, 0, 255)}, {"pattern": "blink", "short_name": "bl", "delay": 500, "color": (255, 255, 0)}, # Circle loading patterns {"pattern": "circle_loading", "short_name": "cl", "n1": 50, "n2": 100, "n3": 200, "n4": 0, "delay": 2000, "color": (255, 0, 0)}, {"pattern": "circle_loading", "short_name": "cl", "n1": 30, "n2": 60, "n3": 100, "n4": 0, "delay": 1500, "color": (0, 255, 0)}, {"pattern": "circle_loading", "short_name": "cl", "n1": 75, "n2": 150, "n3": 300, "n4": 10, "delay": 3000, "color": (0, 0, 255)}, # Sine brightness patterns {"pattern": "sine_brightness", "short_name": "sb", "n1": 50, "brightness": 255, "delay": 1000, "color": (255, 0, 0)}, {"pattern": "sine_brightness", "short_name": "sb", "n1": 100, "brightness": 255, "delay": 800, "color": (0, 255, 0)}, {"pattern": "sine_brightness", "short_name": "sb", "n1": 0, "brightness": 255, "delay": 1500, "color": (0, 0, 255)}, # Rainbow patterns {"pattern": "rainbow", "short_name": "rb", "n1": 1, "delay": 3000, "color": None}, {"pattern": "rainbow", "short_name": "rb", "n1": 2, "delay": 2000, "color": None}, {"pattern": "rainbow", "short_name": "rb", "n1": 3, "delay": 1500, "color": None}, {"pattern": "rainbow", "short_name": "rb", "n1": 6, "delay": 1000, "color": None}, {"pattern": "rainbow", "short_name": "rb", "n1": 12, "delay": 800, "color": None}, # Flicker patterns {"pattern": "flicker", "short_name": "fl", "n1": 50, "delay": 50, "color": (255, 0, 0)}, {"pattern": "flicker", "short_name": "fl", "n1": 30, "delay": 100, "color": (0, 255, 0)}, {"pattern": "flicker", "short_name": "fl", "n1": 100, "delay": 30, "color": (0, 0, 255)}, # N-chase patterns (bidirectional) {"pattern": "n_chase", "short_name": "nc", "n1": 5, "n2": 5, "n3": 1, "n4": 1, "delay": 100, "color": (255, 0, 0)}, {"pattern": "n_chase", "short_name": "nc", "n1": 10, "n2": 5, "n3": 1, "n4": 1, "delay": 150, "color": (0, 255, 0)}, {"pattern": "n_chase", "short_name": "nc", "n1": 20, "n2": 20, "n3": 20, "n4": 5, "delay": 200, "color": (0, 255, 255)}, {"pattern": "n_chase", "short_name": "nc", "n1": 15, "n2": 10, "n3": 10, "n4": 5, "delay": 180, "color": (255, 255, 0)}, {"pattern": "n_chase", "short_name": "nc", "n1": 3, "n2": 3, "n3": 1, "n4": 1, "delay": 120, "color": (255, 0, 255)}, # N-chase patterns (forward only, large segments) {"pattern": "n_chase", "short_name": "nc", "n1": 30, "n2": 10, "n3": 5, "n4": 5, "delay": 150, "color": (255, 128, 0)}, {"pattern": "n_chase", "short_name": "nc", "n1": 40, "n2": 20, "n3": 10, "n4": 10, "delay": 180, "color": (128, 255, 0)}, {"pattern": "n_chase", "short_name": "nc", "n1": 50, "n2": 25, "n3": 20, "n4": 20, "delay": 200, "color": (0, 128, 255)}, {"pattern": "n_chase", "short_name": "nc", "n1": 60, "n2": 30, "n3": 30, "n4": 30, "delay": 220, "color": (255, 0, 128)}, {"pattern": "n_chase", "short_name": "nc", "n1": 80, "n2": 40, "n3": 50, "n4": 50, "delay": 250, "color": (128, 0, 255)}, {"pattern": "n_chase", "short_name": "nc", "n1": 100, "n2": 50, "n3": 100, "n4": 100, "delay": 300, "color": (255, 255, 255)}, # Off {"pattern": "off", "short_name": "o", "color": (0, 0, 0)}, ] try: cycle = 0 while True: cycle += 1 print(f"\n\n{'='*60}") print(f"Random Test Cycle {cycle}") print(f"{'='*60}") # Randomly select a test configuration config = random.choice(test_configs) # Random duration between 2-10 minutes (120,000 - 600,000 ms) duration_ms = random.randint(120000, 600000) # Run the selected pattern run_pattern(p, config["pattern"], config, duration_ms) except KeyboardInterrupt: print("\n\nStopping random test suite...") p.run = False p.off() print("LEDs turned off") if __name__ == "__main__": random_test()