#!/usr/bin/python
# -*- coding: utf-8 -*-

"interface with functionality, temperature display"
"author Dorina Rajanen"
"25.05.2016"
"code based on ZetCode Tkinter tutorial by Author: Jan Bodnar"
"Last modified: December 2015"
"Website: www.zetcode.com"
"and temperature display code hello.temp.45.py by 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"



"Program works with python 2.7.11, Tkinter, PIL 1.1.7"






from PIL import Image, ImageTk
from Tkinter import sys, Tk, Text, BOTH, W, N, E, S, Label, Canvas, NW
from ttk import Frame, Button, Label, Style, Entry
from numpy import log
import serial
import tkFont





   
class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()


    def initUI(self):

        self.parent.title("How hot is your coffee?")
        self.pack(fill=BOTH, expand=1)

        self.columnconfigure(1, pad=7)
        #for the temperature
        self.columnconfigure(3, weight=1)  
        self.columnconfigure(4, pad=7)
        
        self.rowconfigure(3, weight=1)
        self.rowconfigure(5, pad=7)

        #this creates an empty row
        lbl = Label(self, text="")
        lbl.grid(sticky=W, pady=4, padx=5)

        #open and define the image as label
        self.img = Image.open("C:\\Scripts python\\images\\coffee.jpg")
        coffee = ImageTk.PhotoImage(self.img)
        label=Label(self, image=coffee)

        # reference must be stored
        label.image = coffee

        #creates an area of type canvas and fills it with an image
        area = Canvas(self)
        area.grid(row=1, column=0, columnspan=2, rowspan=4,
            padx=5, sticky=E+W+S+N)
        area.create_image(1, 1, anchor=NW, image=coffee)

        abtn = Button(self, text="ON", command=self.showTemp)
        abtn.grid(row=1, column=4)

        cbtn = Button(self, text="OFF", command=self.showBlank)
        cbtn.grid(row=2, column=4, pady=4)

        lbl1 = Label(self, text="port", width=4)
        lbl1.grid(row=3, column=4, pady=4)           
       
        entry1 = Entry(self)
        entry1.grid(row=4, column=4, pady=4)
        entry1.insert(0,"COM5")

        global entry1

        obtn = Button(self, text="Quit",command=self.quit)
        obtn.grid(row=5, column=4)

    #copies the geometry from the picture
    def setGeometry(self):

        w, h = self.img.size
        w2=w+600
        h2=h+100
        self.parent.geometry(("%dx%d+300+100") % (w2, h2))


    def showTemp(self):

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

        

        def idle(parent,canvas):
           global filter
           #
           # 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 = filter/2 + T/2  #this did not work so I had to replace it
           filter = T/2  #the displayed temperatue value is not accurate
           x = int(.2*WINDOW + (.9-.2)*WINDOW*(filter-10.0)/10.0)  # I changed filter-20 with filter-10
           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)

        p = entry1.get()

        #open serial port
        ser = serial.Serial(p,9600)
        ser.setDTR()

        global ser
        #
        # start plotting
        #
        canvas = Canvas(self, width=WINDOW, height=.25*WINDOW, background='white')
        canvas.create_text(.1*WINDOW,.125*WINDOW,text=".33",font=("Helvetica", 16),tags="text",fill="#0000b0")
        canvas.create_rectangle(.2*WINDOW,.05*WINDOW,.3*WINDOW,.2*WINDOW, tags='rect1', fill='#b00000')
        canvas.create_rectangle(.3*WINDOW,.05*WINDOW,.9*WINDOW,.2*WINDOW, tags='rect2', fill='#0000b0')
        canvas.grid(row=1, column=2, columnspan=2, rowspan=4,padx=5, sticky=E+W+S+N)
       
        
        self.after(100,idle,self,canvas)

    def showBlank(self):
        ser.close()
        font_text = tkFont.Font(family='Gabriola',size=36, weight='bold')
        canvas = Canvas(self)
        canvas.create_text(20, 30, anchor=W, font=font_text, text="Enjoy your coffee")
        canvas.grid(row=1, column=2, columnspan=2, rowspan=4,padx=5, sticky=E+W+S+N)
    
def main():

    root = Tk()
    app = Example(root)
    app.setGeometry()
    
    root.mainloop()


if __name__ == '__main__':
    main()
