#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
usage: gegps [-i] [-d kmldir]

Feed location data from a running GPSD to a Google Earth instance.
The -d argument is the location of the Google Earth installation
directory.  If not specified, it defaults to the current directory.

If you have the free (non-subscription) version, start by running with
the -i option to drop a clue in the Google Earth installation directory,
as 'Open_in_Google_Earth_RT_GPS.kml', then open that file in Places
(File > Open...),

The basic recipe is here:
http://tjworld.net/wiki/Linux/Ubuntu/GoogleEarthPlusRealTimeGPS

This code originally by Jaroslaw Zachwieja and a guy referring
to himself/herself as TJ(http://tjworld.net)
Modified by Chen Wei <weichen302@aol.com> for use with gpsd
Cleaned up and adapted for the GPSD project by Eric S. Raymond.
'''

# This code runs compatibly under Python 2 and 3.x for x >= 2.
# Preserve this property!
from __future__ import absolute_import, print_function, division

import getopt
import os
import socket     # for socket.error
import sys

# pylint wants local modules last
try:
    import gps
except ImportError as e:
    sys.stderr.write(
        "gegps: can't load Python gps libraries -- check PYTHONPATH.\n")
    sys.stderr.write("%s\n" % e)
    sys.exit(1)

gps_version = '3.20'
if gps.__version__ != gps_version:
    sys.stderr.write("gegps: ERROR: need gps module version %s, got %s\n" %
                     (gps_version, gps.__version__))
    sys.exit(1)

KML_OPEN_IN_GE = '''\
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<NetworkLink>
        <name>Realtime GPS</name>
        <open>1</open>
        <Link>
                <href>Realtime_GPS.kml</href>
                <refreshMode>onInterval</refreshMode>
        </Link>
</NetworkLink>
</kml>
'''


def kmlize(tpv):
    '''http://code.google.com/apis/kml/documentation/kmlreference.html
       for official kml document'''
    latitude = tpv['lat']
    longitude = tpv['lon']

    # not all TPV includes speed, like when acquiring fix
    if 'speed' in tpv:
        speed_in = tpv['speed']               # meter/second
        speed = speed_in * gps.MPS_TO_KPH     # Km/h
    else:
        speed = 0

    # not all TPV includes heading, like when acquiring fix
    if speed >= 1 and 'track' in tpv:
        heading = int(round(tpv['track'], 0))
    else:
        heading = 0

    # not all TPV includes altitude
    # like ublox8 in fixed position (time) mode
    if 'alt' in tpv:
        altitude = tpv['alt']
    else:
        altitude = 0

    return """<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Placemark>
    <name>%s km/h,heading %s</name>
    <description>Realtime GPS feeding</description>
    <LookAt>
        <longitude>%s</longitude>
        <latitude>%s</latitude>
    </LookAt>
    <Point>
        <coordinates>%s,%s,%s</coordinates>
    </Point>
</Placemark>
</kml>""" % (speed, heading, longitude, latitude, longitude,
             latitude, altitude)


if __name__ == "__main__":
    def usage():
        "Print usage and exit"
        sys.stderr.write("usage: gegps: [-d] [-h] [-i] [-V]\n\n"
                         "    -d directory  Location of Google Earth\n"
                         "    -h            Print this help and exit\n"
                         "    -i\n"
                         "    -V            Print version and exit\n")
        sys.exit(0)

    kmldir = "."
    initialize = False
    (options, arguments) = getopt.getopt(sys.argv[1:], "d:hiV")
    for (opt, arg) in options:
        if opt == '-d':
            kmldir = arg
        elif opt == '-h':
            usage()
        elif opt == '-i':
            initialize = True
        elif opt == '-V':
            sys.stderr.write("gegps: Version %s\n" % gps_version)
            sys.exit(0)

    try:
        session = gps.gps()
    except socket.error:
        sys.stderr.write("gegps: Could not connect to gpsd daemon\n")
        sys.exit(1)

    session.stream(gps.WATCH_ENABLE)

    if initialize:
        f = open(os.path.join(kmldir, 'Open_in_Google_Earth_RT_GPS.kml'), 'w')
        f.write(KML_OPEN_IN_GE)
        f.close()
    else:
        try:
            while True:
                report = session.next()
                if report['class'] == 'TPV':
                    f = open(os.path.join(kmldir, 'Realtime_GPS.kml'), 'w')
                    f.write(kmlize(report))
                    f.close()
        except StopIteration:
            pass
        except KeyboardInterrupt:
            print('gegps stopped ')

# end
