summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c23
-rw-r--r--dive.h5
-rw-r--r--file.c2
-rw-r--r--profile.c4
4 files changed, 34 insertions, 0 deletions
diff --git a/dive.c b/dive.c
index 73c7bd2e7..9ec535d86 100644
--- a/dive.c
+++ b/dive.c
@@ -1038,6 +1038,12 @@ unsigned int dc_airtemp(struct divecomputer *dc)
return (sum + nr / 2) / nr;
}
+static void fixup_cylinder_use(struct dive *dive) // for CCR dives, store the indices
+{ // of the oxygen and diluent cylinders
+ dive->oxygen_cylinder_index = get_cylinder_use(dive, oxygen);
+ dive->diluent_cylinder_index = get_cylinder_use(dive, diluent);
+}
+
static void fixup_airtemp(struct dive *dive)
{
if (!dive->airtemp.mkelvin)
@@ -1228,6 +1234,7 @@ struct dive *fixup_dive(struct dive *dive)
fixup_duration(dive);
fixup_watertemp(dive);
fixup_airtemp(dive);
+ fixup_cylinder_use(dive); // store indices for CCR oxygen and diluent cylinders
for (i = 0; i < MAX_CYLINDERS; i++) {
cylinder_t *cyl = dive->cylinder + i;
add_cylinder_description(&cyl->type);
@@ -1506,6 +1513,22 @@ static void merge_weightsystem_info(weightsystem_t *res, weightsystem_t *a, weig
*res = *a;
}
+/* get_cylinder_use(): Find the index of the first cylinder with a particular CCR use type.
+ * The index returned corresponds to that of the first cylinder with a cylinder_use that
+ * equals the appropriate enum value [oxygen, diluent, bailout] given by cylinder_use_type.
+ * A negative number returned indicates that a match could not be found.
+ * Call parameters: dive = the dive being processed
+ * cylinder_use_type = an enum, one of {oxygen, diluent, bailout} */
+extern int get_cylinder_use(struct dive *dive, enum cylinderuse cylinder_use_type)
+{
+ int cylinder_index;
+ for (cylinder_index = 0; cylinder_index < MAX_CYLINDERS; cylinder_index++) {
+ if (dive->cylinder[cylinder_index].cylinder_use == cylinder_use_type)
+ return cylinder_index; // return the index of the cylinder with that cylinder use type
+ }
+ return -1; // negative number means cylinder_use_type not found in list of cylinders
+}
+
int gasmix_distance(const struct gasmix *a, const struct gasmix *b)
{
int a_o2 = get_o2(a), b_o2 = get_o2(b);
diff --git a/dive.h b/dive.h
index 6809d8384..6ca091e9d 100644
--- a/dive.h
+++ b/dive.h
@@ -48,6 +48,7 @@ extern "C" {
#endif
enum dive_comp_type {OC, CCR}; // Flags (Open-circuit and Closed-circuit-rebreather) for setting dive computer type
+enum cylinderuse {oxygen, diluent, bailout}; // The different uses for cylinders in CCR dives
struct gasmix {
fraction_t o2;
@@ -70,6 +71,7 @@ typedef struct
bool manually_added;
volume_t gas_used;
volume_t deco_gas_used;
+ enum cylinderuse cylinder_use;
} cylinder_t;
typedef struct
@@ -319,8 +321,11 @@ struct dive {
struct divecomputer dc;
int id; // unique ID for this dive
struct picture *picture_list;
+ int oxygen_cylinder_index, diluent_cylinder_index; // CCR dive cylinder indices
};
+extern int get_cylinder_use(struct dive *dive, enum cylinderuse cylinder_use_type);
+
/* when selectively copying dive information, which parts should be copied? */
struct dive_components {
unsigned int location : 1;
diff --git a/file.c b/file.c
index bab7909d7..60b79f228 100644
--- a/file.c
+++ b/file.c
@@ -474,12 +474,14 @@ int parse_txt_file(const char *filename, const char *csv)
dive->dc.dctype = CCR;
dive->dc.no_o2sensors = 2;
+ dive->cylinder[cur_cylinder_index].cylinder_use = oxygen;
dive->cylinder[cur_cylinder_index].type.size.mliter = 3000;
dive->cylinder[cur_cylinder_index].type.workingpressure.mbar = 200000;
dive->cylinder[cur_cylinder_index].type.description = strdup("3l Mk6");
dive->cylinder[cur_cylinder_index].gasmix.o2.permille = 1000;
cur_cylinder_index++;
+ dive->cylinder[cur_cylinder_index].cylinder_use = diluent;
dive->cylinder[cur_cylinder_index].type.size.mliter = 3000;
dive->cylinder[cur_cylinder_index].type.workingpressure.mbar = 200000;
dive->cylinder[cur_cylinder_index].type.description = strdup("3l Mk6");
diff --git a/profile.c b/profile.c
index 4be3a5b67..454dc1bcd 100644
--- a/profile.c
+++ b/profile.c
@@ -901,6 +901,10 @@ static void calculate_gas_information_new(struct dive *dive, struct plot_info *p
fo2 = get_o2(&dive->cylinder[cylinderindex].gasmix);
fhe = get_he(&dive->cylinder[cylinderindex].gasmix);
+ // For CCR dives use the diluent gas composition for calculating partial gas pressures:
+ if ((dive->dc.dctype == CCR) && (cylinderindex == dive->oxygen_cylinder_index))
+ cylinderindex = dive->diluent_cylinder_index;
+
fill_pressures(&entry->pressures, amb_pressure, &dive->cylinder[cylinderindex].gasmix, entry->pressures.o2);
/* Calculate MOD, EAD, END and EADD based on partial pressures calculated before