feat(patterns): reverse animation direction via preset n8

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-17 18:32:01 +12:00
parent 55a97ac51c
commit 94266d5a7c
11 changed files with 131 additions and 62 deletions

View File

@@ -18,7 +18,7 @@ class ColourCycle:
pos -= 170
return (0, pos * 3, 255 - pos * 3)
def _render_gradient(self, colors, phase, brightness):
def _render_gradient(self, preset, colors, phase, brightness):
num_leds = self.driver.num_leds
color_count = len(colors)
if num_leds <= 0 or color_count <= 0:
@@ -40,14 +40,16 @@ class ColourCycle:
c1[1] + ((c2[1] - c1[1]) * frac) // 256,
c1[2] + ((c2[2] - c1[2]) * frac) // 256,
)
self.driver.n[i] = self.driver.apply_brightness(blended, brightness)
self.driver.n[self.driver.led_i(preset, i)] = self.driver.apply_brightness(
blended, brightness
)
self.driver.n.write()
def _render_rainbow(self, phase, brightness):
def _render_rainbow(self, preset, phase, brightness):
num_leds = self.driver.num_leds
for i in range(num_leds):
rc_index = (i * 256 // max(1, num_leds)) + phase
self.driver.n[i] = self.driver.apply_brightness(
self.driver.n[self.driver.led_i(preset, i)] = self.driver.apply_brightness(
self._wheel(rc_index & 255), brightness
)
self.driver.n.write()
@@ -64,8 +66,8 @@ class ColourCycle:
if mode == 1:
if not preset.a:
self._render_rainbow(phase, preset.b)
self.driver.step = (phase + step_amount) % 256
self._render_rainbow(preset, phase, preset.b)
self.driver.step = (phase + self.driver.signed(preset, step_amount)) % 256
yield
return
last_update = utime.ticks_ms()
@@ -73,16 +75,16 @@ class ColourCycle:
delay_ms = max(1, int(preset.d))
now = utime.ticks_ms()
if utime.ticks_diff(now, last_update) >= delay_ms:
self._render_rainbow(phase, preset.b)
phase = (phase + step_amount) % 256
self._render_rainbow(preset, phase, preset.b)
phase = (phase + self.driver.signed(preset, step_amount)) % 256
self.driver.step = phase
last_update = utime.ticks_add(last_update, delay_ms)
yield
colors = preset.c if preset.c else [(255, 0, 0), (0, 0, 255)]
if not preset.a:
self._render_gradient(colors, phase, preset.b)
self.driver.step = (phase + step_amount) % 256
self._render_gradient(preset, colors, phase, preset.b)
self.driver.step = (phase + self.driver.signed(preset, step_amount)) % 256
yield
return
@@ -91,8 +93,8 @@ class ColourCycle:
delay_ms = max(1, int(preset.d))
now = utime.ticks_ms()
if utime.ticks_diff(now, last_update) >= delay_ms:
self._render_gradient(colors, phase, preset.b)
phase = (phase + step_amount) % 256
self._render_gradient(preset, colors, phase, preset.b)
phase = (phase + self.driver.signed(preset, step_amount)) % 256
self.driver.step = phase
last_update = utime.ticks_add(last_update, delay_ms)
yield