Update patterns_base.py

This commit is contained in:
2025-11-30 17:41:32 +13:00
parent 501fd37def
commit 33aee7a3af

View File

@@ -5,7 +5,6 @@ import random
import _thread import _thread
import asyncio import asyncio
import json import json
from presets import Presets
# Short-key parameter mapping for convenience setters # Short-key parameter mapping for convenience setters
param_mapping = { param_mapping = {
@@ -27,7 +26,7 @@ param_mapping = {
} }
class Patterns: 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.n = NeoPixel(Pin(pin, Pin.OUT), num_leds)
self.num_leds = num_leds self.num_leds = num_leds
self.pattern_step = 0 self.pattern_step = 0
@@ -64,28 +63,44 @@ class Patterns:
self.n6 = 0 self.n6 = 0
def select(self, pattern): def select(self, pattern):
if pattern in self.patterns: if pattern in self.patterns:
self.selected = pattern self.selected = pattern
return True return True
# If pattern doesn't exist, default to "off"
if "off" in self.patterns:
self.selected = "off"
return False return False
async def run(self): async def run(self):
print(f"Stopping pattern")
await self.stop() 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}") print(f"Starting pattern {self.selected}")
if self.selected in self.patterns: _thread.start_new_thread(self.patterns[self.selected], ())
_thread.start_new_thread(self.patterns[self.selected], ())
else:
print(f"Pattern {self.selected} not found")
async def stop(self): async def stop(self):
if not self.running:
# Already stopped
self.stopped = True
return
self.running = False self.running = False
start = utime.ticks_ms() start = utime.ticks_ms()
while not self.stopped and utime.ticks_diff(utime.ticks_ms(), start) < 1000: timeout = 2000 # Increased timeout to 2 seconds
await asyncio.sleep_ms(0) while not self.stopped and utime.ticks_diff(utime.ticks_ms(), start) < timeout:
self.stopped = True 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): def set_param(self, key, value):
if key in param_mapping: if key in param_mapping: