#
# hello.light.45.py
#
# receive and display light level
#
# Neil Gershenfeld
# CBA MIT 10/24/07
#
# (c) Massachusetts Institute of Technology 2007
# Permission granted for experimental and personal use;
# license for commercial sale available from MIT
#

from Tkinter import *
import serial

WINDOW = 600
eps = 0.1
saveflag = 0
filter = 0.0

def idle(parent,canvas):
   global saveflag, filter, eps
   #
   # idle routine
   #
   byte2 = 0
   byte3 = 0
   byte4 = 0
   ser.flush()
   while 1:
      #
      # find framing 
      #
      byte1 = byte2
      byte2 = byte3
      byte3 = byte4
      byte4 = ord(ser.read())
      if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)):
         break
   low = ord(ser.read())
   high = ord(ser.read())
   value = 150*high + low
   filter = (1-eps)*filter + eps*value
   x = int(.01*WINDOW + (.99-.01)*WINDOW*filter/1024.0)
   o = int(WINDOW-x)
   u = int(x*.2)
   z = int(x*.7)
   b = int(WINDOW-z)
   canvas.itemconfigure("text",text="%.1f"%filter)
   #canvas.coords('rect1',.01*WINDOW,.01*WINDOW,x,.99*WINDOW)
   #canvas.coords('rect2',x,.01*WINDOW,.99*WINDOW,.99*WINDOW)
   canvas.coords('rect1',.01*WINDOW,x,.99*WINDOW,.99*WINDOW)
   canvas.coords('rect2',.01*WINDOW,.01*WINDOW,.99*WINDOW,x)
   

   #canvas.coords('oval1',x, x, o, o)
   canvas.coords('oval3',z, z, b, b)
   canvas.coords('oval2',x+u,x+u,o-u,o-u)


   #canvas.coords('oval1',.1*WINDOW,.1*WINDOW,.9*WINDOW,.9*WINDOW)
   canvas.update()
   parent.after_idle(idle,parent,canvas)

#
# open serial port
#
ser = serial.Serial('/dev/ttyUSB0',9600)
ser.setDTR()
#
# set up GUI
#
root = Tk()
root.title('LIGHT SENSOR')
root.bind('q','exit')
canvas = Canvas(root, width=WINDOW, height=WINDOW, background='black')

#canvas.create_text(.1*WINDOW,.125*WINDOW,text=".33",font=("Helvetica", 24),tags="text",fill="#ff0000")
canvas.create_rectangle(.2*WINDOW,.05*WINDOW,.3*WINDOW,.2*WINDOW, tags='rect1', fill='#CCFF00')
canvas.create_rectangle(.3*WINDOW,.05*WINDOW,.9*WINDOW,.2*WINDOW, tags='rect2', fill='#ff0000')

#canvas.create_oval(.5*WINDOW,.5*WINDOW,.5*WINDOW,.5*WINDOW, tags='oval1', fill='#ff9600')
canvas.create_oval(.5*WINDOW,.5*WINDOW,.5*WINDOW,.5*WINDOW, tags='oval3', fill='#ff9600')
canvas.create_oval(.5*WINDOW,.5*WINDOW,.5*WINDOW,.5*WINDOW, tags='oval2', fill='#9728ff')

canvas.pack()
#
# start idle loop
#
root.after(100,idle,root,canvas)
root.mainloop()
