from Tkinter import *

import serial, sys, time

#
# define special chars
#
packet_start = '{'
packet_pointer = '^'
packet_divider = '|'
packet_end = '}'
packet_escape = '\\'
timeout_count = 1000
char_delay = 0.001

#
# test for waiting chars
#
def test_waiting():
   check_count = 0
   while 1:
      if (0 != ser.inWaiting()):
         return 1
      check_count += 1
      if (check_count == timeout_count):
         print "test_waiting: timeout"
         return 0
      time.sleep(char_delay)
#
# check for waiting chars and exit on timeout
#
def check_waiting():
   check_count = 0
   while 1:
      if (0 != ser.inWaiting()):
         break
      check_count += 1
      if (check_count == timeout_count):
         print "check_waiting: timeout"
         sys.exit()
      time.sleep(char_delay)
   return

ser = serial.Serial("/dev/tty.usbserial-A603OPB4",115200)
ser.flushInput()
ser.flushOutput()

#===================#===================#===================
# concise definitions
#===================#===================#===================


def led_OFF(led_id):
    packet = packet_start + packet_pointer + led_id + packet_divider + "f" + packet_end
    print "send packet: " + packet
    for i in range(len(packet)):
        ser.write(packet[i])
        time.sleep(char_delay)
    #print "led %i OFF" %led_id

#=======================#=======================#=======================
# GUI
#=======================#=======================#=======================


class Zmeika(Frame):
    def say_hi(self):
        print "hi there, everyone!"

    def led_ON():
        print "def led on"
        #packet = packet_start + packet_pointer + led_id + packet_divider + "n" + packet_end
        #print "send packet: " + packet
        #for i in range(len(packet)):
        #    ser.write(packet[i])
        #    time.sleep(char_delay)
        #print "led %i ON" %led_id

#===================#===================#===================
# ON definitions
#===================#===================#===================


    def led_one_ON(self):
        packet = packet_start + packet_pointer + "" + packet_divider + "n" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led one ON"

    def led_two_ON(self):
        packet = packet_start + packet_pointer + "1" + packet_divider + "n" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led two ON"

    def led_three_ON(self):
        packet = packet_start + packet_pointer + "11" + packet_divider + "n" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led three ON"

    def led_four_ON(self):
        packet = packet_start + packet_pointer + "111" + packet_divider + "n" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led four ON"


#===================#===================#===================
# OFF definitions
#===================#===================#===================

    def led_one_OFF(self):
        packet = packet_start + packet_pointer + "" + packet_divider + "f" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led one OFF"

    def led_two_OFF(self):
        packet = packet_start + packet_pointer + "1" + packet_divider + "f" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led two OFF"

    def led_three_OFF(self):
        packet = packet_start + packet_pointer + "11" + packet_divider + "f" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led three OFF"

    def led_four_OFF(self):
        packet = packet_start + packet_pointer + "111" + packet_divider + "f" + packet_end
        print "send packet: "+packet
        for i in range(len(packet)):
            ser.write(packet[i])
            time.sleep(char_delay)
        print "led four OFF"


    def createWidgets(self):

        #===================#===================#===================
        # ON buttons
        #===================#===================#===================


        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit

        self.QUIT.pack({"side": "bottom"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "bottom"})

        self.one = Button(self)
        self.one["text"] = "led one ON"
        self.one["command"] = self.led_one_ON
        #self.one["command"] = self.led_ON
        self.one.pack({"side": "left"})

        self.two = Button(self)
        self.two["text"] = "led two ON"
        self.two["command"] = self.led_two_ON
        self.two.pack({"side": "left"})

        self.three = Button(self)
        self.three["text"] = "led three ON"
        self.three["command"] = self.led_three_ON
        self.three.pack({"side": "left"})        

        self.four = Button(self)
        self.four["text"] = "led four ON"
        self.four["command"] = self.led_four_ON
        self.four.pack({"side": "left"})   

        #===================#===================#===================
        # OFF buttons
        #===================#===================#===================

        self.one = Button(self)
        self.one["text"] = "led one OFF"
        self.one["command"] = self.led_one_OFF
        self.one.pack({"side": "left"})

        self.two = Button(self)
        self.two["text"] = "led two OFF"
        self.two["command"] = self.led_two_OFF
        self.two.pack({"side": "left"})

        self.three = Button(self)
        self.three["text"] = "led three OFF"
        self.three["command"] = self.led_three_OFF
        self.three.pack({"side": "left"})        

        self.four = Button(self)
        self.four["text"] = "led four OFF"
        self.four["command"] = self.led_four_OFF
        self.four.pack({"side": "left"})   

    #===================#===================#===================
    # initialization
    #===================#===================#===================


    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()
    #===================#===================#===================
    # main loop
    #===================#===================#===================


root = Tk()
app = Zmeika(master=root)

app.mainloop()
root.destroy()