#!/usr/bin/env python
# GUI for GPS on Neo Freerunner

import gobject,gtk
import os

class GpsGui:
   cmdfile = "/sys/devices/platform/s3c2440-i2c/i2c-adapter/i2c-0/0-0073/neo1973-pm-gps.0/pwron"
   #cmdfile = "test"
   gpsfile = "/dev/ttySAC1"

   def delete_event(self, widget, event, data=None):
      gtk.main_quit()
      return False

   def check_status(self):
      self.info = open(self.cmdfile, "r")
      self.status = self.info.readline().rstrip('\n')
      self.info.close()
      return (self.status == '1')

   def check_fix(self):
      self.dev = open(self.gpsfile, 'r')
      self.line = self.dev.readline()

      while (self.line.find("$GPGSA") < 0):
         self.line = self.dev.readline()
      self.dev.close()

      self.mode1 = self.line.split(",")[1]
      self.mode2 = self.line.split(",")[2]

      return (self.mode1 == "A" and (self.mode2 == "2" or self.mode2 == "3"))

   def check_gpsd(self):
      self.status = False
      self.p = os.popen ("ps aux", 'r')
      self.o = self.p.read().split("\n");
      self.p.close()

      for self.line in self.o:
         if(self.line.find("gpsd") >= 0):
            self.status = True

      return self.status

   def change_status(self, button):
      if (self.check_status()):
         os.system("echo 0 >"+self.cmdfile)
         button.set_label("Turn on GPS")
      else:
         os.system("echo 1 >"+self.cmdfile)
         button.set_label("Turn off GPS")

   def change_gpsd(self, button):
      if (self.check_gpsd()):
         os.system("/etc/init.d/gpsd stop")
         button.set_label("Turn on GPSd")
      else:
         os.system("/etc/init.d/gpsd start")
         button.set_label("Turn off GPSd")

   def update_status(self, label):
      if (self.check_status()):
         label.set_text ("Status: ON")
      else:
         label.set_text ("Status: OFF")
      return True

   def update_fix(self, label):
      if (self.check_status() and self.check_fix()):
         label.set_text ("Fix: YES")
      else:
         label.set_text ("Fix: NO")
      return True

   def update_gpsd(self, label):
      if (self.check_gpsd()):
         label.set_text ("GPSd: ON")
      else:
         label.set_text ("GPSd: OFF")
      return True

   def __init__(self):
      # init main window
      self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
      self.win.connect("delete_event", self.delete_event)

      # add a VBox
      self.vbox = gtk.VBox()
      self.win.add(self.vbox)
      self.vbox.show()

      # add Status label
      self.status_label = gtk.Label("GPS Status: Checking")
      self.vbox.pack_start(self.status_label)
      self.status_label.show()
      gobject.timeout_add (1000, self.update_status, self.status_label)

      # add gpsd status label
      self.gpsd_label = gtk.Label("GPSd Status: Checking")
      self.vbox.pack_start(self.gpsd_label)
      self.gpsd_label.show()
      gobject.timeout_add (1000, self.update_gpsd, self.gpsd_label)

      # add hbox for control gps and gpsd
      self.hbox1 = gtk.HBox()
      self.vbox.pack_start(self.hbox1)
      self.hbox1.show()

      # add button to turn gps on/off
      if (self.check_status()):
         self.gps_button = gtk.Button("Turn off GPS")
      else:
         self.gps_button = gtk.Button("Turn on GPS")
      self.hbox1.pack_start(self.gps_button)
      self.gps_button.connect("clicked", self.change_status)
      self.gps_button.show()

      # add button to turn gpsd on/off
      if (self.check_gpsd()):
         self.gpsd_button = gtk.Button("Turn off gpsd")
      else:
         self.gpsd_button = gtk.Button("Turn on gpsd")
      self.hbox1.pack_start(self.gpsd_button)
      self.gpsd_button.connect("clicked", self.change_gpsd)
      self.gpsd_button.show()

      # add label if there is a gps fix
      self.fix_label = gtk.Label("Fix: Checking")
      self.vbox.pack_start(self.fix_label)
      self.fix_label.show()
      gobject.timeout_add (10000, self.update_fix, self.fix_label)

      # show main windows
      self.win.show()
   
   def main(self):
      gtk.main()

if __name__ == '__main__':
   gui = GpsGui()
   gui.main()
