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 = {}; free_dps(&diveplan); diveplan.when = d->when; // is this a "new" dive where we marked manually entered samples? // if yes then the first sample should be marked // 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 = false; if (d->dc.samples) hasMarkedSamples = d->dc.sample[0].manually_entered; // 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) { int cylinderid = get_cylinderid_at_time(d, &d->dc, lasttime); addStop(depthsum / samplecount, newtime.seconds, cylinderid, 0, true); lasttime = newtime; depthsum = 0; samplecount = 0; } } recalc = oldRec; emitDataChanged(); }
void DivePlannerPointsModel::loadFromDive(dive *d) { int depthsum = 0; int samplecount = 0; o2pressure_t last_sp; bool oldRec = recalc; struct divecomputer *dc = &(d->dc); recalc = false; CylindersModel::instance()->updateDive(); duration_t lasttime = {}; duration_t lastrecordedtime = {}; duration_t newtime = {}; free_dps(&diveplan); if (mode != PLAN) clear(); diveplan.when = d->when; // is this a "new" dive where we marked manually entered samples? // if yes then the first sample should be marked // 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 = false; if (dc->samples) hasMarkedSamples = dc->sample[0].manually_entered; else dc = fake_dc(dc, true); // 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 = dc->samples <= 100 ? dc->samples : 100; int j = 0; int cylinderid = 0; last_sp.mbar = 0; for (int i = 0; i < plansamples - 1; i++) { while (j * plansamples <= i * dc->samples) { const sample &s = dc->sample[j]; if (s.time.seconds != 0 && (!hasMarkedSamples || s.manually_entered)) { depthsum += s.depth.mm; last_sp = s.setpoint; ++samplecount; newtime = s.time; } j++; } if (samplecount) { cylinderid = get_cylinderid_at_time(d, dc, lasttime); if (newtime.seconds - lastrecordedtime.seconds > 10) { addStop(depthsum / samplecount, newtime.seconds, cylinderid, last_sp.mbar, true); lastrecordedtime = newtime; } lasttime = newtime; depthsum = 0; samplecount = 0; } } // make sure we get the last point right so the duration is correct if (!hasMarkedSamples) addStop(0, d->dc.duration.seconds,cylinderid, last_sp.mbar, true); recalc = oldRec; emitDataChanged(); }