import Tkinter as tk
import smbus	
import os
   
I2C_UPDATE = True

I2C_DATA_ADDR   = 0x38				#I2C DATA bus base address
I2C_ENABLE_ADDR = 0x39				#I2C ENABLE bus base address

DAC_EN = [0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F]

HourHigh = [0,0,0,0,0,0,0,0,0,0]
HourLow = [0,0,0,0,0,0,0,0,0,0]
MinuteHigh = [0,0,0,0,0,0,0,0,0,0]
MinuteLow = [0,0,0,0,0,0,0,0,0,0]
SecondHigh = [0,0,0,0,0,0,0,0,0,0]
SecondLow = [0,0,0,0,0,0,0,0,0,0]

newValue = 0

valueList = {"9", "8", "7", "6", "5", "4", "3", "2", "1", "0"}
digitList = {"Hour-High", "Hour-Low", "Minute-High", "Minute-Low", "Second-High", "Second-Low"}


def update_select():
    global valueSelect, digitSelect, text

    outputString = "Digit:" + str(digitSelect.get()) + " Number:" + str(valueSelect.get() + " Value:" + str(newValue))
    print outputString
    
    if digitSelect.get() == "Hour-High":
        HourHigh[int(valueSelect.get())] = newValue
        text.delete(0,0)
        text.insert(0, "Hour High = " + str(HourHigh))
        
    elif digitSelect.get() == "Hour-Low":
        HourLow[int(valueSelect.get())] = newValue
        text.delete(1,1)
        text.insert(1, "Hour Low = " + str(HourLow))        

    elif digitSelect.get() == "Minute-High":
        MinuteHigh[int(valueSelect.get())] = newValue
        text.delete(2,2)
        text.insert(2, "Minute High= " + str(MinuteHigh))
        
    elif digitSelect.get() == "Minute-Low":
        MinuteLow[int(valueSelect.get())] = newValue
        text.delete(3,3)
        text.insert(3, "Minute Low = " + str(MinuteLow))           

    elif digitSelect.get() == "Second-High":
        SecondHigh[int(valueSelect.get())] = newValue
        text.delete(4,4)
        text.insert(4, "Second High = " + str(SecondHigh))
        
    elif digitSelect.get() == "Second-Low":
        SecondLow[int(valueSelect.get())] = newValue
        text.delete(5,5)
        text.insert(5, "Second Low = " + str(SecondLow))
    
    else:
        print("update select: selection error")


def update_value(angle):
    global newValue
    newValue = int(angle)

    if I2C_UPDATE:
        if digitSelect.get() == "Hour-High":
            bus.write_byte( I2C_DATA_ADDR, newValue )  
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[5] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 )
                    
        elif digitSelect.get() == "Hour-Low":
            bus.write_byte( I2C_DATA_ADDR, newValue )         
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[4] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 )
                    
        elif digitSelect.get() == "Minute-High":
            bus.write_byte( I2C_DATA_ADDR, newValue )  
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[3] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 )
                    
        elif digitSelect.get() == "Minute-Low":
            bus.write_byte( I2C_DATA_ADDR, newValue )          
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[2] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 )
                    
        elif digitSelect.get() == "Second-High":
            bus.write_byte( I2C_DATA_ADDR, newValue )   
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[1] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 )
                    
        elif digitSelect.get() == "Second-Low":
            bus.write_byte( I2C_DATA_ADDR, int(newValue) )    	  
            bus.write_byte( I2C_ENABLE_ADDR, DAC_EN[0] )  
            bus.write_byte( I2C_ENABLE_ADDR, 255 ) 

        else:
            print("update value: selection error")
    
    
def quit():
    global root, configFile, HourHigh, HourLow, MinuteHigh, MinuteLow, SecondHigh, SecondLow

    outputString = "DAC_VOLTAGE = [" + str(SecondLow[0]) + ", " + str(SecondLow[1]) + ", " \
                                     + str(SecondLow[2]) + ", " + str(SecondLow[3]) + ", " \
                                     + str(SecondLow[4]) + ", " + str(SecondLow[5]) + ", " \
                                     + str(SecondLow[6]) + ", " + str(SecondLow[7]) + ", " \
                                     + str(SecondLow[8]) + ", " + str(SecondLow[9]) + "], \n" \
                                 "[" + str(SecondHigh[0]) + ", " + str(SecondHigh[1]) + ", " \
                                     + str(SecondHigh[2]) + ", " + str(SecondHigh[3]) + ", " \
                                     + str(SecondHigh[4]) + ", " + str(SecondHigh[5]) + ", " \
                                     + str(SecondHigh[6]) + ", " + str(SecondHigh[7]) + ", " \
                                     + str(SecondHigh[8]) + ", " + str(SecondHigh[9]) + "], \n" \
                                 "[" + str(MinuteLow[0]) + ", " + str(MinuteLow[1]) + ", " \
                                     + str(MinuteLow[2]) + ", " + str(MinuteLow[3]) + ", " \
                                     + str(MinuteLow[4]) + ", " + str(MinuteLow[5]) + ", " \
                                     + str(MinuteLow[6]) + ", " + str(MinuteLow[7]) + ", " \
                                     + str(MinuteLow[8]) + ", " + str(MinuteLow[9]) + "], \n" \
                                 "[" + str(MinuteHigh[0]) + ", " + str(MinuteHigh[1]) + ", " \
                                     + str(MinuteHigh[2]) + ", " + str(MinuteHigh[3]) + ", " \
                                     + str(MinuteHigh[4]) + ", " + str(MinuteHigh[5]) + ", " \
                                     + str(MinuteHigh[6]) + ", " + str(MinuteHigh[7]) + ", " \
                                     + str(MinuteHigh[8]) + ", " + str(MinuteHigh[9]) + "], \n" \
                                 "[" + str(HourLow[0]) + ", " + str(HourLow[1]) + ", " \
                                     + str(HourLow[2]) + ", " + str(HourLow[3]) + ", " \
                                     + str(HourLow[4]) + ", " + str(HourLow[5]) + ", " \
                                     + str(HourLow[6]) + ", " + str(HourLow[7]) + ", " \
                                     + str(HourLow[8]) + ", " + str(HourLow[9]) + "], \n" \
                                 "[" + str(HourHigh[0]) + ", " + str(HourHigh[1]) + ", " \
                                     + str(HourHigh[2]) + ", " + str(HourHigh[3]) + ", " \
                                     + str(HourHigh[4]) + ", " + str(HourHigh[5]) + ", " \
                                     + str(HourHigh[6]) + ", " + str(HourHigh[7]) + ", " \
                                     + str(HourHigh[8]) + ", " + str(HourHigh[9]) + "]]\n"
                                    
    configFile.write(outputString) 
     
    configFile.close()
    root.destroy()                

print("i2c")

if I2C_UPDATE:
    bus = smbus.SMBus(1)				#enable I2C bus

    bus.write_byte( I2C_DATA_ADDR, 0 )    	  # clear port
    bus.write_byte( I2C_ENABLE_ADDR, 255 )    # clear port

print("gui")

configFile = open("config.txt", "w")

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
frame1 = tk.Frame(root)
frame1.pack()
frame2 = tk.Frame(root)
frame2.pack()
frame3 = tk.Frame(root)
frame3.pack()

button = tk.Button(frame, 
                   text="QUIT", 
                   fg="red",
                   command=quit)

button.pack(side=tk.LEFT)

update = tk.Button(frame,
                 text="UPDATE",
                 command=update_select)

update.pack(side=tk.LEFT)

scale = tk.Scale(frame1, 
                 from_=0, to=255,
                 length = 300,
                 orient=tk.HORIZONTAL,  
                 command=update_value)

scale.pack(side=tk.LEFT)

digitSelect = tk.StringVar(root)
digitSelect.set("Second-Low")

digit = tk.OptionMenu(frame2,
                      digitSelect,
                      *sorted(digitList))

digit.pack(side=tk.LEFT)


valueSelect = tk.StringVar(root)
valueSelect.set("0")

value = tk.OptionMenu(frame2,
                      valueSelect,
                      *sorted(valueList))

value.pack(side=tk.LEFT)

text = tk.Listbox(frame3,
                  height = 8,
                  width = 60)
text.insert(1, "Hour High = " + str(HourHigh))
text.insert(2, "Hour Low = " + str(HourLow))
text.insert(3, "Minute High = " + str(MinuteHigh))
text.insert(4, "Minute Low = " + str(MinuteLow))
text.insert(5, "Second High = " + str(SecondHigh))
text.insert(6, "Second Low = " + str(SecondLow))

text.pack(side=tk.BOTTOM)
                  

root.mainloop()

