"""Bara scrollande '6446.se' med fyllt plasma-skimmer som bakgrund. Loopar för evigt."""
import machine, neopixel, time, math

PIN = 4
W, H = 8, 8
NUM = W * H
np = neopixel.NeoPixel(machine.Pin(PIN), NUM)

DIM = 24  # textens ljusstyrka

def xy(x, y):
    return y * W + x

def clear():
    for i in range(NUM):
        np[i] = (0, 0, 0)

def bg_color(hue, peak=6):
    """Alltid >=1 per kanal — bakgrunden är aldrig svart."""
    pos = hue & 255
    span = peak - 1
    if pos < 85:
        r = 1 + pos * span // 85
        g = 1 + (85 - pos) * span // 85
        b = 1
    elif pos < 170:
        pos -= 85
        r = 1 + (85 - pos) * span // 85
        g = 1
        b = 1 + pos * span // 85
    else:
        pos -= 170
        r = 1
        g = 1 + pos * span // 85
        b = 1 + (85 - pos) * span // 85
    return (r, g, b)

# 5x7-font för "6446.se"
FONT = {
    '6': ["01110", "10000", "10000", "11110", "10001", "10001", "01110"],
    '4': ["00010", "00110", "01010", "10010", "11111", "00010", "00010"],
    '.': ["00000", "00000", "00000", "00000", "00000", "00000", "01100"],
    's': ["00000", "00000", "01110", "10000", "01110", "00001", "11110"],
    'e': ["00000", "00000", "01110", "10001", "11111", "10000", "01110"],
    ' ': ["00000"] * 7,
}

def text_columns(text):
    cols = []
    for ch in text:
        glyph = FONT.get(ch, FONT[' '])
        char_w = len(glyph[0])
        for cx in range(char_w):
            col = 0
            for ry in range(7):
                if glyph[ry][cx] == '1':
                    col |= (1 << ry)
            cols.append(col)
        cols.append(0)  # 1 col mellanrum
    return cols

TEXT_COLOR = (DIM, DIM, DIM)
cols = text_columns("6446.se")
offset = -W
frame = 0

try:
    while True:
        # bakgrund: fyllt plasma-skimmer
        for y in range(H):
            for x in range(W):
                v = (math.sin(x * 0.55 + frame * 0.06)
                     + math.sin(y * 0.7 + frame * 0.08)
                     + math.sin((x + y) * 0.4 + frame * 0.05))
                hue = int(v * 50 + frame * 2) & 255
                np[xy(x, y)] = bg_color(hue, peak=6)
        # text ovanpå
        for x in range(W):
            ci = offset + x
            if 0 <= ci < len(cols):
                col = cols[ci]
                for y in range(H):
                    if col & (1 << y):
                        np[xy(x, y)] = TEXT_COLOR
        np.write()
        offset += 1
        frame += 1
        if offset > len(cols):
            offset = -W
        time.sleep_ms(80)
except KeyboardInterrupt:
    clear()
    np.write()
