Compare commits
2 Commits
beta-1.03
...
794f1a2841
| Author | SHA1 | Date | |
|---|---|---|---|
| 794f1a2841 | |||
| 8f8bc894a9 |
65
src/patterns/blizzard.py
Normal file
65
src/patterns/blizzard.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import random
|
||||
import utime
|
||||
|
||||
|
||||
class Blizzard:
|
||||
"""Dense falling flakes with sideways drift (compare `snowfall` for gentler flakes)."""
|
||||
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(255, 255, 255), (200, 230, 255), (180, 210, 255)]
|
||||
# Higher n1 → more spawns (0–255 threshold vs random)
|
||||
density = max(1, int(preset.n1) if int(preset.n1) > 0 else 90)
|
||||
speed = max(1, int(preset.n2) if int(preset.n2) > 0 else 2)
|
||||
# n3: 128 = no bias; <128 drift one way, >128 the other (scaled to small steps)
|
||||
wraw = int(preset.n3)
|
||||
if wraw <= 0:
|
||||
wind = 0
|
||||
else:
|
||||
wind = max(-4, min(4, (wraw - 128) // 20))
|
||||
|
||||
flakes = []
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d_ms = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d_ms:
|
||||
nled = self.driver.num_leds
|
||||
bg = self.driver.apply_brightness(preset.background_or(colors), preset.b)
|
||||
|
||||
for i in range(nled):
|
||||
self.driver.n[i] = bg
|
||||
|
||||
if random.randint(0, 255) < density:
|
||||
flakes.append(
|
||||
[
|
||||
nled - 1,
|
||||
random.randint(0, len(colors) - 1),
|
||||
0 if wind == 0 else random.randint(-1, 1),
|
||||
]
|
||||
)
|
||||
|
||||
nf = []
|
||||
for pos, ci, wj in flakes:
|
||||
p = pos
|
||||
lateral = wind + (wj if wj else 0)
|
||||
p -= speed
|
||||
p += lateral
|
||||
if p < -2 or p >= nled + 2:
|
||||
continue
|
||||
pi = max(0, min(nled - 1, int(p)))
|
||||
self.driver.n[pi] = self.driver.apply_brightness(colors[ci], preset.b)
|
||||
nf.append([p, ci, wj])
|
||||
flakes = nf
|
||||
|
||||
self.driver.n.write()
|
||||
last = utime.ticks_add(last, d_ms)
|
||||
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
|
||||
yield
|
||||
56
src/patterns/candle_glow.py
Normal file
56
src/patterns/candle_glow.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import random
|
||||
import utime
|
||||
|
||||
|
||||
class CandleGlow:
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(255, 140, 40), (255, 200, 120), (255, 90, 20)]
|
||||
n_candles = max(1, min(self.driver.num_leds, int(preset.n1) if int(preset.n1) > 0 else 4))
|
||||
width = max(1, int(preset.n2) if int(preset.n2) > 0 else 3)
|
||||
flicker = max(1, min(255, int(preset.n3) if int(preset.n3) > 0 else 90))
|
||||
n_led = self.driver.num_leds
|
||||
centers = tuple(random.randint(0, max(0, n_led - 1)) for _ in range(n_candles))
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d:
|
||||
bg = self.driver.apply_brightness(preset.background_or(colors), preset.b)
|
||||
for i in range(n_led):
|
||||
self.driver.n[i] = bg
|
||||
base_lo = 180 - flicker // 2
|
||||
if base_lo < 40:
|
||||
base_lo = 40
|
||||
for ci, c in enumerate(centers):
|
||||
warmth = colors[ci % len(colors)]
|
||||
pulse = base_lo + random.randint(0, flicker)
|
||||
if pulse > 255:
|
||||
pulse = 255
|
||||
for off in range(-width, width + 1):
|
||||
idx = c + off
|
||||
if 0 <= idx < n_led:
|
||||
dist = abs(off)
|
||||
fall = ((width - dist + 1) * 256) // (width + 1)
|
||||
fac = (fall * pulse) // 256
|
||||
px = (
|
||||
(warmth[0] * fac) // 255,
|
||||
(warmth[1] * fac) // 255,
|
||||
(warmth[2] * fac) // 255,
|
||||
)
|
||||
lit = self.driver.apply_brightness(px, preset.b)
|
||||
o = self.driver.n[idx]
|
||||
self.driver.n[idx] = (
|
||||
max(o[0], lit[0]),
|
||||
max(o[1], lit[1]),
|
||||
max(o[2], lit[2]),
|
||||
)
|
||||
self.driver.n.write()
|
||||
last = utime.ticks_add(last, d)
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
yield
|
||||
69
src/patterns/ice_sparkle.py
Normal file
69
src/patterns/ice_sparkle.py
Normal file
@@ -0,0 +1,69 @@
|
||||
import random
|
||||
import utime
|
||||
|
||||
|
||||
class IceSparkle:
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(240, 248, 255), (200, 235, 255), (255, 255, 255)]
|
||||
rate = max(1, min(255, int(preset.n1) if int(preset.n1) > 0 else 55))
|
||||
decay = max(1, min(255, int(preset.n2) if int(preset.n2) > 0 else 140))
|
||||
halo = max(0, min(3, int(preset.n3)))
|
||||
sparks = []
|
||||
cap = 28
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d:
|
||||
bg = self.driver.apply_brightness(preset.background_or(colors), preset.b)
|
||||
for i in range(self.driver.num_leds):
|
||||
self.driver.n[i] = bg
|
||||
ns = []
|
||||
for s in sparks:
|
||||
lv = s["lv"] - decay
|
||||
if lv > 0:
|
||||
s["lv"] = lv
|
||||
ns.append(s)
|
||||
sparks = ns
|
||||
if len(sparks) < cap and random.randint(0, 255) < rate:
|
||||
sparks.append(
|
||||
{
|
||||
"p": random.randint(0, max(0, self.driver.num_leds - 1)),
|
||||
"lv": 255,
|
||||
"ci": random.randint(0, len(colors) - 1),
|
||||
}
|
||||
)
|
||||
for s in sparks:
|
||||
p = s["p"]
|
||||
lv = s["lv"]
|
||||
ci = s["ci"]
|
||||
base = colors[ci]
|
||||
for off in range(-halo, halo + 1):
|
||||
idx = p + off
|
||||
if 0 <= idx < self.driver.num_leds:
|
||||
dist = abs(off)
|
||||
fac = lv if dist == 0 else (lv * (halo - dist + 1)) // (halo + 1)
|
||||
lit = self.driver.apply_brightness(
|
||||
(
|
||||
(base[0] * fac) // 255,
|
||||
(base[1] * fac) // 255,
|
||||
(base[2] * fac) // 255,
|
||||
),
|
||||
preset.b,
|
||||
)
|
||||
o = self.driver.n[idx]
|
||||
self.driver.n[idx] = (
|
||||
min(255, o[0] + lit[0]),
|
||||
min(255, o[1] + lit[1]),
|
||||
min(255, o[2] + lit[2]),
|
||||
)
|
||||
self.driver.n.write()
|
||||
last = utime.ticks_add(last, d)
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
yield
|
||||
62
src/patterns/icicles.py
Normal file
62
src/patterns/icicles.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import utime
|
||||
|
||||
|
||||
class Icicles:
|
||||
"""Icicles hanging from anchor points; tips brighten toward max length then shrink."""
|
||||
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(240, 248, 255), (160, 210, 255), (255, 255, 255)]
|
||||
spacing = max(1, int(preset.n1) if int(preset.n1) > 0 else 12)
|
||||
nled = self.driver.num_leds
|
||||
max_len = max(
|
||||
2,
|
||||
min(
|
||||
int(preset.n2) if int(preset.n2) > 0 else min(14, max(3, nled // 4)),
|
||||
max(2, nled),
|
||||
),
|
||||
)
|
||||
span = max_len * 2
|
||||
phase_step = max(1, int(preset.n3) if int(preset.n3) > 0 else 1)
|
||||
phase = 0
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d_ms = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d_ms:
|
||||
bg_rgb = preset.background_or(colors)
|
||||
bg = self.driver.apply_brightness(bg_rgb, preset.b)
|
||||
|
||||
for i in range(nled):
|
||||
self.driver.n[i] = bg
|
||||
|
||||
aidx = 0
|
||||
for anchor in range(0, nled, spacing):
|
||||
tri_i = (phase + aidx * 5) % span
|
||||
ic_len = tri_i if tri_i <= max_len else span - tri_i
|
||||
tip_c = colors[aidx % len(colors)]
|
||||
tip = self.driver.apply_brightness(tip_c, preset.b)
|
||||
for k in range(ic_len):
|
||||
idx = anchor + k
|
||||
if idx >= nled:
|
||||
break
|
||||
br = ((k + 1) * 255) // max(1, ic_len)
|
||||
self.driver.n[idx] = (
|
||||
(tip[0] * br + bg[0] * (255 - br)) // 255,
|
||||
(tip[1] * br + bg[1] * (255 - br)) // 255,
|
||||
(tip[2] * br + bg[2] * (255 - br)) // 255,
|
||||
)
|
||||
aidx += 1
|
||||
|
||||
self.driver.n.write()
|
||||
phase = (phase + phase_step) % span
|
||||
last = utime.ticks_add(last, d_ms)
|
||||
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
|
||||
yield
|
||||
53
src/patterns/northern_wave.py
Normal file
53
src/patterns/northern_wave.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import math
|
||||
import utime
|
||||
|
||||
|
||||
class NorthernWave:
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(20, 55, 120), (60, 140, 220), (180, 220, 255)]
|
||||
period = max(4, int(preset.n1) if int(preset.n1) > 0 else 20)
|
||||
contrast = max(1, min(255, int(preset.n2) if int(preset.n2) > 0 else 200))
|
||||
drift = max(1, int(preset.n3) if int(preset.n3) > 0 else 2)
|
||||
phase = 0
|
||||
last = utime.ticks_ms()
|
||||
ncols = len(colors)
|
||||
if ncols < 2:
|
||||
colors = list(colors) + [(120, 180, 255)]
|
||||
ncols = len(colors)
|
||||
twopi = 6.2831853
|
||||
|
||||
def lerp3(a, b, f):
|
||||
return (
|
||||
a[0] + ((b[0] - a[0]) * f) // 255,
|
||||
a[1] + ((b[1] - a[1]) * f) // 255,
|
||||
a[2] + ((b[2] - a[2]) * f) // 255,
|
||||
)
|
||||
|
||||
while True:
|
||||
d = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d:
|
||||
bg = self.driver.apply_brightness(preset.background_or(colors), preset.b)
|
||||
for i in range(self.driver.num_leds):
|
||||
t = (i * twopi / period) + (phase * twopi / 256.0)
|
||||
w = (math.sin(t) + 1.0) * 0.5
|
||||
u = w * (ncols - 1) * 256.0
|
||||
fi = int(u) >> 8
|
||||
frac = int(u) & 255
|
||||
if fi >= ncols - 1:
|
||||
fi = ncols - 2
|
||||
frac = 255
|
||||
peak = lerp3(colors[fi], colors[fi + 1], frac)
|
||||
peak = self.driver.apply_brightness(peak, preset.b)
|
||||
mixf = min(255, int(w * contrast * 2) >> 1)
|
||||
self.driver.n[i] = lerp3(bg, peak, mixf)
|
||||
self.driver.n.write()
|
||||
phase = (phase + drift) % 256
|
||||
last = utime.ticks_add(last, d)
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
yield
|
||||
72
src/patterns/rime.py
Normal file
72
src/patterns/rime.py
Normal file
@@ -0,0 +1,72 @@
|
||||
import random
|
||||
import utime
|
||||
|
||||
|
||||
class Rime:
|
||||
"""Slow frost build-up on a chilly background — gentle random brightening then decay."""
|
||||
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(220, 235, 255), (255, 255, 255), (185, 220, 255)]
|
||||
num = self.driver.num_leds
|
||||
if num <= 0:
|
||||
while True:
|
||||
yield
|
||||
return
|
||||
|
||||
# n1: spawn tendency (like twinkle upper range)
|
||||
chill = max(1, min(255, int(preset.n1) if int(preset.n1) > 0 else 36))
|
||||
# n2: decay per refresh (subtract from glow buffer)
|
||||
melt = max(1, min(255, int(preset.n2) if int(preset.n2) > 0 else 12))
|
||||
# n3: how many LEDs can flash brighter per refresh (cap)
|
||||
spark_cap = max(1, min(num, int(preset.n3) if int(preset.n3) > 0 else 3))
|
||||
|
||||
glow = [0] * num
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d_ms = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d_ms:
|
||||
base_bg = preset.background_or(colors)
|
||||
bg = self.driver.apply_brightness(base_bg, preset.b)
|
||||
|
||||
for i in range(num):
|
||||
if glow[i] > melt:
|
||||
glow[i] -= melt
|
||||
else:
|
||||
glow[i] = 0
|
||||
|
||||
spawned = 0
|
||||
tries = spark_cap + num // 8
|
||||
for _ in range(tries):
|
||||
if spawned >= spark_cap:
|
||||
break
|
||||
if random.randint(0, 255) >= chill:
|
||||
continue
|
||||
j = random.randint(0, num - 1)
|
||||
glow[j] = min(255, glow[j] + random.randint(80, 200))
|
||||
spawned += 1
|
||||
|
||||
palette = colors
|
||||
for i in range(num):
|
||||
g = glow[i]
|
||||
fg = palette[i % len(palette)]
|
||||
hi = self.driver.apply_brightness(fg, preset.b)
|
||||
mix = max(0, min(255, g))
|
||||
self.driver.n[i] = (
|
||||
(hi[0] * mix + bg[0] * (255 - mix)) // 255,
|
||||
(hi[1] * mix + bg[1] * (255 - mix)) // 255,
|
||||
(hi[2] * mix + bg[2] * (255 - mix)) // 255,
|
||||
)
|
||||
|
||||
self.driver.n.write()
|
||||
last = utime.ticks_add(last, d_ms)
|
||||
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
|
||||
yield
|
||||
65
src/patterns/starfall.py
Normal file
65
src/patterns/starfall.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import random
|
||||
import utime
|
||||
|
||||
|
||||
class Starfall:
|
||||
def __init__(self, driver):
|
||||
self.driver = driver
|
||||
|
||||
def run(self, preset):
|
||||
colors = preset.c if preset.c else [(255, 255, 255), (200, 230, 255), (255, 248, 220)]
|
||||
rate = max(1, min(255, int(preset.n1) if int(preset.n1) > 0 else 14))
|
||||
speed = max(1, int(preset.n2) if int(preset.n2) > 0 else 2)
|
||||
tail = max(2, int(preset.n3) if int(preset.n3) > 0 else 10)
|
||||
stars = []
|
||||
max_stars = 4
|
||||
last = utime.ticks_ms()
|
||||
|
||||
while True:
|
||||
d = max(1, int(preset.d))
|
||||
now = utime.ticks_ms()
|
||||
if utime.ticks_diff(now, last) >= d:
|
||||
bg = self.driver.apply_brightness(preset.background_or(colors), preset.b)
|
||||
for i in range(self.driver.num_leds):
|
||||
self.driver.n[i] = bg
|
||||
if len(stars) < max_stars and random.randint(0, 255) < rate:
|
||||
top = self.driver.num_leds - 1 + random.randint(0, min(8, self.driver.num_leds // 2))
|
||||
stars.append(
|
||||
{
|
||||
"h": float(top),
|
||||
"ci": random.randint(0, len(colors) - 1),
|
||||
}
|
||||
)
|
||||
ns = []
|
||||
for s in stars:
|
||||
h = s["h"]
|
||||
ci = s["ci"]
|
||||
ih = int(h)
|
||||
for t in range(tail):
|
||||
idx = ih + t
|
||||
if 0 <= idx < self.driver.num_leds:
|
||||
fade = 255 - (t * 255 // max(1, tail - 1))
|
||||
base = colors[ci]
|
||||
lit = (
|
||||
(base[0] * fade) // 255,
|
||||
(base[1] * fade) // 255,
|
||||
(base[2] * fade) // 255,
|
||||
)
|
||||
lit = self.driver.apply_brightness(lit, preset.b)
|
||||
o = self.driver.n[idx]
|
||||
self.driver.n[idx] = (
|
||||
max(o[0], lit[0]),
|
||||
max(o[1], lit[1]),
|
||||
max(o[2], lit[2]),
|
||||
)
|
||||
h -= speed
|
||||
if h >= -tail:
|
||||
s["h"] = h
|
||||
ns.append(s)
|
||||
stars = ns
|
||||
self.driver.n.write()
|
||||
last = utime.ticks_add(last, d)
|
||||
if not preset.a:
|
||||
yield
|
||||
return
|
||||
yield
|
||||
43
tests/patterns/blizzard.py
Normal file
43
tests/patterns/blizzard.py
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
p.tick()
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 48))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit(
|
||||
"test_blizzard",
|
||||
{
|
||||
"p": "blizzard",
|
||||
"b": 220,
|
||||
"d": 40,
|
||||
"c": [(255, 255, 255), (200, 220, 255)],
|
||||
"n1": 100,
|
||||
"n2": 2,
|
||||
"n3": 150,
|
||||
"a": True,
|
||||
},
|
||||
)
|
||||
p.select("test_blizzard")
|
||||
run_for(p, wdt, 2500)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 80)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
40
tests/patterns/candle_glow.py
Normal file
40
tests/patterns/candle_glow.py
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets, run_tick
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
run_tick(p)
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 30))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit("test_candle_glow", {
|
||||
"p": "candle_glow",
|
||||
"b": 200,
|
||||
"d": 60,
|
||||
"c": [(255, 0, 0), (0, 0, 255), (0, 255, 0)],
|
||||
"n1": 4,
|
||||
"n2": 2,
|
||||
"n3": 120,
|
||||
"a": True,
|
||||
})
|
||||
p.select("test_candle_glow")
|
||||
run_for(p, wdt, 3000)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 100)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
40
tests/patterns/ice_sparkle.py
Normal file
40
tests/patterns/ice_sparkle.py
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets, run_tick
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
run_tick(p)
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 30))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit("test_ice_sparkle", {
|
||||
"p": "ice_sparkle",
|
||||
"b": 200,
|
||||
"d": 60,
|
||||
"c": [(255, 0, 0), (0, 0, 255), (0, 255, 0)],
|
||||
"n1": 4,
|
||||
"n2": 2,
|
||||
"n3": 120,
|
||||
"a": True,
|
||||
})
|
||||
p.select("test_ice_sparkle")
|
||||
run_for(p, wdt, 3000)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 100)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
43
tests/patterns/icicles.py
Normal file
43
tests/patterns/icicles.py
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
p.tick()
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 40))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit(
|
||||
"test_icicles",
|
||||
{
|
||||
"p": "icicles",
|
||||
"b": 220,
|
||||
"d": 50,
|
||||
"c": [(200, 230, 255), (255, 255, 255)],
|
||||
"n1": 10,
|
||||
"n2": 8,
|
||||
"n3": 1,
|
||||
"a": True,
|
||||
},
|
||||
)
|
||||
p.select("test_icicles")
|
||||
run_for(p, wdt, 2500)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 80)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
40
tests/patterns/northern_wave.py
Normal file
40
tests/patterns/northern_wave.py
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets, run_tick
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
run_tick(p)
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 30))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit("test_northern_wave", {
|
||||
"p": "northern_wave",
|
||||
"b": 200,
|
||||
"d": 60,
|
||||
"c": [(255, 0, 0), (0, 0, 255), (0, 255, 0)],
|
||||
"n1": 4,
|
||||
"n2": 2,
|
||||
"n3": 120,
|
||||
"a": True,
|
||||
})
|
||||
p.select("test_northern_wave")
|
||||
run_for(p, wdt, 3000)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 100)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
43
tests/patterns/rime.py
Normal file
43
tests/patterns/rime.py
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
p.tick()
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 40))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit(
|
||||
"test_rime",
|
||||
{
|
||||
"p": "rime",
|
||||
"b": 200,
|
||||
"d": 80,
|
||||
"c": [(240, 248, 255), (255, 255, 255)],
|
||||
"n1": 48,
|
||||
"n2": 14,
|
||||
"n3": 4,
|
||||
"a": True,
|
||||
},
|
||||
)
|
||||
p.select("test_rime")
|
||||
run_for(p, wdt, 2800)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 80)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
40
tests/patterns/starfall.py
Normal file
40
tests/patterns/starfall.py
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
import utime
|
||||
from machine import WDT
|
||||
from settings import Settings
|
||||
from presets import Presets, run_tick
|
||||
|
||||
|
||||
def run_for(p, wdt, ms):
|
||||
start = utime.ticks_ms()
|
||||
while utime.ticks_diff(utime.ticks_ms(), start) < ms:
|
||||
wdt.feed()
|
||||
run_tick(p)
|
||||
utime.sleep_ms(10)
|
||||
|
||||
|
||||
def main():
|
||||
s = Settings()
|
||||
p = Presets(pin=s.get("led_pin", 10), num_leds=s.get("num_leds", 30))
|
||||
wdt = WDT(timeout=10000)
|
||||
|
||||
p.edit("test_starfall", {
|
||||
"p": "starfall",
|
||||
"b": 200,
|
||||
"d": 60,
|
||||
"c": [(255, 0, 0), (0, 0, 255), (0, 255, 0)],
|
||||
"n1": 4,
|
||||
"n2": 2,
|
||||
"n3": 120,
|
||||
"a": True,
|
||||
})
|
||||
p.select("test_starfall")
|
||||
run_for(p, wdt, 3000)
|
||||
|
||||
p.edit("cleanup_off", {"p": "off"})
|
||||
p.select("cleanup_off")
|
||||
run_for(p, wdt, 100)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user