From ec79ffdefd466d1e4a07fddfab04cdd8d3334892 Mon Sep 17 00:00:00 2001 From: "Robert C. Helling" Date: Thu, 7 May 2015 22:59:12 +0200 Subject: [PATCH 1/2] Only warn when trying to replan a logged dive If there are more than 100 samples, average some of them so we end up with no more than 100. Signed-off-by: Robert C. Helling --- planner.c | 2 +- qt-ui/diveplanner.cpp | 31 ++++++++++++++++++++++++------- qt-ui/mainwindow.cpp | 5 +++-- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/planner.c b/planner.c index 9de6a21..af1db50 100644 --- a/planner.c +++ b/planner.c @@ -520,7 +520,7 @@ static unsigned int *sort_stops(int *dstops, int dnr, struct gaschanges *gstops, static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_disclaimer, int error) { - char buffer[20000], temp[1000]; + char buffer[2000000], temp[100000]; int len, lastdepth = 0, lasttime = 0, lastsetpoint = -1, newdepth = 0, lastprintdepth = 0; struct divedatapoint *dp = diveplan->dp; bool gaschange = !plan_verbatim, postponed = plan_verbatim; diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index a5b6e1e..42570da 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -92,10 +92,13 @@ void DivePlannerPointsModel::setupStartTime() void DivePlannerPointsModel::loadFromDive(dive *d) { + int depthsum = 0; + int samplecount = 0; bool oldRec = recalc; recalc = false; CylindersModel::instance()->updateDive(); duration_t lasttime = {}; + duration_t newtime = {}; struct gasmix gas; free_dps(&diveplan); diveplan.when = d->when; @@ -104,13 +107,27 @@ void DivePlannerPointsModel::loadFromDive(dive *d) // if it is we only add the manually entered samples as waypoints to the diveplan // otherwise we have to add all of them bool hasMarkedSamples = d->dc.sample[0].manually_entered; - for (int i = 0; i < d->dc.samples - 1; i++) { - const sample &s = d->dc.sample[i]; - if (s.time.seconds == 0 || (hasMarkedSamples && !s.manually_entered)) - continue; - get_gas_at_time(d, &d->dc, lasttime, &gas); - plannerModel->addStop(s.depth.mm, s.time.seconds, &gas, 0, true); - lasttime = s.time; + // if this dive has more than 100 samples (so it is probably a logged dive), + // average samples so we end up with a total of 100 samples. + int plansamples = d->dc.samples <= 100 ? d->dc.samples : 100; + int j = 0; + for (int i = 0; i < plansamples - 1; i++) { + while (j * plansamples <= i * d->dc.samples) { + const sample &s = d->dc.sample[j]; + if (s.time.seconds != 0 && (!hasMarkedSamples || s.manually_entered)) { + depthsum += s.depth.mm; + ++samplecount; + newtime = s.time; + } + j++; + } + if (samplecount) { + get_gas_at_time(d, &d->dc, lasttime, &gas); + plannerModel->addStop(depthsum / samplecount, newtime.seconds, &gas, 0, true); + lasttime = newtime; + depthsum = 0; + samplecount = 0; + } } recalc = oldRec; emitDataChanged(); diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 23f9551..970c0f7 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -596,8 +596,9 @@ void MainWindow::on_actionReplanDive_triggered() if (!plannerStateClean() || !current_dive || !current_dive->dc.model) return; else if (strcmp(current_dive->dc.model, "planned dive")) { - QMessageBox::warning(this, tr("Warning"), tr("trying to replan a dive that's not a planned dive.")); - return; + if (QMessageBox::warning(this, tr("Warning"), tr("trying to replan a dive that's not a planned dive."), + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) + return; } // put us in PLAN mode DivePlannerPointsModel::instance()->clear(); -- 1.9.5 (Apple Git-50.3)