The calculation assumes that the cylinderindex in each sample tells us
which PO2 the dive was breathing at that time. This needs to be verified
with dives where there is an actual gas switch.
No idea where to display them, yet. Far fewer people will care about this
than care about SAC - does this still rate a spot in the dive_list?
I guess I could make it part of the dive_info - but it's not editable.
It doesn't seem to fit with the equipment page (even though this is the
one editable field that is related - nitrox %)
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
return pressure.mbar * 0.0145037738 + 0.5;
}
return pressure.mbar * 0.0145037738 + 0.5;
}
+static inline double to_ATM(pressure_t pressure)
+{
+ return pressure.mbar / 1013.25;
+}
+
struct sample {
duration_t time;
depth_t depth;
struct sample {
duration_t time;
depth_t depth;
depth_t visibility;
temperature_t airtemp, watertemp;
cylinder_t cylinder[MAX_CYLINDERS];
depth_t visibility;
temperature_t airtemp, watertemp;
cylinder_t cylinder[MAX_CYLINDERS];
int samples, alloc_samples;
struct sample sample[];
};
int samples, alloc_samples;
struct sample sample[];
};
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "divelist.h"
#include "dive.h"
#include "divelist.h"
#include "dive.h"
g_object_set(renderer, "text", buffer, NULL);
}
g_object_set(renderer, "text", buffer, NULL);
}
+/* calculate OTU for a dive */
+static double calculate_otu(struct dive *dive)
+{
+ int i;
+ double otu = 0.0;
+
+ for (i = 1; i < dive->samples; i++) {
+ int t;
+ double po2;
+ struct sample *sample = dive->sample + i;
+ struct sample *psample = sample - 1;
+ t = sample->time.seconds - psample->time.seconds;
+ po2 = dive->cylinder[sample->cylinderindex].gasmix.o2.permille / 1000.0 *
+ (sample->depth.mm + 10000) / 10000.0;
+ if (po2 >= 0.5)
+ otu += pow(po2 - 0.5, 0.83) * t / 30.0;
+ }
+ return otu;
+}
/*
* Return air usage (in liters).
*/
/*
* Return air usage (in liters).
*/
for (i = 0; i < dive_table.nr; i++) {
struct dive *dive = dive_table.dives[i];
for (i = 0; i < dive_table.nr; i++) {
struct dive *dive = dive_table.dives[i];
+ dive->otu = calculate_otu(dive);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
DIVE_INDEX, i,
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
DIVE_INDEX, i,
return;
cuft = type->size.mliter / 28317.0;
return;
cuft = type->size.mliter / 28317.0;
- cuft *= type->workingpressure.mbar / 1013.25;
+ cuft *= to_ATM(type->workingpressure);
psi = type->workingpressure.mbar / 68.95;
switch (psi) {
psi = type->workingpressure.mbar / 68.95;
switch (psi) {
if (input_units.volume == CUFT || import_source == SUUNTO) {
volume_of_air = type->size.mliter * 28.317; /* milli-cu ft to milliliter */
if (input_units.volume == CUFT || import_source == SUUNTO) {
volume_of_air = type->size.mliter * 28.317; /* milli-cu ft to milliliter */
- atm = type->workingpressure.mbar / 1013.25; /* working pressure in atm */
+ atm = to_ATM(type->workingpressure); /* working pressure in atm */
volume = volume_of_air / atm; /* milliliters at 1 atm: "true size" */
type->size.mliter = volume + 0.5;
}
volume = volume_of_air / atm; /* milliliters at 1 atm: "true size" */
type->size.mliter = volume + 0.5;
}