summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2018-04-03 11:52:46 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-04-03 11:52:46 -0700
commit7e73b30e974064235a9a52f543a3620eca0f20a7 (patch)
tree7ff86e1203c6ba075d722d49a5ce9419221c64d9
parentceaf26d198f9795fde5da43be6a904bc3c133a98 (diff)
downloadsubsurface-7e73b30e974064235a9a52f543a3620eca0f20a7.tar.gz
Revert "GPS: use applyGpsLocation::applyLocations from core"
This reverts commit 70e0e80de5470216df939f994ffda0222560def0. This caused the GPS workflow to break for Linus. Let's revert for 4.7.8 and figure out how to do this cleanup correctly, later. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--desktop-widgets/mainwindow.cpp4
-rw-r--r--desktop-widgets/subsurfacewebservices.cpp114
2 files changed, 115 insertions, 3 deletions
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp
index 4027c6d61..28366a8f1 100644
--- a/desktop-widgets/mainwindow.cpp
+++ b/desktop-widgets/mainwindow.cpp
@@ -101,8 +101,7 @@ MainWindow::MainWindow() : QMainWindow(),
actionPreviousDive(0),
helpView(0),
state(VIEWALL),
- survey(0),
- locationProvider(new GpsLocation(nullptr, this))
+ survey(0)
{
Q_ASSERT_X(m_Instance == NULL, "MainWindow", "MainWindow recreated!");
m_Instance = this;
@@ -867,6 +866,7 @@ void MainWindow::on_actionDownloadDC_triggered()
void MainWindow::on_actionDownloadWeb_triggered()
{
SubsurfaceWebServices dlg(this);
+
dlg.exec();
}
diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp
index 726e2540f..2aac39534 100644
--- a/desktop-widgets/subsurfacewebservices.cpp
+++ b/desktop-widgets/subsurfacewebservices.cpp
@@ -35,6 +35,118 @@
struct dive_table gps_location_table;
+// we don't overwrite any existing GPS info in the dive
+// so get the dive site and if there is none or there is one without GPS fix, add it
+static void copy_gps_location(struct dive *from, struct dive *to)
+{
+ struct dive_site *ds = get_dive_site_for_dive(to);
+ if (!ds || !dive_site_has_gps_location(ds)) {
+ struct dive_site *gds = get_dive_site_for_dive(from);
+ if (!ds) {
+ // simply link to the one created for the fake dive
+ to->dive_site_uuid = gds->uuid;
+ } else {
+ ds->latitude = gds->latitude;
+ ds->longitude = gds->longitude;
+ if (same_string(ds->name, ""))
+ ds->name = copy_string(gds->name);
+ }
+ }
+}
+
+#define SAME_GROUP 6 * 3600 // six hours
+#define SET_LOCATION(_dive, _gpsfix, _mark) \
+{ \
+ copy_gps_location(_gpsfix, _dive); \
+ changed ++; \
+ tracer = _mark; \
+}
+
+//TODO: C Code. static functions are not good if we plan to have a test for them.
+static bool merge_locations_into_dives(void)
+{
+ int i, j, tracer=0, changed=0;
+ struct dive *gpsfix, *nextgpsfix, *dive;
+
+ sort_table(&gps_location_table);
+
+ for_each_dive (i, dive) {
+ if (!dive_has_gps_location(dive)) {
+ for (j = tracer; (gpsfix = get_dive_from_table(j, &gps_location_table)) !=NULL; j++) {
+ if (time_during_dive_with_offset(dive, gpsfix->when, SAME_GROUP)) {
+ if (verbose)
+ qDebug() << "processing gpsfix @" << get_dive_date_string(gpsfix->when) <<
+ "which is withing six hours of dive from" <<
+ get_dive_date_string(dive->when) << "until" <<
+ get_dive_date_string(dive_endtime(dive));
+ /*
+ * If position is fixed during dive. This is the good one.
+ * Asign and mark position, and end gps_location loop
+ */
+ if (time_during_dive_with_offset(dive, gpsfix->when, 0)) {
+ if (verbose)
+ qDebug() << "gpsfix is during the dive, pick that one";
+ SET_LOCATION(dive, gpsfix, j);
+ break;
+ } else {
+ /*
+ * If it is not, check if there are more position fixes in SAME_GROUP range
+ */
+ if ((nextgpsfix = get_dive_from_table(j + 1, &gps_location_table)) &&
+ time_during_dive_with_offset(dive, nextgpsfix->when, SAME_GROUP)) {
+ if (verbose)
+ qDebug() << "look at the next gps fix @" << get_dive_date_string(nextgpsfix->when);
+ /* we know the gps fixes are sorted; if they are both before the dive, ignore the first,
+ * if theay are both after the dive, take the first,
+ * if the first is before and the second is after, take the closer one */
+ if (nextgpsfix->when < dive->when) {
+ if (verbose)
+ qDebug() << "which is closer to the start of the dive, do continue with that";
+ continue;
+ } else if (gpsfix->when > dive_endtime(dive)) {
+ if (verbose)
+ qDebug() << "which is even later after the end of the dive, so pick the previous one";
+ SET_LOCATION(dive, gpsfix, j);
+ break;
+ } else {
+ /* ok, gpsfix is before, nextgpsfix is after */
+ if (dive->when - gpsfix->when <= nextgpsfix->when - dive_endtime(dive)) {
+ if (verbose)
+ qDebug() << "pick the one before as it's closer to the start";
+ SET_LOCATION(dive, gpsfix, j);
+ break;
+ } else {
+ if (verbose)
+ qDebug() << "pick the one after as it's closer to the start";
+ SET_LOCATION(dive, nextgpsfix, j + 1);
+ break;
+ }
+ }
+ /*
+ * If no more positions in range, the actual is the one. Asign, mark and end loop.
+ */
+ } else {
+ if (verbose)
+ qDebug() << "which seems to be the best one for this dive, so pick it";
+ SET_LOCATION(dive, gpsfix, j);
+ break;
+ }
+ }
+ } else {
+ /* If position is out of SAME_GROUP range and in the future, mark position for
+ * next dive iteration and end the gps_location loop
+ */
+ if (gpsfix->when >= dive_endtime(dive) + SAME_GROUP) {
+ tracer = j;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return changed > 0;
+}
+
// TODO: This looks like should be ported to C code. or a big part of it.
bool DivelogsDeWebServices::prepare_dives_for_divelogs(const QString &tempfile, const bool selected)
{
@@ -315,7 +427,7 @@ void SubsurfaceWebServices::buttonClicked(QAbstractButton *button)
ds->notes = strdup("SubsurfaceWebservice");
}
/* now merge the data in the gps_location table into the dive_table */
- if (GpsLocation::instance()->applyLocations()) {
+ if (merge_locations_into_dives()) {
changed = true;
mark_divelist_changed(true);
MainWindow::instance()->information()->updateDiveInfo();