"""Studsande 2x2-boll på 8x8 NeoPixel-matris (rad-major rak layout)."""
import machine, neopixel, time

PIN = 4
W, H = 8, 8
NUM = W * H

np = neopixel.NeoPixel(machine.Pin(PIN), NUM)

# Rak rad-layout: alla rader går vänster -> höger.
# rad 0: 0..7, rad 1: 8..15 (pixel 8 rakt under pixel 0), osv.
def xy(x, y):
    return y * W + x

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

def draw_ball(cx, cy, color):
    for ox in range(BALL_SIZE):
        for oy in range(BALL_SIZE):
            x, y = cx + ox, cy + oy
            if 0 <= x < W and 0 <= y < H:
                np[xy(x, y)] = color

BALL_SIZE = 2
BALL = (8, 0, 0)

x, y = 0.0, 0.0
dx, dy = 0.35, 0.27
MAX_X = W - BALL_SIZE
MAX_Y = H - BALL_SIZE

try:
    while True:
        x += dx
        y += dy
        if x <= 0:
            x = 0; dx = -dx
        elif x >= MAX_X:
            x = MAX_X; dx = -dx
        if y <= 0:
            y = 0; dy = -dy
        elif y >= MAX_Y:
            y = MAX_Y; dy = -dy

        clear()
        draw_ball(int(round(x)), int(round(y)), BALL)
        np.write()
        time.sleep_ms(40)
except KeyboardInterrupt:
    clear()
    np.write()
