summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.c83
-rw-r--r--core/dive.h2
-rw-r--r--core/libdivecomputer.c41
3 files changed, 85 insertions, 41 deletions
diff --git a/core/dive.c b/core/dive.c
index 8270c5478..42ef687ef 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -35,6 +35,89 @@ const char *cylinderuse_text[] = {
};
const char *divemode_text[] = { "OC", "CCR", "PSCR", "Freedive" };
+/*
+ * Adding a cylinder pressure sample field is not quite as trivial as it
+ * perhaps should be.
+ *
+ * We try to keep the same sensor index for the same sensor, so that even
+ * if the dive computer doesn't give pressure information for every sample,
+ * we don't move pressure information around between the different sensor
+ * indexes.
+ *
+ * The "prepare_sample()" function will always copy the sensor indices
+ * from the previous sample, so the indexes are pre-populated (but the
+ * pressures obviously are not)
+ */
+void add_sample_pressure(struct sample *sample, int sensor, int mbar)
+{
+ int idx;
+
+ if (!mbar)
+ return;
+
+ /* Do we already have a slot for this sensor */
+ for (idx = 0; idx < MAX_SENSORS; idx++) {
+ if (sensor != sample->sensor[idx])
+ continue;
+ sample->pressure[idx].mbar = mbar;
+ return;
+ }
+
+ /* Pick the first unused index if we couldn't reuse one */
+ for (idx = 0; idx < MAX_SENSORS; idx++) {
+ if (sample->pressure[idx].mbar)
+ continue;
+ sample->sensor[idx] = sensor;
+ sample->pressure[idx].mbar = mbar;
+ return;
+ }
+
+ /* We do not have enough slots for the pressure samples. */
+ /* Should we warn the user about dropping pressure data? */
+}
+
+/*
+ * The legacy format for sample pressures has a single pressure
+ * for each sample that can have any sensor, plus a possible
+ * "o2pressure" that is fixed to the Oxygen sensor for a CCR dive.
+ *
+ * For more complex pressure data, we have to use explicit
+ * cylinder indexes for each sample.
+ *
+ * This function returns a negative number for "no legacy mode",
+ * or a non-negative number that indicates the o2 sensor index.
+ */
+int legacy_format_o2pressures(struct dive *dive, struct divecomputer *dc)
+{
+ int i, o2sensor;
+
+ o2sensor = (dc->divemode == CCR) ? get_cylinder_idx_by_use(dive, OXYGEN) : -1;
+ for (i = 0; i < dc->samples; i++) {
+ struct sample *s = dc->sample + i;
+ int seen_pressure = 0, idx;
+
+ for (idx = 0; idx < MAX_SENSORS; idx++) {
+ int sensor = s->sensor[idx];
+ pressure_t p = s->pressure[idx];
+
+ if (!p.mbar)
+ continue;
+ if (sensor == o2sensor)
+ continue;
+ if (seen_pressure)
+ return -1;
+ seen_pressure = 1;
+ }
+ }
+
+ /*
+ * Use legacy mode: if we have no O2 sensor we return a
+ * positive sensor index that is guaranmteed to not match
+ * any sensor (we encode it as 8 bits).
+ */
+ return o2sensor < 0 ? 256 : o2sensor;
+}
+
int event_is_gaschange(struct event *ev)
{
return ev->type == SAMPLE_EVENT_GASCHANGE ||
diff --git a/core/dive.h b/core/dive.h
index df0c4107e..eb976f56b 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -760,6 +760,8 @@ extern void clear_table(struct dive_table *table);
extern struct sample *prepare_sample(struct divecomputer *dc);
extern void finish_sample(struct divecomputer *dc);
+extern void add_sample_pressure(struct sample *sample, int sensor, int mbar);
+extern int legacy_format_o2pressures(struct dive *dive, struct divecomputer *dc);
extern bool has_hr_data(struct divecomputer *dc);
diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c
index 819db0226..2c5f607da 100644
--- a/core/libdivecomputer.c
+++ b/core/libdivecomputer.c
@@ -307,47 +307,6 @@ static void handle_gasmix(struct divecomputer *dc, struct sample *sample, int id
current_gas_index = idx;
}
-/*
- * Adding a cylinder pressure sample field is not quite as trivial as it
- * perhaps should be.
- *
- * We try to keep the same sensor index for the same sensor, so that even
- * if the dive computer doesn't give pressure information for every sample,
- * we don't move pressure information around between the different sensor
- * indexes.
- *
- * The "prepare_sample()" function will always copy the sensor indices
- * from the previous sample, so the indexes are pre-populated (but the
- * pressures obviously are not)
- */
-static void add_sample_pressure(struct sample *sample, int sensor, int mbar)
-{
- int idx;
-
- if (!mbar)
- return;
-
- /* Do we already have a slot for this sensor */
- for (idx = 0; idx < MAX_SENSORS; idx++) {
- if (sensor != sample->sensor[idx])
- continue;
- sample->pressure[idx].mbar = mbar;
- return;
- }
-
- /* Pick the first unused index if we couldn't reuse one */
- for (idx = 0; idx < MAX_SENSORS; idx++) {
- if (sample->pressure[idx].mbar)
- continue;
- sample->sensor[idx] = sensor;
- sample->pressure[idx].mbar = mbar;
- return;
- }
-
- /* We do not have enough slots for the pressure samples. */
- /* Should we warn the user about dropping pressure data? */
-}
-
void
sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata)
{