twinkl-client/animations/matrix.py

108 lines
2.1 KiB
Python

#!/usr/bin/env python2
import sys
import signal
from random import randint
from time import sleep
from twinklclient import TwinklSocket, TwinklMessage
WIDTH = 6
HEIGHT = 8
# As viewn from the inside
BOX_MAP = [
[357, 18, 369, 186, 249, 228, 51],
[279, 9, 57, 159, 300, 108, 204],
[261, 42, 183, 201, 273, 246, 15],
[306, 168, 24, 138, 309, 165, 39],
[258, 222, 87, 363, 291, 231, 243],
[252, 114, 180, 75, 282, 141, 33],
[264, 288, 120, 135, 255, 99, 105],
[285, 207, 102, 45, 297, 216, 63],
]
msg = TwinklMessage()
socket = None
priority = 0
def set_box(x,y,r,g,b):
if x >= 0 and y >= 0 and x < WIDTH and y < HEIGHT:
base_address = BOX_MAP[y][x]
msg[base_address] = int(r)
msg[base_address + 1] = int(g)
msg[base_address + 2] = int(b)
def clear():
for x in range(0, WIDTH):
for y in range(0, HEIGHT):
set_box(x, y, 0, 0, 0)
class Column(object):
def __init__(self):
self.x = randint(0, WIDTH)
self.y = randint(-HEIGHT/2, -1)
self.speed = randint(1, 10)
self.length = randint(4, HEIGHT)
self.count = 0
def render(self):
for y in range(self.y - self.length, self.y):
green = 255 - (255.0 / self.length) * (self.y - y)
set_box(self.x, y, 0, green, 0)
set_box(self.x, self.y, 64, 255, 64)
def update(self):
self.count = (self.count + 1) % self.speed
if(self.count == 0):
self.y += 1
def terminate(signal, frame):
msg.reset()
msg.set_priority(priority)
socket.send(msg)
if socket:
socket.close()
msg.destroy()
sys.exit(0)
signal.signal(signal.SIGINT, terminate)
if len(sys.argv) != 3:
print "Usage: %s host priority" % sys.argv[0]
sys.exit(1)
socket = TwinklSocket(sys.argv[1], "1337")
priority = int(sys.argv[2])
msg.set_priority(priority)
columns = []
# Add some initial collums
for i in range(0, 16):
columns.append(Column())
while(True):
clear();
columns = sorted(columns, key = lambda c: -c.y)
for i in range(0,len(columns)):
if columns[i].y - columns[i].length > HEIGHT:
columns[i] = Column()
columns[i].update()
columns[i].render()
socket.send(msg)
sleep(0.05)