import sys

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from gui import GuiWidget
import socket
from grass import *
import os
import subprocess
import psycopg2
import time
import serial 
import string
from datetime import datetime

clon = 0
clat = 0
item = 'LookAt'
head = '0'

#gps = serial.Serial('/dev/tty.GarminGPS10-Gps10-1', 4800, timeout=1)


device = '/dev/tty.GarminGPS10-Gps10-1'

filepath = str('/Users/sasha/Desktop/gps/')

a = [str('LookAt'),str('Camera')]
rasterlist = list_strings('rast')
vectorlist = list_strings('vect')
regionlist = list_strings('region')
grassenv = gisenv()
rasterpath = grassenv['GISDBASE']+str('/')+grassenv['LOCATION_NAME']+str('/')+grassenv['MAPSET']+str('/cellhd/')
vectorpath = grassenv['GISDBASE']+str('/')+grassenv['LOCATION_NAME']+str('/')+grassenv['MAPSET']+str('/vector/')

#try:
#	conn = psycopg2.connect("dbname='geoname' user='postgres' host='localhost' password='tiamo'");
#except:
#	print "I am unable to connect to the database"
#curs = conn.cursor()

user = ''
dbname = ''
host = ''
passwd = ''

######################



class MyThread(QtCore.QThread):
    def __init__(self, parent = None):
        QtCore.QThread.__init__(self, parent)
        self.alive = 1
        self.running = 0
        self.n = 0
        self.crossData = ""
        self.GPSlatitude = ""
        self.GPSlongitude = ""
        self.GPSquality = ""
        self.GPSsat = ""
        self.GPStime = ""
        self.GPShdop = ""
        self.GPSspeed = ""
        self.GPSaltitude = ""
        self.GPSmagvar = ""
        self.GPSangle = ""
        self.GPSmsl = ""
        self.GPSdate = ""

    def run(self):
        while self.alive:
            step = 1
            n = 0
            while self.running:
                n += step
                #self.crossData = str(n)
                print n
                gps = serial.Serial(device, 4800, timeout=1)
                line = gps.readline()
                datablock = line.split(',')
                if line[0:6] == '$GPGGA':
                    quality = string.atof(datablock[6])
                    #sat = string.atof(datablock[7])
                    #hdop = string.atof(datablock[8])
                    #altitude = string.atof(datablock[9])
                    #msl = string.atof(datablock[11]) 
                    #self.GPSquality = str(quality)
                    #self.GPSsat = str(sat)
                    #self.GPShdop = str(hdop)
                    #self.GPSaltitude = str(altitude)
                    #self.GPSmsl = str(msl)
                if line[0:6] == '$GPRMC':
                    latitude_in = string.atof(datablock[3])
                    longitude_in = string.atof(datablock[5])
                    if datablock[4] == 'S':
                        latitude_in = -latitude_in
                    if datablock[6] == 'W':
                        longitude_in = -longitude_in
                    latitude_degrees = int(latitude_in/100)
                    latitude_minutes = latitude_in - latitude_degrees*100
                    longitude_degrees = int(longitude_in/100)
                    longitude_minutes = longitude_in - longitude_degrees*100
                    latitude = latitude_degrees + (latitude_minutes/60)
                    longitude = longitude_degrees + (longitude_minutes/60)
                    #speed_in = string.atof(datablock[7])
                    #utctime = string.atof(datablock[1])
                    #date = string.atof(datablock[9])
                    #mag_var = string.atof(datablock[10])
                    #heading = string.atof(datablock[8])

                    data = str(latitude)+str('-')+str(longitude)
                    self.crossData = str(data)
                    self.GPSlatitude = str(latitude)
                    self.GPSlongitude = str(longitude)
                    #self.GPStime = str(utctime)                    
                    #self.GPSspeed = str(speed)
                    #self.GPSmagvar = str(mag_var)
                    #self.GPSangle = str(heading)
                    #self.GPSdate = str(date)


                    
                self.emit(QtCore.SIGNAL("gpslat"), self.GPSlatitude)
                self.emit(QtCore.SIGNAL("gpslon"), self.GPSlongitude)
                self.emit(QtCore.SIGNAL("PySig"), self.crossData)
                #self.emit(QtCore.SIGNAL("gpsquality"), self.GPSquality)
                #self.emit(QtCore.SIGNAL("gpssat"), self.GPSsat)
                #self.emit(QtCore.SIGNAL("gpshdop"), self.GPShdop)
                #self.emit(QtCore.SIGNAL("gpsaltitude"), self.GPSaltitude)
                #self.emit(QtCore.SIGNAL("gpsmsl"), self.GPSmsl)
                #self.emit(QtCore.SIGNAL("gpstime"), self.GPStime)
                #self.emit(QtCore.SIGNAL("gpsspeed"), self.GPSspeed)
                #self.emit(QtCore.SIGNAL("gpsmagvar"), self.GPSmagvar)
                #self.emit(QtCore.SIGNAL("gpsangle"), self.GPSangle)
                #self.emit(QtCore.SIGNAL("gpsdate"), self.GPSdate)


                self.msleep(100)
            self.msleep(100)

    def toggle(self):
        self.running = not self.running
        self.emit(QtCore.SIGNAL("PySig"), self.crossData)
        self.emit(QtCore.SIGNAL("gpslat"), self.GPSlatitude)
        self.emit(QtCore.SIGNAL("gpslon"), self.GPSlongitude)
        #self.emit(QtCore.SIGNAL("gpsquality"), self.GPSquality)
        #self.emit(QtCore.SIGNAL("gpssat"), self.GPSsat)
        #self.emit(QtCore.SIGNAL("gpshdop"), self.GPShdop)
        #self.emit(QtCore.SIGNAL("gpsaltitude"), self.GPSaltitude)
        #self.emit(QtCore.SIGNAL("gpsmsl"), self.GPSmsl)
        #self.emit(QtCore.SIGNAL("gpstime"), self.GPStime)
        #self.emit(QtCore.SIGNAL("gpsspeed"), self.GPSspeed)
        #self.emit(QtCore.SIGNAL("gpsmagvar"), self.GPSmagvar)
        #self.emit(QtCore.SIGNAL("gpsangle"), self.GPSangle)
        #self.emit(QtCore.SIGNAL("gpsdate"), self.GPSdate)
    def stop(self):
        self.alive = 0



#######################

class MyClass(QObject):
	
    def init(self):
        global slvallat
        global slvallon
        self.Value=0
        self.ZoomValue = 0
        self.GPSlatitude = ""
        self.w = GuiWidget()
        self.connect(self.w.exit, SIGNAL("clicked()"), qApp, SLOT("quit()"))
        self.raster = self.RasterList()
        self.vector = self.VectorList()
        self.region = self.RegionList()
        self.w.InputRaster.addItems(self.raster)
        self.w.InputVector.addItems(self.vector)
        self.w.InputImage.addItems(self.raster)
        self.slvallon = self.setcenter()[0]
        self.slvallat = self.setcenter()[1]
        self.w.Lon.setText("0")
        self.w.Lat.setText("0")
        self.fxvallon = self.SetPosition()[0]
        self.fxvallat = self.SetPosition()[1]
        self.slstep = 1
        self.connect(self.w.GrassType, SIGNAL("currentIndexChanged(int)"),self.GetType)
        self.connect(self.w.ZoomSlider, SIGNAL("valueChanged(int)"), self.setValueZoomSpinBox)
        self.connect(self.w.ZoomSlider, SIGNAL("valueChanged(int)"), self.sendFunction)
        self.connect(self.w.ZoomSpinBox, SIGNAL("valueChanged(double)"), self.setValueZoomSlider)
        self.connect(self.w.ZoomSpinBox, SIGNAL("valueChanged(double)"), self.sendFunction)
        self.connect(self.w.ZoomSlider, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.ZoomSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.RangeSlider, SIGNAL("valueChanged(int)"), self.setValueRangeSpinBox)
        self.connect(self.w.RangeSlider, SIGNAL("valueChanged(int)"), self.sendFunction)
        self.connect(self.w.RangeSpinBox, SIGNAL("valueChanged(double)"), self.setValueRangeSlider)
        self.connect(self.w.RangeSpinBox, SIGNAL("valueChanged(double)"), self.sendFunction)
        self.connect(self.w.RangeSlider, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.RangeSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.RollSlider, SIGNAL("valueChanged(int)"), self.setValueRollSpinBox)
        self.connect(self.w.RollSlider, SIGNAL("valueChanged(int)"), self.sendFunction)
        self.connect(self.w.RollSpinBox, SIGNAL("valueChanged(double)"), self.setValueRollSlider)
        self.connect(self.w.RollSpinBox, SIGNAL("valueChanged(double)"), self.sendFunction)
        self.connect(self.w.RollSlider, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.RollSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.PitchSlider, SIGNAL("valueChanged(int)"), self.setValuePitchSpinBox)
        self.connect(self.w.PitchSlider, SIGNAL("valueChanged(int)"), self.sendFunction)
        self.connect(self.w.PitchSpinBox, SIGNAL("valueChanged(double)"), self.setValuePitchSlider)
        self.connect(self.w.PitchSpinBox, SIGNAL("valueChanged(double)"), self.sendFunction)
        self.connect(self.w.PitchSlider, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.PitchSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.HandlingSlider, SIGNAL("valueChanged(int)"), self.setValueHandlingSpinBox)
        self.connect(self.w.HandlingSlider, SIGNAL("valueChanged(int)"), self.sendFunction)
        self.connect(self.w.HandlingSpinBox, SIGNAL("valueChanged(double)"), self.setValueHandlingSlider)
        self.connect(self.w.HandlingSpinBox, SIGNAL("valueChanged(double)"), self.sendFunction)
        self.connect(self.w.HandlingSlider, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.HandlingSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.connect(self.w.SpeedSpinBox, SIGNAL("valueChanged(double)"), self.setValueSpeedSpinBox)
        self.connect(self.w.SpeedSpinBox, SIGNAL("valueChanged()"), self.setValue)
        self.w.north.setAutoRepeat(True)
        self.w.northeast.setAutoRepeat(True)
        self.w.south.setAutoRepeat(True)
        self.w.east.setAutoRepeat(True)
        self.w.west.setAutoRepeat(True)
        self.w.southwest.setAutoRepeat(True)
        self.w.northwest.setAutoRepeat(True)
        self.w.southeast.setAutoRepeat(True)
        self.connect(self.w.center, SIGNAL("clicked()"),self.ResetPosition)
        self.connect(self.w.north, SIGNAL("clicked()"),self.inclat)
        self.connect(self.w.northeast, SIGNAL("clicked()"),self.inclatlon)
        self.connect(self.w.south, SIGNAL("clicked()"),self.declat)
        self.connect(self.w.east, SIGNAL("clicked()"),self.inclon)
        self.connect(self.w.west, SIGNAL("clicked()"),self.declon)
        self.connect(self.w.southwest, SIGNAL("clicked()"),self.declatlon)
        self.connect(self.w.northwest, SIGNAL("clicked()"),self.inclatdeclon)
        self.connect(self.w.southeast, SIGNAL("clicked()"),self.declatinclon)
        self.connect(self.w.center, SIGNAL("clicked()"),self.setcenter)
        self.connect(self.w.Head, SIGNAL("currentIndexChanged(int)"),self.GetHead)
        self.connect(self.w.View, SIGNAL("currentIndexChanged(int)"),self.GetViewType)
        self.connect(self.w.State, SIGNAL("currentIndexChanged(int)"),self.GetState)
        self.connect(self.w.InputRaster, SIGNAL("currentIndexChanged(int)"),self.GetTile)
        self.connect(self.w.ExportElev, SIGNAL("clicked()"),self.test)
        self.connect(self.w.SendPosition, SIGNAL("clicked()"),self.SetLonLat)
        self.connect(self.w.SendPosition, SIGNAL("clicked()"),self.ResetPosition)
        self.thread = MyThread()
        self.thread.start()
        self.connect(self.w.StartGps, QtCore.SIGNAL("clicked()"), self.thread.toggle)
        self.connect(self.thread, QtCore.SIGNAL("PySig"), self.setCrossClassData)
        self.connect(self.thread, QtCore.SIGNAL("gpslat"), self.setCrossClassLat)
        self.connect(self.thread, QtCore.SIGNAL("gpslon"), self.setCrossClassLon)
        self.w.show()
        if self.w.Grass.isChecked():
            self.gps = serial.Serial('/dev/tty.GarminGPS10-Gps10-1', 4800, timeout=1)


    def setCrossClassData(self, value):
        self.CrossClassData = value
        GPSlat = value.split('-', 2)[0]
        GPSlon = value.split('-', 2)[1]
        print self.CrossClassData
        #self.w.GPSlat.setText(GPSlat)
        #self.w.GPSlon.setText(GPSlon)

    def setCrossClassLat(self, value):
        self.CrossClassLat = value
        self.w.GPSlat.setText(self.CrossClassLat)

    def setCrossClassLon(self, value):
        self.CrossClassLon = value
        self.w.GPSlon.setText(self.CrossClassLon)

    #def setCrossClassQuality(self, value):
    #    self.CrossClassQuality = value
    #    self.w.GPSQuality.setText(self.CrossClassQuality)

    #def setCrossClassSat(self, value):
    #    self.CrossClassSat = value
    #    self.w.GPSSat.setText(self.CrossClassSat)

    #def setCrossClassHdop(self, value):
    #    self.CrossClassHdop = value
    #    self.w.GPSHdop.setText(self.CrossClassHdop)

    #def setCrossClassAltitude(self, value):
    #    self.CrossClassAltitude = value
    #    self.w.GPSAltitude.setText(self.CrossClassAltitude)

    #def setCrossClassMsl(self, value):
    #    self.CrossClassMsl = value
    #    self.w.GPSMsl.setText(self.CrossClassMsl)

    #def setCrossClassTime(self, value):
    #    self.CrossClassTime = value
    #    self.w.GPSTime.setText(self.CrossClassTime)

    #def setCrossClassSpeed(self, value):
    #    self.CrossClassSpeed = value
    #    self.w.GPSSpeed.setText(self.CrossClassSpeed)

    #def setCrossClassMagvar(self, value):
    #    self.CrossClassMagvar = value
    #    self.w.GPSMagvar.setText(self.CrossClassMagvar)

    #def setCrossClassAngle(self, value):
    #    self.CrossClassAngle = value
    #    self.w.GPSAngle.setText(self.CrossClassAngle)

    #def setCrossClassDate(self, value):
    #    self.CrossClassDate = value
    #    self.w.GPSDate.setText(self.CrossClassDate)



    def setValueZoomSpinBox(self, z):
        self.ZoomValue = float(z)
        self.w.ZoomSpinBox.setRange(-100, 27536977)
        self.w.ZoomSpinBox.setSingleStep(1)
        self.w.ZoomSpinBox.setValue(self.ZoomValue)

    def setValueZoomSlider(self, z):
        self.ZoomValue = int(z)
        self.w.ZoomSlider.setMinimum(-100)
        self.w.ZoomSlider.setMaximum(27536977)
        self.w.ZoomSlider.setValue(self.ZoomValue)

    def setValueRangeSpinBox(self, r):
        self.RangeValue = float(r)
        self.w.RangeSpinBox.setRange(-100, 27536977)
        self.w.RangeSpinBox.setSingleStep(1)
        self.w.RangeSpinBox.setValue(self.RangeValue)

    def setValueRangeSlider(self, r):
        self.RangeValue = int(r)
        self.w.RangeSlider.setMinimum(-100)
        self.w.RangeSlider.setMaximum(27536977)
        self.w.RangeSlider.setValue(self.RangeValue)

    def setValueRollSpinBox(self, rl):
        self.RollValue = float(rl)
        self.w.RollSpinBox.setRange(-90, 90)
        self.w.RollSpinBox.setSingleStep(1)
        self.w.RollSpinBox.setValue(self.RollValue)

    def setValueRollSlider(self, rl):
        self.RollValue = int(rl)
        self.w.RollSlider.setMinimum(-90)
        self.w.RollSlider.setMaximum(90)
        self.w.RollSlider.setValue(self.RollValue)


    def setValuePitchSpinBox(self, p):
        self.PitchValue = float(p)
        self.w.PitchSpinBox.setRange(-90, 90)
        self.w.PitchSpinBox.setSingleStep(1)
        self.w.PitchSpinBox.setValue(self.PitchValue)

    def setValuePitchSlider(self, p):
        self.PitchValue = int(p)
        self.w.PitchSlider.setMinimum(-90)
        self.w.PitchSlider.setMaximum(90)
        self.w.PitchSlider.setValue(self.PitchValue)

    def setValueHandlingSpinBox(self, h):
        self.HandlingValue = float(h)
        self.w.HandlingSpinBox.setRange(-360, 360)
        self.w.HandlingSpinBox.setSingleStep(1)
        self.w.HandlingSpinBox.setValue(self.HandlingValue)

    def setValueHandlingSlider(self, h):
        self.HandlingValue = int(h)
        self.w.HandlingSlider.setMinimum(-360)
        self.w.HandlingSlider.setMaximum(360)
        self.w.HandlingSlider.setValue(self.HandlingValue)


    def setValueSpeedSpinBox(self, s):
        self.SpeedValue = float(s)
        self.w.SpeedSpinBox.setRange(0.01, 1)
        self.w.SpeedSpinBox.setSingleStep(0.01)
        self.w.SpeedSpinBox.setValue(self.SpeedValue)

    def GetHead(self,index):
        head = self.w.Head.itemText(index)
        if head == str('N'):
            head = str('0')
        if head == str('NE'):
            head = str('45') 
        if head == str('E'):
            head = str('90')
        if head == str('SE'):
            head = str('135')
        if head == str('S'):
            head = str('180')
        if head == str('SW'):
            head = str('-135')
        if head == str('W'):
            head = str('-90')
        if head == str('NW'):
            head = str('-45')
        if head == str('Auto'):
            head = str('angle')
        if head == str('Manual'):
            head = str('Manual')
        f = open(filepath+'HeadingMode', "w") 
        f.write(head)
        f.close


    def GetViewType(self,index):
        ViewT = self.w.View.itemText(index)
        return ViewT


    def GetState(self,index):
        State = self.w.State.itemText(index)
        print State
        f = open(filepath+'Run', "w")
        f.write(State)
        f.close


    def sendFunction(self):
        if self.w.Gps.isChecked():
            f = open(filepath+'Run', "w")
            f.write(str('start'))
            f.close
            f = open(filepath+'CameraSettings', "w")
            f.write(unicode(self.w.ZoomSlider.value())+str(" ")+unicode(self.w.HandlingSlider.value())+str(" ")+unicode(self.w.PitchSlider.value())+str(" ")+unicode(self.w.RollSlider.value())+str(" ")+unicode(self.w.RangeSlider.value())+str(" ")+item)
            f.close()
        else:
            f = open(filepath+'Run', "w")
            f.write(str('stop'))
            f.close
            R = open(filepath+'HeadingMode', "r")
            K = R.read()
            Y = K.rsplit(' ')
            T = len(Y)
            if T == 1:
                if str(Y[0]) == str('Manual'):
                    head = self.w.HandlingSlider.value()
                if str(Y[0]) != str('Manual'):
                    head = Y[0]
            if self.w.LonLat.isChecked():
                ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
                self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            if self.w.Grass.isChecked():
                ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
                self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ossim.connect(("127.0.0.1", 7000))
            ossim.send(ossimxml)
            ossim.close()
    


    def ResetPosition(self):
        if self.w.LonLat.isChecked():
            self.fxvallon = self.SetPosition()[0]
            self.fxvallat = self.SetPosition()[1]
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
        if self.w.Grass.isChecked():
            self.slvallon = self.setcenter()[0]
            self.slvallat = self.setcenter()[1]
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def inclat(self):
        step = float(self.w.SpeedSpinBox.value())
        #step = step * 0.1
        self.slvallat += step
        self.fxvallat += step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()
        #print testo

    def declat(self):
        step = float(self.w.SpeedSpinBox.value())
        self.slvallat -= step
        self.fxvallat -= step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()

    def inclon(self):
        step = float(self.w.SpeedSpinBox.value())
        self.slvallon += step
        self.fxvallon += step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()

    def declon(self):
        step = float(self.w.SpeedSpinBox.value())
        self.slvallon -= step
        self.fxvallon -= step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def inclatlon(self):
        step = float(self.w.SpeedSpinBox.value())
        #step = step * 0.1
        self.slvallat += step
        self.fxvallat += step
        self.slvallon += step
        self.fxvallon += step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def declatlon(self):
        step = float(self.w.SpeedSpinBox.value())
        #step = step * 0.1
        self.slvallat -= step
        self.fxvallat -= step
        self.slvallon -= step
        self.fxvallon -= step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()

    def inclatdeclon(self):
        step = float(self.w.SpeedSpinBox.value())
        #step = step * 0.1
        self.slvallat += step
        self.fxvallat += step
        self.slvallon -= step
        self.fxvallon -= step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def declatinclon(self):
        step = float(self.w.SpeedSpinBox.value())
        #step = step * 0.1
        self.slvallat -= step
        self.fxvallat -= step
        self.slvallon += step
        self.fxvallon += step
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        if self.w.LonLat.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.fxvallon), unicode(self.fxvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.fxvallat))
            self.w.Lon.setText(unicode(self.fxvallon))
        if self.w.Grass.isChecked():
            ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
            self.PrintPosition(unicode(self.slvallon), unicode(self.slvallat), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
            self.w.Lat.setText(unicode(self.slvallat))
            self.w.Lon.setText(unicode(self.slvallon))
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def SetLonLat(self):
        R = open(filepath+'HeadingMode', "r")
        K = R.read()
        Y = K.rsplit(' ')
        T = len(Y)
        if T == 1:
            if str(Y[0]) == str('Manual'):
                head = self.w.HandlingSlider.value()
            if str(Y[0]) != str('Manual'):
                head = Y[0]
        ossimxml = '<Set target=":navigator" vref="wgs84"><%s><longitude>%s</longitude><latitude>%s</latitude><altitude>%s</altitude><heading>%s</heading><pitch>%s</pitch><roll>%s</roll><altitudeMode>absolute</altitudeMode><range>%s</range></%s></Set>' % (item, unicode(self.w.Lon.text()), unicode(self.w.Lat.text()), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value(), item)
        self.PrintPosition(unicode(self.w.Lon.text()), unicode(self.w.Lat.text()), self.w.ZoomSlider.value(), head, self.w.PitchSlider.value() , self.w.RollSlider.value(),self.w.RangeSlider.value())
        ossim = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ossim.connect(("127.0.0.1", 7000))
        ossim.send(ossimxml)
        ossim.close()


    def setValue(self, v):
        self.Value = v

    def inc(self):
        self.Value += 1
        self.w.ZoomSlider.setValue(self.Value)
        self.w.ZoomSpinBox.setValue(self.Value)

    def dec(self):
        self.Value -= 1
        self.w.ZoomSlider.setValue(self.Value)
        self.w.ZoomSpinBox.setValue(self.Value)

    def setcenter(self):
        global centro
        clon = 0
        clat = 0
        s = read_command("g.region", flags='l')
        region = parse_key_val(s,':')
        clon = region['center longitude']
        clat = region['center latitude']
        clon = str(clon)
        clat = str(clat)
        clon = clon.replace(':'," ")
        clat = clat.replace(':'," ")
        if clat[-1] == 'N':
            signlat = 1
        if clat[-1] == 'S':
            signlat = -1
        if clon[-1] == 'E':
           signlon = 1
        if clon[-1] == 'W':
            signlon = -1
        clat = clat[:-1] 
        clon = clon[:-1]
        clat = [float(i) for i in clat.split()]
        clon = [float(i) for i in clon.split()]
        clat = (clat[0] + (clat[1] / 60) + clat[2] / 3600) * float(signlat)
        clon = (clon[0] + (clon[1] / 60) + clon[2] / 3600) * float(signlon)
        slvallon = clon 
        slvallat = clat
        centro = (clon,clat)
        return centro

    def SetPosition(self):
        global centro
        lon = float(self.w.Lon.text())
        lat = float(self.w.Lat.text())
        centro = (lon,lat)
        return centro

    def PrintPosition(self,lon, lat, zoom, roll, pitch, heading, range):
        testo = '''Longitude : %s 
Latitude : %s 
Altitude : %s
Heading : %s
Roll : %s
Pitch : %s
Range : %s
''' % (lon, lat, zoom, roll, pitch, heading, range)
        print testo


    def VectorList(self):
        global vector
        v = list_strings('vect')
        vector = []
        for i in v:
            vname = i.split('@', 2)[0]
            vector.append(vname)
        return vector

    def RasterList(self):
        global raster
        r = list_strings('rast')
        raster = []
        for i in r:
            rname = i.split('@', 2)[0]
            raster.append(rname)
        return raster

    def RegionList(self):
        global region
        rg = list_strings('region')
        region = []
        for i in rg:
            rgname = i.split('@', 2)[0]
            region.append(rgname)
        return region


    def GetType(self,index):
        Gtype = self.w.GrassType.itemText(index)
        if Gtype == str('region'):
            rg = list_strings('region')
            region = []
            for i in rg:
                rgname = i.split('@', 2)[0]
                region.append(rgname)
            self.w.InputType.clear()
            self.w.InputType.addItems(region)
        if Gtype == str('vector'):
            vc = list_strings('vect')
            vector = []
            for i in vc:
                vecname = i.split('@', 2)[0]
                vector.append(vecname)
            self.w.InputType.clear()
            self.w.InputType.addItems(vector)
        if Gtype == str('raster'):
            rs = list_strings('rast')
            raster = []
            for i in rs:
                rasname = i.split('@', 2)[0]
                raster.append(rasname)
            self.w.InputType.clear()
            self.w.InputType.addItems(raster)


    def printstep(self):
        print self.w.SpeedSpinBox.value()

    def test(self):
        print inputfile,tiling

    def GetTile(self,index):
        global tiling
        global inputfile
        inputfile = self.w.InputRaster.itemText(index)
        res = read_command("r.info", map=inputfile, flags='s')
        res = parse_key_val(res,'=')
        ewres = float(res['ewres'])
        nsres = float(res['nsres'])
        tiling = ((108000 + nsres)/ ewres )
        #return tiling
        print tiling
        print str('appezzotato')

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = MyClass()
    p.init()
    sys.exit(app.exec_())
