Import and merge GPS data from the webservice

Dive locations marked (and named) via the companion app are downloaded
from the webservice, parsed and merged with the existing dives.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2013-01-23 11:53:42 -08:00
parent b1db60ba47
commit c521aec884
4 changed files with 35 additions and 3 deletions

7
dive.c
View file

@ -1209,12 +1209,17 @@ static int max_time(duration_t a, duration_t b)
*/
static int likely_same_dive(struct dive *a, struct dive *b)
{
int fuzz, match;
int match, fuzz = 20 * 60;
/* Don't try to merge dives in different trips */
if (a->divetrip && b->divetrip && a->divetrip != b->divetrip)
return 0;
/* if one of the dives has no depth and duration this could be
* a location marker from the webservice */
if ((!a->maxdepth.mm && !a->duration.seconds) ||
(!b->maxdepth.mm && !b->duration.seconds))
return ((a->when <= b->when + fuzz) && (a->when >= b->when - fuzz));
/*
* Do some basic sanity testing of the values we
* have filled in during 'fixup_dive()'

5
main.c
View file

@ -165,7 +165,10 @@ void report_dives(gboolean is_imported, gboolean prefer_imported)
struct dive *dive = pp[1];
struct dive *merged;
if (prev->when + prev->duration.seconds < dive->when)
/* only try to merge overlapping dives - or if one of the dives has
* zero duration (that might be a gps marker from the webservice) */
if (prev->duration.seconds && dive->duration.seconds &&
prev->when + prev->duration.seconds < dive->when)
continue;
merged = try_to_merge(prev, dive, prefer_imported);

View file

@ -909,6 +909,22 @@ static degrees_t parse_degrees(char *buf, char **end)
return ret;
}
static void gps_lat(char *buffer, void *_dive)
{
char *end;
struct dive *dive = _dive;
dive->latitude = parse_degrees(buffer, &end);
}
static void gps_long(char *buffer, void *_dive)
{
char *end;
struct dive *dive = _dive;
dive->longitude = parse_degrees(buffer, &end);
}
static void gps_location(char *buffer, void *_dive)
{
char *end;
@ -984,8 +1000,14 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
return;
if (MATCH(".gps", gps_location, dive))
return;
if (MATCH(".latitude", gps_lat, dive))
return;
if (MATCH(".longitude", gps_long, dive))
return;
if (MATCH(".location", utf8_string, &dive->location))
return;
if (MATCH(".name", utf8_string, &dive->location))
return;
if (MATCH(".suit", utf8_string, &dive->suit))
return;
if (MATCH(".divesuit", utf8_string, &dive->suit))

View file

@ -198,7 +198,9 @@ void webservice_download_dialog(void)
result = gtk_dialog_run(GTK_DIALOG(dialog));
if (result == GTK_RESPONSE_ACCEPT) {
/* apply download */
g_message("\napply download should happen here: \n\n %s", state.xmldata);
/* g_message("\napply download should happen here: \n\n %s", state.xmldata); */
parse_xml_buffer(_("Webservice"), state.xmldata, strlen(state.xmldata), NULL);
report_dives(TRUE, FALSE);
}
download_dialog_release_xml(&state);
gtk_widget_destroy(dialog);