#!/usr/bin/python
import pygtk
import gtk
import sys
import gobject
import os

class GSM:
    def __init__(self, dev="fifo"):
        self.fd = os.open(dev, os.O_RDWR)
        self.buf = ""
        self.state = "init0"
    def input_ready(self, *dummy):
        ret = os.read(self.fd, 16)
        assert ret != ""
        self.buf += ret
        cmds = self.buf.split("\n")
        for i in xrange(len(cmds) - 1):
            cmd = cmds[i].rstrip("\r")
            self.handle_event(cmd)
        self.buf = cmds[-1]
        return True
    def handle_event(self, cmd):
        fsm = {
            ("init0", "AT-Command Interpreter ready") : (lambda: self.send("ATE0"), "init1"),
            ("init1", "ATE0") : (lambda: False, "init2"),
            ("init2", "OK") : (lambda: self.send("AT+CFUN=1"), "init3")
            }
        if (self.state,cmd) in fsm:
            fun, target = fsm[(self.state,cmd)]
            fun()
            self.state = target
        else:
            print (self.state,cmd)
    def send(self, msg):
        print("send %s\n" % msg)
class UI:
    def __init__(self, gsm):
        w = gtk.Window(gtk.WINDOW_TOPLEVEL)
        w.show()

        hbox = gtk.HBox(False, 0)
        w.add(hbox)
        hbox.show()

        b = gtk.Button("1")
        hbox.pack_start(b)
        b.show()

        b = gtk.Button("2")
        hbox.pack_start(b)
        b.show()

        gobject.io_add_watch(gsm.fd, gobject.IO_IN, gsm.input_ready)
        gtk.main()
if __name__ == "__main__":
    gsm = GSM()
    UI(gsm)
