#
# hello.txrx.45.py
#
# receive and display transmit-receive step response - with colour wheel visualisation
# hello.step.45.py serial_port
#
# Pip Mothersill, Nov 2012
# Original file by Neil Gershenfeld
# CBA MIT 11/6/11
#
# (c) Massachusetts Institute of Technology 2011
# Permission granted for experimental and personal use;
# license for commercial sale available from MIT
#

from Tkinter import *
import serial

WINDOW = 600 # window size
eps = 0.75 # filter fraction
filt = 0.0 # filtered value


def idle(parent,canvas):
    global filt, eps, x1
    
    #
    # idle routine
    #
    byte2 = 0
    byte3 = 0
    byte4 = 0
    ser.flush()
    #
    # find framing
    #
    while 1:
        byte1 = byte2
        byte2 = byte3
        byte3 = byte4
        byte4 = ord(ser.read())
        if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)):
            break
    #
    # read and plot
    #
    up_low = ord(ser.read())
    up_high = ord(ser.read())
    down_low = ord(ser.read())
    down_high = ord(ser.read())
    up_value = 256*up_high + up_low
    down_value = 256*down_high + down_low
    value = (up_value - down_value)
    filt = (1-eps)*filt + eps*value/2
    x = int(.1*WINDOW + (5)*WINDOW/(((filt**2)**0.5)**0.5))
    canvas.itemconfigure("value",text=value)
    canvas.itemconfigure("filt",text=filt)
    canvas.itemconfigure("x",text=x)
    canvas.coords('oval1',-2*x*x/100,-2*x*x/100,2*x*x/100,2*x*x/100)
    canvas.coords('oval2',-1.8*x*x/100,-1.8*x*x/100,1.8*x*x/100,1.8*x*x/100)
    canvas.coords('oval3',-0.1*x*x/100,-0.1*x*x/100,0.1*x*x/100,0.1*x*x/100)
    canvas.coords('oval4',-0.08*x*x/100,-0.08*x*x/100,0.08*x*x/100,0.08*x*x/100)
    canvas.coords('oval5',-0.05*x*x/100,-0.05*x*x/100,0.05*x*x/100,0.05*x*x/100)
    canvas.update()
    parent.after_idle(idle,parent,canvas)

#
#  check command line arguments
#
if (len(sys.argv) != 2):
    print "command line: hello.txrx.45.py serial_port"
    sys.exit()
port = sys.argv[1]
#
# open serial port
#
ser = serial.Serial(port,9600)
ser.setDTR()
#
# set up GUI
#
root = Tk()
root.title('hello.txrx.45.py (q to exit)')
root.bind('q','exit')
canvas = Canvas(root, width=WINDOW, height=WINDOW, background='black')
#
canvas.create_arc(-550,-550,550,550, start=90, extent=270, fill="orange")
canvas.create_arc(-500,-500,500,500, start=90, extent=270, fill="yellow")
canvas.create_arc(-470,-470,470,470, start=90, extent=270, fill="blue")
canvas.create_arc(-300,-300,300,300, start=90, extent=270, fill="green")
#canvas.create_arc(-400,-400,400,400, start=90, extent=270, fill="green")
canvas.create_oval(-WINDOW,-WINDOW,WINDOW,WINDOW, tags='oval1', fill="grey")
canvas.create_oval(-WINDOW,-WINDOW,WINDOW,WINDOW, tags='oval2', fill="black")
canvas.create_oval(-WINDOW,-WINDOW,WINDOW,WINDOW, tags='oval3', fill="blue")
canvas.create_oval(-WINDOW,-WINDOW,WINDOW,WINDOW, tags='oval4', fill="red")
canvas.create_oval(-WINDOW,-WINDOW,WINDOW,WINDOW, tags='oval5', fill="purple")
# text
canvas.create_text(.1*WINDOW,.95*WINDOW,text="value",font=("Helvetica", 24),tags="value",fill="grey")
canvas.create_text(.4*WINDOW,.95*WINDOW,text="filt",font=("Helvetica", 24),tags="filt",fill="grey")
canvas.create_text(.8*WINDOW,.95*WINDOW,text="x",font=("Helvetica", 24),tags="x",fill="grey")


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