import utime class Wave: def __init__(self, driver): self.driver = driver def run(self, preset): colors = preset.c if preset.c else [(0, 180, 255)] wavelength = max(2, int(preset.n1) if int(preset.n1) > 0 else 12) amp = max(0, min(255, int(preset.n2) if int(preset.n2) > 0 else 180)) drift = max(1, int(preset.n3) if int(preset.n3) > 0 else 1) phase = 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: base = self.driver.apply_brightness(colors[0], preset.b) for i in range(self.driver.num_leds): x = (i * 256 // wavelength + phase) & 255 tri = 255 - abs(128 - x) * 2 s = (tri * amp) // 255 self.driver.n[i] = ((base[0]*s)//255, (base[1]*s)//255, (base[2]*s)//255) self.driver.n.write() phase = (phase + drift) % 256 self.driver.step = phase last = utime.ticks_add(last, d) if not preset.a: yield return yield