profile: Plot sensor data from other dive computers

If the current dive computer doesn't have a sensor for the cylinder then
check if another dive computer has sensor data available and use that
for the plot.

Signed-off-by: Michael Andreen <michael@andreen.dev>
This commit is contained in:
Michael Andreen 2022-03-20 16:54:15 +01:00 committed by Dirk Hohndel
parent a363ad0910
commit 386a3a35bc

View file

@ -705,9 +705,27 @@ static void calculate_sac(const struct dive *dive, const struct divecomputer *dc
static void populate_secondary_sensor_data(const struct divecomputer *dc, struct plot_info *pi) static void populate_secondary_sensor_data(const struct divecomputer *dc, struct plot_info *pi)
{ {
UNUSED(dc); int *seen = calloc(pi->nr_cylinders, sizeof(*seen));
UNUSED(pi); for (int idx = 0; idx < pi->nr; ++idx)
for (int c = 0; c < pi->nr_cylinders; ++c)
if (get_plot_pressure_data(pi, idx, SENSOR_PR, c))
++seen[c]; // Count instances so we can differentiate a real sensor from just start and end pressure
int idx = 0;
/* We should try to see if it has interesting pressure data here */ /* We should try to see if it has interesting pressure data here */
for (int i = 0; i < dc->samples && idx < pi->nr; i++) {
struct sample *sample = dc->sample + i;
for (; idx < pi->nr; ++idx) {
if (idx == pi->nr - 1 || pi->entry[idx].sec >= sample->time.seconds)
// We've either found the entry at or just after the sample's time,
// or this is the last entry so use for the last sensor readings if there are any.
break;
}
for (int s = 0; s < MAX_SENSORS; ++s)
// Copy sensor data if available, but don't add if this dc already has sensor data
if (sample->sensor[s] != NO_SENSOR && seen[sample->sensor[s]] < 3 && sample->pressure[s].mbar)
set_plot_pressure_data(pi, idx, SENSOR_PR, sample->sensor[s], sample->pressure[s].mbar);
}
free(seen);
} }
/* /*
@ -807,13 +825,13 @@ static void setup_gas_sensor_pressure(const struct dive *dive, const struct dive
/* /*
* Here, we should try to walk through all the dive computers, * Here, we should try to walk through all the dive computers,
* and try to see if they have sensor data different from the * and try to see if they have sensor data different from the
* primary dive computer (dc). * current dive computer (dc).
*/ */
secondary = &dive->dc; secondary = &dive->dc;
do { do {
if (secondary == dc) if (secondary == dc)
continue; continue;
populate_secondary_sensor_data(dc, pi); populate_secondary_sensor_data(secondary, pi);
} while ((secondary = secondary->next) != NULL); } while ((secondary = secondary->next) != NULL);
free(seen); free(seen);