#!/usr/bin/python

import sys

import socket, string
import os
import time
import locale


gpsaddr = 'localhost'
gpsport = 2947
maxreads = 10
showmap = 0

urlfile = '/etc/gpsclient.url'

global gpsd

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

# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859

def recv_timeout(the_socket,timeout=2):
    the_socket.setblocking(0)
    total_data=[];data='';begin=time.time()
    while 1:
        #if you got some data, then break after wait sec
        if total_data and time.time()-begin>timeout:
            break
        #if you got no data at all, wait a little longer
        elif time.time()-begin>timeout*2:
            break
        try:
            data=the_socket.recv(1024)
            if data:
                total_data.append(data)
                begin=time.time()
            else:
                time.sleep(0.1)
        except:
            pass
    return ''.join(total_data)

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

# Parse args
if len(sys.argv) > 1:
    argno = 1
    if sys.argv[argno] == '-m':
    	showmap = 1
    	argno += 1

    if len(sys.argv) > argno:
	gpsaddr = sys.argv[argno]



print "Connecting to gps..."

gpsd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
	gpsd.connect( (gpsaddr, gpsport) )
except socket.error:
	gpsd.close()
	print "Cannot connect to gps"
	sys.exit(2)
else:
	gpsd.send("p\n")
	line = recv_timeout(gpsd, 2)
	if len(line) < 2:
		print "No output from GPS daemon - is it using the correct port?"
		sys.exit(2)

	fields = string.split(line, ',')

	reads = 1

	# Loop until line contains good data
	while fields[1][2] == '?' :

	    if reads >= maxreads:
	    	print "Cannot read coordinates from GPS"
		sys.exit(2)

	    reads = reads + 1
	    time.sleep(1)
	    gpsd.send("p\n")
	    line = recv_timeout(gpsd, 2)
	    fields = string.split(line, ',')

	gpsd.close()

	line = string.lstrip( fields[1], 'P=')
	fields = string.split(line )

	lat = locale.atof(fields[0])
	long = locale.atof(fields[1])

	print "Latitude: %2.4f   Longitude: %2.4f" %(lat,long)

	# Read URL format string from file
	f=open(urlfile, 'r')
	urlstring=f.readline()
	f.close()
	urlstring=string.rstrip(urlstring, '\n')

	if showmap == 1:
	    print "Calling browser"

	    #os.system("dillo -g 620x470+0+0 http://www.mapquest.com/maps/map.adp?" + 
	    #"searchtype=address" +
	    #"\&formtype=latlong\&latlongtype=decimal\&latitude=%2.4f" +
	    #"\&longitude=%2.4f 2>&1 >/dev/null &" %(lat,long) )

	    mapcmd = "dillo -g 620x470+0+0 " + urlstring + " 2>&1 >/dev/null"
	    os.system(mapcmd %(lat,long) )
