diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2012-12-05 14:35:49 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-12-05 14:39:13 -0800 |
commit | c1aacc05d108b8a872edc10579196a67955b38b7 (patch) | |
tree | b56ecc8e4eee36e633d10d2cfa4633144e5e27b9 /libdivecomputer.c | |
parent | afb53e387b53e482df25889608a8777fbc9ad0ae (diff) | |
download | subsurface-c1aacc05d108b8a872edc10579196a67955b38b7.tar.gz |
Fix deco/ndl support for libdivecomputer
Several blatant mistakes prevented this from ever working.
Now we correctly record ndl / stoptime / stopdepth in every sample and no
longer issue bogus events.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'libdivecomputer.c')
-rw-r--r-- | libdivecomputer.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/libdivecomputer.c b/libdivecomputer.c index 2162c0fff..ca91dc892 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -22,6 +22,7 @@ static const char *progress_bar_text = ""; static double progress_bar_fraction = 0.0; +static int stoptime, stopdepth, ndl; static GError *error(const char *fmt, ...) { @@ -87,7 +88,6 @@ static void handle_event(struct divecomputer *dc, struct sample *sample, dc_samp }; const int nr_events = sizeof(events) / sizeof(const char *); const char *name; - static int stoptime = 0, stopdepth = 0, ndl = 0; /* * Just ignore surface events. They are pointless. What "surface" * means depends on the dive computer (and possibly even settings @@ -105,7 +105,7 @@ static void handle_event(struct divecomputer *dc, struct sample *sample, dc_samp /* packed value - time in seconds in high 16 bit * depth in m(!) in low 16 bits */ stoptime = value.event.value >> 16; - stopdepth = (value.event.value && 0xFFFF) * 1000; + stopdepth = (value.event.value & 0xFFFF) * 1000; ndl = 0; } if (value.event.type == SAMPLE_EVENT_NDL) { @@ -113,9 +113,9 @@ static void handle_event(struct divecomputer *dc, struct sample *sample, dc_samp stoptime = 0; ndl = value.event.value; } - sample->stoptime.seconds = stoptime; - sample->stopdepth.mm = stopdepth; - sample->ndl.seconds = ndl; + if (value.event.type == SAMPLE_EVENT_DECOSTOP || value.event.type == SAMPLE_EVENT_NDL) + /* don't create a Subsurface event for these */ + return; #endif /* @@ -148,6 +148,11 @@ sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata) switch (type) { case DC_SAMPLE_TIME: + if (sample) { + sample->ndl.seconds = ndl; + sample->stoptime.seconds = stoptime; + sample->stopdepth.mm = stopdepth; + } sample = prepare_sample(dc); sample->time.seconds = value.time; finish_sample(dc); @@ -290,6 +295,9 @@ static int dive_cb(const unsigned char *data, unsigned int size, struct tm tm; struct dive *dive; + /* reset the deco / ndl data */ + ndl = stoptime = stopdepth = 0; + rc = create_parser(devdata, &parser); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, _("Unable to create parser for %s %s"), devdata->vendor, devdata->product); |