summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-15 18:16:07 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-15 18:16:07 -0700
commit5804c2970eaaf0215b9862f767cf7aa745083744 (patch)
tree4965a588e186f18a4eb75080f856ff711def6b8d
parent3a6652634b2152352f6f5a2b9ee3d549140ae337 (diff)
downloadsubsurface-5804c2970eaaf0215b9862f767cf7aa745083744.tar.gz
Support gps coordinates for the location info
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>
-rw-r--r--dive.h1
-rw-r--r--parse-xml.c16
-rw-r--r--save-xml.c29
3 files changed, 45 insertions, 1 deletions
diff --git a/dive.h b/dive.h
index 8503c3b93..abfd95174 100644
--- 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;
diff --git a/parse-xml.c b/parse-xml.c
index 6bb78fdf6..22ab8458e 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -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))
diff --git a/save-xml.c b/save-xml.c
index 42bd17e9f..e64b380a4 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -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");