import time
import neopixel

np = neopixel.NeoPixel(machine.Pin(15), 9)

def demo(np):
    n = np.n

    # cycle
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 0)
        np[i % n] = (255, 255, 255)
        np.write()
        time.sleep_ms(25)

    # bounce
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 128)
        if (i // n) % 2 == 0:
            np[i % n] = (0, 0, 0)
        else:
            np[n - 1 - (i % n)] = (0, 0, 0)
        np.write()
        time.sleep_ms(60)

    # fade in/out
    for i in range(0, 4 * 256, 8):
        for j in range(n):
            if (i // 256) % 2 == 0:
                val = i & 0xff
            else:
                val = 255 - (i & 0xff)
            np[j] = (val, 0, 0)
        np.write()
        time.sleep(0.05)

    # clear
    for i in range(n):
        np[i] = (0, 0, 0)
    np.write()

def loading(np, delay=20, trail_size=4):
    n = np.n  # Number of LEDs
    while True:
        # Gradually populate LEDs up to trail_size
        for t in range(1, trail_size + 1):
            for j in range(n):
                brightness = max(0, 255 - (abs(t - 1) * (255 // trail_size)))
                np[j] = (brightness, brightness, brightness) if j < t else (0, 0, 0)
            
            np.write()
            time.sleep_ms(delay)

        # Continue the loading cycle
        for i in range(n + trail_size):
            for j in range(n):
                brightness = max(0, 255 - (abs(i - j) * (255 // trail_size)))
                np[j] = (brightness, brightness, brightness)
            
            np.write()
            time.sleep_ms(delay)
loading(np)