From 33aee7a3afdf475d7bb1823da9b81cef346ccd32 Mon Sep 17 00:00:00 2001 From: jimmy Date: Sun, 30 Nov 2025 17:41:32 +1300 Subject: [PATCH] Update patterns_base.py --- src/patterns_base.py | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/patterns_base.py b/src/patterns_base.py index ac25092..53623e7 100644 --- a/src/patterns_base.py +++ b/src/patterns_base.py @@ -5,7 +5,6 @@ import random import _thread import asyncio import json -from presets import Presets # Short-key parameter mapping for convenience setters param_mapping = { @@ -27,7 +26,7 @@ param_mapping = { } class Patterns: - def __init__(self, pin, num_leds, color1=(0,0,0), color2=(0,0,0), brightness=127, selected="rainbow_cycle", delay=100): + def __init__(self, pin, num_leds, color1=(0,0,0), color2=(0,0,0), brightness=127, selected="off", delay=100): self.n = NeoPixel(Pin(pin, Pin.OUT), num_leds) self.num_leds = num_leds self.pattern_step = 0 @@ -64,28 +63,44 @@ class Patterns: self.n6 = 0 def select(self, pattern): - if pattern in self.patterns: self.selected = pattern return True + # If pattern doesn't exist, default to "off" + if "off" in self.patterns: + self.selected = "off" return False async def run(self): - print(f"Stopping pattern") await self.stop() - self.running = True + # Ensure we wait a bit more to let the thread fully terminate + # If selected pattern doesn't exist, default to "off" + if self.selected not in self.patterns: + print(f"Pattern {self.selected} not found, defaulting to 'off'") + if "off" in self.patterns: + self.selected = "off" + else: + print("No patterns available") + self.running = False + self.stopped = True + return print(f"Starting pattern {self.selected}") - if self.selected in self.patterns: - _thread.start_new_thread(self.patterns[self.selected], ()) - else: - print(f"Pattern {self.selected} not found") + _thread.start_new_thread(self.patterns[self.selected], ()) async def stop(self): + if not self.running: + # Already stopped + self.stopped = True + return self.running = False start = utime.ticks_ms() - while not self.stopped and utime.ticks_diff(utime.ticks_ms(), start) < 1000: - await asyncio.sleep_ms(0) - self.stopped = True + timeout = 2000 # Increased timeout to 2 seconds + while not self.stopped and utime.ticks_diff(utime.ticks_ms(), start) < timeout: + await asyncio.sleep_ms(10) # Check every 10ms instead of 0ms + if not self.stopped: + # Timeout reached, force stop + print("Warning: Pattern did not stop within timeout") + self.stopped = True def set_param(self, key, value): if key in param_mapping: