# -*- coding: utf-8 -*-
import copy
import time
import serial


WIDTH=6
HEIGHT=10
PIXELS=WIDTH*HEIGHT
FPS=120.0

#--RGB--object
class RGB:
    def __init__(self,red,green,blue):
        self.r=red
        self.g=green
        self.b=blue
    def setcolor(self,red,green,blue):
        self.r=red
        self.g=green
        self.b=blue
       
#--create--matrix
def new_m(w,h):#width/height    // returns 2 dimensional list
    matrix=[]         
    row=[]  
    for x in xrange(w):
        row.append(RGB(0,0,0))
    
    for y in xrange(h):
        matrix.append(copy.deepcopy(row))
    
    return matrix

#--print--matrix
def print_m(m):#matrix // 2 dimensional list
    h=len(m)
    w=len(m[0])
    for y in xrange(h):
        print y,"> |",
        for x in xrange(w):
            print x,"",m[y][x].r,m[y][x].g,m[y][x].b," |",
        print""


def img_to_m(path,m):  #path // matrix//width//height
    i = Image.open(path)
    pixels = i.load()

    h=len(m)
    w=len(m[0])    
    
    for x in range(w):
        for y in range(h):
            m[y][x].r,m[y][x].g,m[y][x].b = pixels[x, y]
 
          
          
def send_serial(ttyobj,m):#n=anzahl der pixel,m=matrix(liste)
	h=len(m)
	w=len(m[0])
	ttyobj.write(chr(1))#eine 1 pro anzahl aller pixel(hier 60)
	for x in xrange(w):			#layout der pixel:erst spalten, dann zeilen von oben rechts beginnend
		for y in xrange(h):
			
			tty.write(chr(m[y][w-1-x].r))
			tty.write(chr(m[y][w-1-x].g))
			tty.write(chr(m[y][w-1-x].b))    
            



def calc(f,m): #frame, matrix
	h=len(m)
	w=len(m[0])
	while f > 255:
		f=(f-255)
	for y in xrange(h):			#alle pixel durchgehen
		for x in xrange(w):
			m[y][x].setcolor(255-f,f,255)
	return m #returns processed image
               


#MAINLOOP

running=True
frame=0
target_delta=1/FPS

print "creating matrix..."
matrix=new_m(WIDTH,HEIGHT)

print "opening serial port..."
tty=serial.Serial("/dev/ttyACM3", 500000)
time.sleep(1)

while running:
    time_a=time.time()
    matrix=calc(frame,matrix)
    #print frame    
    time_b=time.time()

    
    time.sleep(target_delta-(time_b-time_a))

    send_serial(tty,matrix)
    print 1/(time.time()-time_a)
    frame=frame+1
