From 2db9b3464ad1e6af59f8081af16daa3e18c542cf Mon Sep 17 00:00:00 2001 From: jimmy Date: Sun, 26 Oct 2025 21:33:31 +1300 Subject: [PATCH] Add random test suite --- test/random_test.py | 166 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 test/random_test.py diff --git a/test/random_test.py b/test/random_test.py new file mode 100644 index 0000000..ac84e38 --- /dev/null +++ b/test/random_test.py @@ -0,0 +1,166 @@ +#!/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() +