]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Support gps coordinates for the location info
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Sep 2011 01:16:07 +0000 (18:16 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Sep 2011 01:16:07 +0000 (18:16 -0700)
Sadly, no way to show them yet.  But it would be nice to let people
enter them (and it would be doubly nice to have a dive computer that
does it at the surface), and then perhaps just do the "point browser at
google maps" thing.

Saving/parsing tested by hand-feeding the location of Enenui (Molokini
Crater) from google maps by hand into my divelog.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
dive.h
parse-xml.c
save-xml.c

diff --git a/dive.h b/dive.h
index 8503c3b933518a66bd9e227838136bf19ee73f08..abfd95174f60c63ccbfd415e5bca2e98c5e57b2f 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -133,6 +133,7 @@ struct dive {
        char *location;
        char *notes;
        char *divemaster, *buddy;
+       double latitude, longitude;
        depth_t maxdepth, meandepth;
        duration_t duration, surfacetime;
        depth_t visibility;
index 6bb78fdf6077e1db2a85ee6ee194e5793c8ae802..22ab8458e1f5871d932d4d5666c5df7ccc1a94dc 100644 (file)
@@ -882,6 +882,20 @@ static int uddf_dive_match(struct dive *dive, const char *name, int len, char *b
                0;
 }
 
+static void gps_location(char *buffer, void *_dive)
+{
+       int i;
+       struct dive *dive = _dive;
+       double latitude, longitude;
+
+       i = sscanf(buffer, "%lf %lf", &latitude, &longitude);
+       if (i == 2) {
+               dive->latitude = latitude;
+               dive->longitude = longitude;
+       }
+       free(buffer);
+}
+
 /* We're in the top-level dive xml. Try to convert whatever value to a dive value */
 static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
 {
@@ -950,6 +964,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
                return;
        if (MATCH(".cylinderendpressure", pressure, &dive->cylinder[0].end))
                return;
+       if (MATCH(".gps", gps_location, dive))
+               return;
        if (MATCH(".location", utf8_string, &dive->location))
                return;
        if (MATCH(".notes", utf8_string, &dive->notes))
index 42bd17e9faae65228fe6f759405c2e4da6731e91..e64b380a48076ccbee46a0f7075b14c93675133f 100644 (file)
@@ -147,12 +147,39 @@ static void save_temperatures(FILE *f, struct dive *dive)
        fputs(" />\n", f);
 }
 
+static void show_location(FILE *f, struct dive *dive)
+{
+       char buffer[80];
+       const char *prefix = "  <location>";
+       double latitude = dive->latitude;
+       double longitude = dive->longitude;
+
+       /*
+        * Ok, theoretically I guess you could dive at
+        * exactly 0,0. But we don't support that. So
+        * if you do, just fudge it a bit, and say that
+        * you dove a few meters away.
+        */
+       if (latitude || longitude) {
+               int len = snprintf(buffer, sizeof(buffer)-4,
+                       "  <location gps='%f %f'>",
+                       latitude, longitude);
+               if (!dive->location) {
+                       memcpy(&buffer[len-1], "/>\n", 4);
+                       fputs(buffer, f);
+                       return;
+               }
+               prefix = buffer;
+       }
+       show_utf8(f, dive->location, prefix,"</location>\n");
+}
+
 static void save_overview(FILE *f, struct dive *dive)
 {
        save_depths(f, dive);
        save_temperatures(f, dive);
        show_duration(f, dive->surfacetime, "  <surfacetime>", "</surfacetime>\n");
-       show_utf8(f, dive->location, "  <location>","</location>\n");
+       show_location(f, dive);
        show_utf8(f, dive->divemaster, "  <divemaster>","</divemaster>\n");
        show_utf8(f, dive->buddy, "  <buddy>","</buddy>\n");
        show_utf8(f, dive->notes, "  <notes>","</notes>\n");