diff --git a/dive.c b/dive.c index 4e81f8a70..8e51351fb 100644 --- a/dive.c +++ b/dive.c @@ -1860,6 +1860,11 @@ static int match_dc_dive(struct divecomputer *a, struct divecomputer *b) return 0; } +static bool new_without_trip(struct dive *a) +{ + return a->downloaded && !a->divetrip; +} + /* * Do we want to automatically try to merge two dives that * look like they are the same dive? @@ -1893,9 +1898,16 @@ static int likely_same_dive(struct dive *a, struct dive *b) { 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; + /* Don't try to merge dives with different trip information */ + if (a->divetrip != b->divetrip) { + /* + * Exception: if the dive is downloaded without any + * explicit trip information, we do want to merge it + * with existing old dives even if they have trips. + */ + if (!new_without_trip(a) && !new_without_trip(b)) + return 0; + } /* * Do some basic sanity testing of the values we diff --git a/libdivecomputer.c b/libdivecomputer.c index 0011a201d..401fd8a6f 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -515,6 +515,13 @@ static int dive_cb(const unsigned char *data, unsigned int size, dive->dc.sample[0].temperature.mkelvin = 0; } + if (devdata->create_new_trip) { + if (!devdata->trip) + devdata->trip = create_and_hookup_trip_from_dive(dive); + else + add_dive_to_trip(dive, devdata->trip); + } + dive->downloaded = true; record_dive(dive); mark_divelist_changed(true); diff --git a/libdivecomputer.h b/libdivecomputer.h index d9c5ac90a..f277e298f 100644 --- a/libdivecomputer.h +++ b/libdivecomputer.h @@ -23,8 +23,10 @@ typedef struct device_data_t uint32_t deviceid, diveid; dc_device_t *device; dc_context_t *context; + struct dive_trip *trip; int preexisting; bool force_download; + bool create_new_trip; bool libdc_log; bool libdc_dump; FILE *libdc_logfile; diff --git a/qt-ui/downloadfromdivecomputer.cpp b/qt-ui/downloadfromdivecomputer.cpp index d2a5fae1c..fe5d4ee9a 100644 --- a/qt-ui/downloadfromdivecomputer.cpp +++ b/qt-ui/downloadfromdivecomputer.cpp @@ -284,6 +284,8 @@ void DownloadFromDCWidget::on_ok_clicked() data.descriptor = descriptorLookup[ui.vendor->currentText() + ui.product->currentText()]; data.force_download = ui.forceDownload->isChecked(); + data.create_new_trip = ui.createNewTrip->isChecked(); + data.trip = NULL; data.deviceid = data.diveid = 0; set_default_dive_computer(data.vendor, data.product); set_default_dive_computer_device(data.devname); @@ -413,6 +415,7 @@ void DownloadFromDCWidget::markChildrenAsDisabled() ui.vendor->setDisabled(true); ui.product->setDisabled(true); ui.forceDownload->setDisabled(true); + ui.createNewTrip->setDisabled(true); ui.preferDownloaded->setDisabled(true); ui.ok->setDisabled(true); ui.search->setDisabled(true); @@ -428,6 +431,7 @@ void DownloadFromDCWidget::markChildrenAsEnabled() ui.vendor->setDisabled(false); ui.product->setDisabled(false); ui.forceDownload->setDisabled(false); + ui.createNewTrip->setDisabled(false); ui.preferDownloaded->setDisabled(false); ui.ok->setDisabled(false); ui.cancel->setDisabled(false); diff --git a/qt-ui/downloadfromdivecomputer.ui b/qt-ui/downloadfromdivecomputer.ui index e99782ee8..9ea85afc8 100644 --- a/qt-ui/downloadfromdivecomputer.ui +++ b/qt-ui/downloadfromdivecomputer.ui @@ -74,7 +74,7 @@ - + @@ -105,41 +105,48 @@ - + 24 - + Save libdivecomputer logfile - + Save libdivecomputer dumpfile - + ... - + ... + + + + Download into new trip + + +