I don't know about other dive computers, but the Suunto Vyper Air is
slow as hell to import all the dives from. And libdivecomputer seems to
be importing dives "most recent first", so this just makes it stop
importing dives when it finds a dive that we've already seen.
Caveat: libdivecomputer has this fancy notion of "dive fingerprints",
and claims that's the way to do things. That seems to be overly
complicated, and not worth the bother.
If you worry about the import finishing early due to already having some
dives with the same date in your dive list, just import starting from an
empty state, and thus get a pure "dive computer only" state with no
early out. Then you can just load the old dives afterwards, and depend
on subsurface merging any duplicates.
But for normal operation, when you just want to import a couple of new
dives from your dive computer, the "exit import early when you see a
duplicate" is the right thing to do.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
return parser_samples_foreach(parser, sample_cb, divep);
}
return parser_samples_foreach(parser, sample_cb, divep);
}
+/*
+ * Check if this dive already existed before the import
+ */
+static int find_dive(struct dive *dive, device_data_t *devdata)
+{
+ int i;
+
+ for (i = 0; i < devdata->preexisting; i++) {
+ struct dive *old = dive_table.dives[i];
+
+ if (dive->when != old->when)
+ continue;
+ return 1;
+ }
+ return 0;
+}
+
static int dive_cb(const unsigned char *data, unsigned int size,
const unsigned char *fingerprint, unsigned int fsize,
void *userdata)
static int dive_cb(const unsigned char *data, unsigned int size,
const unsigned char *fingerprint, unsigned int fsize,
void *userdata)
parser_destroy(parser);
return rc;
}
parser_destroy(parser);
return rc;
}
+
+ /* If we already saw this dive, abort. */
+ if (find_dive(dive, devdata))
+ return 0;
+
+ record_dive(dive);
return 1;
}
static device_status_t import_device_data(device_t *device, device_data_t *devicedata)
{
return 1;
}
static device_status_t import_device_data(device_t *device, device_data_t *devicedata)
{
+ devicedata->preexisting = dive_table.nr;
return device_foreach(device, dive_cb, devicedata);
}
return device_foreach(device, dive_cb, devicedata);
}
progressbar_t progress;
device_devinfo_t devinfo;
device_clock_t clock;
progressbar_t progress;
device_devinfo_t devinfo;
device_clock_t clock;
} device_data_t;
struct device_list {
} device_data_t;
struct device_list {