#!/usr/bin/env python

import sys

has_gui = True
try:
    from Tkinter import *
    import tkMessageBox
except ImportError, e:
    has_gui = False
    
import zio

def discover():
    agent = None
    try:
        agent = zio.Agent(entry.get())
        mb = zio.Motherboard(agent)

        ser_label.set(mb.get_serial_no())
        fv_label.set(mb.get_firmware_version())
        pv_label.set(mb.get_protocol_version())
        stat_label.set("Success!")

        agent.close()
        
    except zio.ProtocolError, e:
        tkMessageBox.showerror("Communication Error", e, parent=root)

        stat_label.set("Failed!")

        if agent:
            agent.close()
        return

def do_gui():
    global entry
    global ser_label
    global fv_label
    global stat_label
    global pv_label
    global root
    
    root = Tk()
    root.title("ZIO Test")
    
    label = Label(text="Enter Serial Port: ")
    label.grid(column=0, row=0, padx=5, pady=5)
    
    entry = Entry(root, width=30)
    entry.grid(column=1, columnspan=2, row=0, padx=5, pady=5)
    
    label = Label(text="Status:")
    label.grid(column=0, row=1, padx=5, pady=5, sticky=E)
    
    label = Label(text="Serial No: ")
    label.grid(column=0, row=2, padx=5, pady=5, sticky=E)
    
    label = Label(text="Firmware Ver: ")
    label.grid(column=0, row=3, padx=5, pady=5, sticky=E)
    
    label = Label(text="Protocol Ver: ")
    label.grid(column=0, row=4, padx=5, pady=5, sticky=E)
    
    stat_label = StringVar()
    label = Label(textvariable=stat_label)
    label.grid(column=1, columnspan=2, row=1, padx=5, pady=5, sticky=W)
    
    ser_label = StringVar()
    label = Label(textvariable=ser_label)
    label.grid(column=1, columnspan=2, row=2, padx=5, pady=5, sticky=W)
    
    fv_label = StringVar()
    label = Label(textvariable=fv_label)
    label.grid(column=1, columnspan=2, row=3, padx=5, pady=5, sticky=W)
    
    pv_label = StringVar()
    label = Label(textvariable=pv_label)
    label.grid(column=1, columnspan=2, row=4, padx=5, pady=5, sticky=W)
    

    button = Button(root, text="Test", command=discover)
    button.grid(column=1, row=5, padx=5, pady=5, sticky=E+W)
        
    button = Button(root, text="Close",command=root.quit)
    button.grid(column=2, row=5, padx=5, pady=5, sticky=E+W)

    root.mainloop()

def do_cli():
    dev = raw_input("Enter Serial Port: ")
    agent = zio.Agent(dev)
    
    try:
        mb = zio.Motherboard(agent)
        print "Serial No.:", mb.get_serial_no()
        print "Firmware Version:", mb.get_firmware_version()
        print "Protocol Version:", mb.get_protocol_version()
    except zio.ProtocolError, e:
        print "Error communicating with ZIO: %s", e

    agent.close()

if has_gui:
    do_gui()
else:
    do_cli()
