summaryrefslogtreecommitdiffstats
path: root/profile.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-13 16:24:58 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-13 16:26:35 -0800
commit23ce727e62c5670ca30c487fc9fd52eb25883de5 (patch)
tree4e04981e3d7d6da34be745894a7b20116b871006 /profile.c
parent53dbccb87a81313395fa6d3d48325389a070439b (diff)
downloadsubsurface-23ce727e62c5670ca30c487fc9fd52eb25883de5.tar.gz
Add support for MOD, EAD, AND and EADD in the mouse over display
- MOD: Maximum Operation Depth based on a configurable limit - EAD: Equivalent Air Depth considering N2 and (!) O2 narcotic - END: Equivalent Nitrogen (Narcotic) Depth considering just N2 narcotic (ignoring O2) - EADD: Equivalent Air Density Depth Please note that some people and even diving organisations have opposite definitions for EAD and END. Considering A stands for Air, lets choose the above. And considering N for Nitrogen it also fits in this scheme. This patch moves N2_IN_AIR from deco.c to dive.h as this is already used in several places and might be useful for future use also. It also respecifies N2_IN_AIR to a more correct value of 78,084%, the former one also included all other gases than oxygen appearing in air. If someone needs to use the former value it would be more correct to use 1-O2_IN_AIR instead. Signed-off-by: Jan Schubert / Jan.Schubert@GMX.li Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'profile.c')
-rw-r--r--profile.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/profile.c b/profile.c
index be6d37261..7839f84ff 100644
--- a/profile.c
+++ b/profile.c
@@ -46,6 +46,7 @@ struct plot_data {
int cns;
int smoothed;
double po2, pn2, phe;
+ double mod, ead, end, eadd;
velocity_t velocity;
struct plot_data *min[3];
struct plot_data *max[3];
@@ -1835,11 +1836,32 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d
entry->phe = (amb_pressure - po2) * ratio;
entry->pn2 = amb_pressure - po2 - entry->phe;
entry->po2 = po2;
+ entry->ead = (entry->depth + 10000) *
+ (entry->po2+(amb_pressure-entry->po2)*(1-ratio))/amb_pressure - 10000;
+ entry->end = (entry->depth + 10000) *
+ (amb_pressure-entry->po2)*(1-ratio)/amb_pressure/N2_IN_AIR - 10000;
+ entry->eadd = (entry->depth + 10000) *
+ (entry->po2/amb_pressure * O2_DENSITY + entry->pn2/amb_pressure * N2_DENSITY +
+ entry->phe/amb_pressure * HE_DENSITY) /
+ (O2_IN_AIR * O2_DENSITY + N2_IN_AIR * N2_DENSITY) -10000;
} else {
entry->po2 = fo2 / 1000.0 * amb_pressure;
entry->phe = fhe / 1000.0 * amb_pressure;
entry->pn2 = (1000 - fo2 - fhe) / 1000.0 * amb_pressure;
+
+ entry->ead = (entry->depth + 10000) * (1000 - fhe) / 1000.0 - 10000;
+ entry->end = (entry->depth + 10000) * (1000 - fo2 - fhe) / 1000.0 / N2_IN_AIR - 10000;
+ entry->eadd = (entry->depth + 10000) * (fo2 * O2_DENSITY + (1-fo2-fhe) * N2_DENSITY + fhe * HE_DENSITY) / (O2_IN_AIR * O2_DENSITY + N2_IN_AIR * N2_DENSITY) -10000;
}
+ entry->mod = (prefs.mod_ppO2/fo2*1000 - 1) * 10000;
+ if(entry->mod <0)
+ entry->mod=0;
+ if(entry->ead <0)
+ entry->ead=0;
+ if(entry->end <0)
+ entry->end=0;
+ if(entry->eadd <0)
+ entry->eadd=0;
if (entry->po2 > pi->maxpp && prefs.pp_graphs.po2)
pi->maxpp = entry->po2;
if (entry->phe > pi->maxpp && prefs.pp_graphs.phe)
@@ -2070,7 +2092,7 @@ void plot(struct graphics_context *gc, struct dive *dive, scale_mode_t scale)
static void plot_string(struct plot_data *entry, char *buf, size_t bufsize,
int depth, int pressure, int temp, gboolean has_ndl)
{
- int pressurevalue;
+ int pressurevalue, mod, ead, end, eadd;
const char *depth_unit, *pressure_unit, *temp_unit;
char *buf2 = malloc(bufsize);
double depthvalue, tempvalue;
@@ -2136,6 +2158,18 @@ static void plot_string(struct plot_data *entry, char *buf, size_t bufsize,
memcpy(buf2, buf, bufsize);
snprintf(buf, bufsize, "%s\npHe:%.2f", buf2, entry->phe);
}
+ if (prefs.mod) {
+ mod = (int)get_depth_units(entry->mod, NULL, &depth_unit);
+ memcpy(buf2, buf, bufsize);
+ snprintf(buf, bufsize, "%s\nMOD:%d%s", buf2, mod, depth_unit);
+ }
+ if (prefs.ead) {
+ ead = (int)get_depth_units(entry->ead, NULL, &depth_unit);
+ end = (int)get_depth_units(entry->end, NULL, &depth_unit);
+ eadd = (int)get_depth_units(entry->eadd, NULL, &depth_unit);
+ memcpy(buf2, buf, bufsize);
+ snprintf(buf, bufsize, "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s", buf2, ead, depth_unit, end, depth_unit, eadd, depth_unit);
+ }
free(buf2);
}