'''
Created on 2015-06-11

@author: caribou
'''

import threading, Queue, time
from Tkinter import *
from socket import *
import pickle
from kid_data import *

port = 50008
host = '192.168.2.30'

class KidViewer(Frame):
    def __init__(self, parent=None, padx="50", pady="50"):
        Frame.__init__(self, parent)
        self.pack()
        self.k_data = KidData()        
        self.dataQueue = Queue.Queue()
        self.state=1
        self.sock = socket(AF_INET, SOCK_STREAM)
                
        self.lf_vPV = LabelFrame(self, text="Photovoltaic Voltage", width="300", height="200")
        self.lf_vPV.pack(side=TOP, expand = YES, fill=BOTH)
        self.l_vPV = Label(self.lf_vPV,text="vPV", width="10")
        self.l_vPV.pack(side=LEFT)
        self.ent_vPV = Entry(self.lf_vPV)
        self.ent_vPV.insert(0, "0"+"V")
        self.ent_vPV.pack()

        self.lf_iPV = LabelFrame(self, text="Photovoltaic Current", width="300", height="200")
        self.lf_iPV.pack(side=TOP, expand = YES, fill=BOTH)
        self.l_iPV = Label(self.lf_iPV,text="iPV", width="10")        
        self.l_iPV.pack(side=LEFT)
        self.ent_iPV = Entry(self.lf_iPV)
        self.ent_iPV.insert(0, "0" + "A")
        self.ent_iPV.pack()

        self.lf_batteryStage = LabelFrame(self, text="Battery Stage", width="300", height="200")
        self.lf_batteryStage.pack(side=TOP, expand = YES, fill=BOTH)
        self.l_batteryStage = Label(self.lf_batteryStage,text="batteryStage", width="10")        
        self.l_batteryStage.pack(side=LEFT)
        self.ent_batteryStage = Entry(self.lf_batteryStage)
        self.ent_batteryStage.insert(0, "")
        self.ent_batteryStage.pack()
        
        self.lf_vBATT = LabelFrame(self, text="Battery Voltage", width="300", height="200")
        self.lf_vBATT.pack(side=TOP, expand = YES, fill=BOTH)
        self.l_vBATT = Label(self.lf_vBATT,text="vBATT", width="10")        
        self.l_vBATT.pack(side=LEFT)
        self.ent_vBATT = Entry(self.lf_vBATT)
        self.ent_vBATT.insert(0, "0" + "V")
        self.ent_vBATT.pack()

        self.lf_iBATT = LabelFrame(self, text="Battery Current", width="300", height="200")
        self.lf_iBATT.pack(side=TOP, expand = YES, fill=BOTH)
        self.l_iBATT = Label(self.lf_iBATT,text="iBATT", width="10")        
        self.l_iBATT.pack(side=LEFT)
        self.ent_iBATT = Entry(self.lf_iBATT)
        self.ent_iBATT.insert(0, "0" + "A")
        self.ent_iBATT.pack()

        self.client_connect()
        self.consumer()

    def update_form(self):
        self.ent_vBATT.delete(0, END)
        self.ent_vBATT.insert(0,str(self.k_data.comm_v_batt) + "V")
        self.ent_vPV.delete(0, END)
        self.ent_vPV.insert(0,str(self.k_data.comm_v_pv) + "V")
                
        if self.k_data.comm_battery_stage == COMM_batteryStage_Resting:             
            stage_str = "Resting"
        elif self.k_data.comm_battery_stage == COMM_batteryStage_Absorb:
            stage_str = "Absorb"
        elif self.k_data.comm_battery_stage == COMM_batteryStage_BulkMPPT:
            stage_str = "BulkMPPT"        
        elif self.k_data.comm_battery_stage == COMM_batteryStage_Float:
            stage_str = "Float"
        elif self.k_data.comm_battery_stage == COMM_batteryStage_FloatMPPT:
            stage_str = "FloatMPPT"
   
        self.ent_batteryStage.delete(0, END)
        self.ent_batteryStage.insert(0,stage_str)
   
    def client_connect(self):
        try:
            self.sock.connect((host,port))
        except Exception, errorcode:
            print "Caught exception socket.error: %s" % errorcode 
        else:
            self.sock.send('Ready')
            self.makethread()
            print('Finished client connect')        

    def client_close(self):
        self.sock.close()

    def producer(self):
#        while True:
#            print ('state = %d' % self.state)
            if self.state == 1:
                print('Producer state == 1')
                reply = self.sock.recv(1024)    
                self.dataQueue.put('client got: [%s]' % reply)
                self.state=2
                self.sock.send('GET')                            
            elif self.state == 3:
  #              print('Producer state == 3')
                reply = self.sock.recv(1024)
                self.dataQueue.put(reply)
                self.sock.send('GET')

                     

    def consumer(self):
 #       print('consumer')
        try:
            data = self.dataQueue.get(block=False)
        except Queue.Empty:
            pass
        else:
            if self.state == 2:             
#                print('Producer state == 2')                
                print('client got: [%s]' % data)
                self.state = 3   
                self.makethread()             
            elif self.state == 3:
                self.k_data = pickle.loads(data)                
#                print data
                self.update_form()
                self.makethread()
                
            self.after(5000, self.consumer)

    def makethread(self):
        threading.Thread(target=self.producer())
                        
            
                
    



#        lf_batt = LabelFrame(lf_kid, text="Battery", width="300", height="200")
#        lf_batt.pack(side=RIGHT)
   

if __name__ == '__main__': 
    KidViewer().mainloop()
 
'''    
        
        self.dataQueue = Queue.Queue()
        self.bind('<Button-1>',self.makethreads)
        self.consumer()
    





def server():
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(('', port))
    sock.listen(5)
    while True:
        conn, addr = sock.accept()
        data = conn.recv(1024)
        reply = 'server got:[%s]' % data
        conn.send(reply.encode())
        
def client(name):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((host,port))
    sock.send(name.encode())
    reply = sock.recv(1024)
    sock.close()
    print('client got: [%s]' % reply)
    
if __name__ == '__main__':
    from threading import Thread
    sthread = Thread(target=server)
    sthread.daemon = True
    sthread.start()
    for i in range(5):
        Thread(target=client, args=('client%s' %i,)).start()
        
    
    
    
    print 'Hello World'
    '''