import RDF
import garmin
import xml.utils.iso8601

import garmin

m = RDF.Model()
wgs84 = RDF.NS("http://www.w3.org/2003/01/geo/wgs84_pos#")
dc = RDF.NS("http://purl.org/dc/elements/1.1/")
rdf = RDF.NS("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
gps = RDF.NS("http://hackdiary.com/ns/gps#")

print "Downloading tracks and waypoints, may take some time..."
# Create a 'physical layer' connection using serial port
phys = garmin.UnixSerialLink("/dev/ttyUSB0")

# Create a Garmin object using this connection
gps = garmin.Garmin(phys)

# Get the waypoints from the GPS
# (This may take a little while)
tracks = gps.getTracks()
waypoints = gps.getWaypoints()
print "Done..."

counter = 0
for track in tracks:
    hdr = track[0]
    name = hdr.trk_ident
    tracklog = RDF.Node(blank="t"+str(counter))
    m.add_statement(RDF.Statement(
        subject=tracklog,
        predicate=rdf.type,
        object=gps.Tracklog))
    m.add_statement(RDF.Statement(
        subject=tracklog,
        predicate=dc.title,
        object=RDF.Node(literal=name)))

    for point in track[1:]:
        tracknode = RDF.Node(blank="a"+str(counter))
        geopoint = RDF.Node(blank="gp"+str(counter))
        counter += 1

        m.add_statement(RDF.Statement(subject=tracklog,
            predicate=gps.trackpoint,
            object=geopoint))

        m.add_statement(RDF.Statement(subject=geopoint,
            predicate=dc.date,
            object=RDF.Node(
                literal=xml.utils.iso8601.tostring(point.time+garmin.TimeEpoch))))
        m.add_statement(RDF.Statement(subject=geopoint,
            predicate=rdf.type,
            object=wgs84.Point))
        m.add_statement(RDF.Statement(subject=geopoint,
            predicate=wgs84.lat,
            object=RDF.Node(literal=str(garmin.degrees(point.slat)))))
        m.add_statement(RDF.Statement(subject=geopoint,
            predicate=wgs84.long,
            object=RDF.Node(literal=str(garmin.degrees(point.slon)))))

for waypoint in waypoints:
    geopoint = RDF.Node(blank="w"+str(counter))
    counter += 1
    m.add_statement(RDF.Statement(subject=geopoint,
        predicate=rdf.type,
        object=wgs84.Point))
    m.add_statement(RDF.Statement(subject=geopoint,
        predicate=dc.title,
        object=RDF.Node(literal=waypoint.ident)))
    m.add_statement(RDF.Statement(subject=geopoint,
            predicate=wgs84.lat,
            object=RDF.Node(literal=str(garmin.degrees(waypoint.slat)))))
    m.add_statement(RDF.Statement(subject=geopoint,
        predicate=wgs84.long,
        object=RDF.Node(literal=str(garmin.degrees(waypoint.slon)))))

s = RDF.Serializer()
s.serialize_model_to_file("tracks.rdf",m)
print "RDF dump written to tracks.rdf"
