import utime class Plasma: def __init__(self, driver): self.driver = driver def _wheel(self, pos): if pos < 85: return (pos * 3, 255 - pos * 3, 0) if pos < 170: pos -= 85 return (255 - pos * 3, 0, pos * 3) pos -= 170 return (0, pos * 3, 255 - pos * 3) def run(self, preset): scale = max(1, int(preset.n1) if int(preset.n1) > 0 else 6) speed = max(1, int(preset.n2) if int(preset.n2) > 0 else 2) contrast = max(1, int(preset.n3) if int(preset.n3) > 0 else 2) t = self.driver.step % 256 last = utime.ticks_ms() while True: d = max(1, int(preset.d)) now = utime.ticks_ms() if utime.ticks_diff(now, last) >= d: for i in range(self.driver.num_leds): v = ((i * scale + t) & 255) v2 = (((i * scale // max(1, contrast)) - (t * 2)) & 255) c = self._wheel((v + v2) & 255) self.driver.n[i] = self.driver.apply_brightness(c, preset.b) self.driver.n.write() t = (t + speed) % 256 self.driver.step = t last = utime.ticks_add(last, d) if not preset.a: yield return yield