#
# hello.temp.45.py
#
# receive and display temperature
# hello.temp.45.py serial_port
#
# Neil Gershenfeld
# CBA MIT 3/27/12
#
# (c) Massachusetts Institute of Technology 2012
# Permission granted for experimental and personal use;
# license for commercial sale available from MIT
#
# Modified for Fab Academy 2013 by Rick den Hengst

from Tkinter import *
import tkMessageBox
import Tkinter
from numpy import log
import serial

WINDOW = 1000 # window size
eps = 0.5 # filter time constant
filter = 0.0 # filtered value

def idle(parent,canvas):
   global 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 = 256*high + low
   if (value > 511):
      value -= 1024
   V = 2.5 - value*5.0/(20.0*512.0)
   R = 10000.0/(5.0/V-1.0)
   # NHQ103B375R5
   # R25 10000 (O)
   # B (25/85) 3750 (K)
   # R(T(C)) = R(25)*exp(B*(1/(T(C)+273.15)-(1/(25+273.15))))
   B = 3750.0
   R25 =  10000.0
   T = 1.0/(log(R/R25)/B+(1/(25.0+273.15))) - 273.15
   filter = (1-eps)*filter + eps*T
   x = int(.2*WINDOW + (.9-.2)*WINDOW*(filter-20.0)/10.0)
   canvas.itemconfigure("text",text="%.2f"%filter)
   canvas.coords('rect1',.2*WINDOW,.05*WINDOW,x,.2*WINDOW)
   canvas.coords('rect2',x,.05*WINDOW,.9*WINDOW,.2*WINDOW)
   canvas.update()
   parent.after_idle(idle,parent,canvas)

#
#  check command line arguments
#
if (len(sys.argv) != 2):
   print "command line: hello.temp.45.py serial_port"
   sys.exit()
port = sys.argv[1]
#
# open serial port
#
ser = serial.Serial(port,9600)
ser.setDTR()
#
# start plotting
#
root = Tk()
root.title('What temperature is it? (Press Q to exit)')
root.bind('q','exit')
canvas = Canvas(root, width=WINDOW, height=.25*WINDOW, background='#2C3539')
canvas.create_text(500,25, text="Take a quick look at the current temperature!", font=("Times New Roman", 25),fill="#F3e5ab",justify=("center"))
canvas.create_text(.1*WINDOW,.125*WINDOW,text=".33",font=("Impact", 50),tags="text",fill="#F3E5AB")
canvas.create_rectangle(.2*WINDOW,.05*WINDOW,.3*WINDOW,.2*WINDOW, tags='rect1', fill='#8c001a')
canvas.create_oval(.3*WINDOW,.05*WINDOW,.9*WINDOW,.2*WINDOW, tags='rect2', fill='#6c2dc7')
canvas.pack()
root.after(100,idle,root,canvas)


CheckVar1 = IntVar()
CheckVar2 = IntVar()


def checkbuttonN():
    
    tkMessageBox.showinfo("Negative Answer", "Yeah man, it's way too hot. We're all going to melt soon. Unless it's too cold, that means we'll all freeze soon. Regardless, there will be nobody left!")

def checkbuttonY():
    tkMessageBox.showinfo("Positive Answer", "Life is perfect today, indeed!")


C1 = Checkbutton(root, text = "Positive Reaction", variable = CheckVar1, \
                 onvalue = 1, offvalue = 0, height=3, \
                 width = 10, command = checkbuttonY)
C2 = Checkbutton(root, text = "Negative Reaction", variable = CheckVar2, \
                 onvalue = 1, offvalue = 0, height=3, \
                 width = 10, command = checkbuttonN)
C1.pack()
C2.pack()

quittles = Tk()
Button(quittles, text='Quit', command=quit).grid(row=3, sticky=W, pady=4)

root.mainloop()
