import utime class Orbit: def __init__(self, driver): self.driver = driver def run(self, preset): colors = preset.c if preset.c else [(255, 255, 255), (0, 180, 255), (255, 0, 120)] orbits = max(1, int(preset.n1) if int(preset.n1) > 0 else 3) speed = max(1, int(preset.n2) if int(preset.n2) > 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: for i in range(self.driver.num_leds): self.driver.n[i] = (0, 0, 0) for k in range(orbits): idx = ((phase * (k + 1)) // 8 + (k * self.driver.num_leds // max(1, orbits))) % max(1, self.driver.num_leds) self.driver.n[idx] = self.driver.apply_brightness(colors[k % len(colors)], preset.b) self.driver.n.write() phase = (phase + speed) & 255 self.driver.step = phase last = utime.ticks_add(last, d) if not preset.a: yield return yield