summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/deco.c2
-rw-r--r--core/deco.h36
-rw-r--r--core/dive.c26
-rw-r--r--core/dive.h72
-rw-r--r--core/divelist.h2
-rw-r--r--core/divemode.h7
-rw-r--r--core/planner.c29
-rw-r--r--core/planner.h40
-rw-r--r--core/profile.h2
-rw-r--r--core/qthelper.cpp1
10 files changed, 117 insertions, 100 deletions
diff --git a/core/deco.c b/core/deco.c
index 46f57c9da..cb8273f41 100644
--- a/core/deco.c
+++ b/core/deco.c
@@ -21,8 +21,10 @@
#include <string.h>
#include <assert.h>
+#include "deco.h"
#include "ssrf.h"
#include "dive.h"
+#include "gas.h"
#include "subsurface-string.h"
#include "errorhelper.h"
#include "planner.h"
diff --git a/core/deco.h b/core/deco.h
index 4a10b7366..ed1135abb 100644
--- a/core/deco.h
+++ b/core/deco.h
@@ -2,14 +2,47 @@
#ifndef DECO_H
#define DECO_H
+#include "units.h"
+#include "gas.h"
+#include "divemode.h"
+
#ifdef __cplusplus
extern "C" {
#endif
struct dive;
-struct deco_state;
+struct divecomputer;
struct decostop;
+struct deco_state {
+ double tissue_n2_sat[16];
+ double tissue_he_sat[16];
+ double tolerated_by_tissue[16];
+ double tissue_inertgas_saturation[16];
+ double buehlmann_inertgas_a[16];
+ double buehlmann_inertgas_b[16];
+
+ double max_n2_crushing_pressure[16];
+ double max_he_crushing_pressure[16];
+
+ double crushing_onset_tension[16]; // total inert gas tension in the t* moment
+ double n2_regen_radius[16]; // rs
+ double he_regen_radius[16];
+ double max_ambient_pressure; // last moment we were descending
+
+ double bottom_n2_gradient[16];
+ double bottom_he_gradient[16];
+
+ double initial_n2_gradient[16];
+ double initial_he_gradient[16];
+ pressure_t first_ceiling_pressure;
+ pressure_t max_bottom_ceiling_pressure;
+ int ci_pointing_to_guiding_tissue;
+ double gf_low_pressure_this_dive;
+ int deco_time;
+ bool icd_warning;
+};
+
extern const double buehlmann_N2_t_halflife[];
extern int deco_allowed_depth(double tissues_tolerance, double surface_pressure, const struct dive *dive, bool smooth);
@@ -29,6 +62,7 @@ extern void calc_crushing_pressure(struct deco_state *ds, double pressure);
extern void vpmb_start_gradient(struct deco_state *ds);
extern void clear_vpmb_state(struct deco_state *ds);
extern void printdecotable(struct decostop *table);
+extern void add_segment(struct deco_state *ds, double pressure, struct gasmix gasmix, int period_in_seconds, int setpoint, enum divemode_t divemode, int sac);
extern double regressiona();
extern double regressionb();
diff --git a/core/dive.c b/core/dive.c
index 9a5171c32..a86ca4f57 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -3435,32 +3435,6 @@ void set_git_prefs(const char *prefs)
git_prefs.pp_graphs.po2 = 1;
}
-void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth)
-{
- int integral = 0;
- int last_time = 0;
- int last_depth = 0;
- struct divedatapoint *dp = dive->dp;
-
- *max_depth = 0;
-
- while (dp) {
- if (dp->time) {
- /* Ignore gas indication samples */
- integral += (dp->depth.mm + last_depth) * (dp->time - last_time) / 2;
- last_time = dp->time;
- last_depth = dp->depth.mm;
- if (dp->depth.mm > *max_depth)
- *max_depth = dp->depth.mm;
- }
- dp = dp->next;
- }
- if (last_time)
- *avg_depth = integral / last_time;
- else
- *avg_depth = *max_depth = 0;
-}
-
struct picture *alloc_picture()
{
struct picture *pic = malloc(sizeof(struct picture));
diff --git a/core/dive.h b/core/dive.h
index 57bb6e297..1509e51c2 100644
--- a/core/dive.h
+++ b/core/dive.h
@@ -12,6 +12,7 @@
#include <string.h>
#include <stdio.h>
+#include "divemode.h"
#include "equipment.h"
#ifdef __cplusplus
@@ -20,8 +21,6 @@ extern "C" {
extern int last_xml_version;
-enum divemode_t {OC, CCR, PSCR, FREEDIVE, NUM_DIVEMODE, UNDEF_COMP_TYPE}; // Flags (Open-circuit and Closed-circuit-rebreather) for setting dive computer type
-
extern const char *cylinderuse_text[NUM_GAS_USE];
extern const char *divemode_text_ui[];
extern const char *divemode_text[];
@@ -405,76 +404,9 @@ extern void subsurface_command_line_exit(int *, char ***);
#define DECOTIMESTEP 60 /* seconds. Unit of deco stop times */
-struct deco_state {
- double tissue_n2_sat[16];
- double tissue_he_sat[16];
- double tolerated_by_tissue[16];
- double tissue_inertgas_saturation[16];
- double buehlmann_inertgas_a[16];
- double buehlmann_inertgas_b[16];
-
- double max_n2_crushing_pressure[16];
- double max_he_crushing_pressure[16];
-
- double crushing_onset_tension[16]; // total inert gas tension in the t* moment
- double n2_regen_radius[16]; // rs
- double he_regen_radius[16];
- double max_ambient_pressure; // last moment we were descending
-
- double bottom_n2_gradient[16];
- double bottom_he_gradient[16];
-
- double initial_n2_gradient[16];
- double initial_he_gradient[16];
- pressure_t first_ceiling_pressure;
- pressure_t max_bottom_ceiling_pressure;
- int ci_pointing_to_guiding_tissue;
- double gf_low_pressure_this_dive;
- int deco_time;
- bool icd_warning;
-};
-
-extern void add_segment(struct deco_state *ds, double pressure, struct gasmix gasmix, int period_in_seconds, int setpoint, enum divemode_t divemode, int sac);
extern bool is_dc_planner(const struct divecomputer *dc);
extern bool has_planned(const struct dive *dive, bool planned);
-/* this should be converted to use our types */
-struct divedatapoint {
- int time;
- depth_t depth;
- int cylinderid;
- pressure_t minimum_gas;
- int setpoint;
- bool entered;
- struct divedatapoint *next;
- enum divemode_t divemode;
-};
-
-struct diveplan {
- timestamp_t when;
- int surface_pressure; /* mbar */
- int bottomsac; /* ml/min */
- int decosac; /* ml/min */
- int salinity;
- short gflow;
- short gfhigh;
- short vpmb_conservatism;
- struct divedatapoint *dp;
- int eff_gflow, eff_gfhigh;
- int surface_interval;
-};
-
-struct divedatapoint *plan_add_segment(struct diveplan *diveplan, int duration, int depth, int cylinderid, int po2, bool entered, enum divemode_t divemode);
-struct divedatapoint *create_dp(int time_incr, int depth, int cylinderid, int po2);
-#if DEBUG_PLAN
-void dump_plan(struct diveplan *diveplan);
-#endif
-struct decostop {
- int depth;
- int time;
-};
-extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer);
-
/* Since C doesn't have parameter-based overloading, two versions of get_next_event. */
extern const struct event *get_next_event(const struct event *event, const char *name);
extern struct event *get_next_event_mutable(struct event *event, const char *name);
@@ -501,8 +433,6 @@ extern void set_git_prefs(const char *prefs);
extern char *get_dive_date_c_string(timestamp_t when);
extern void update_setpoint_events(const struct dive *dive, struct divecomputer *dc);
-extern void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth);
-
#ifdef __cplusplus
}
diff --git a/core/divelist.h b/core/divelist.h
index 75f096feb..3c09d5400 100644
--- a/core/divelist.h
+++ b/core/divelist.h
@@ -8,6 +8,8 @@
extern "C" {
#endif
+struct deco_state;
+
/* this is used for both git and xml format */
#define DATAFORMAT_VERSION 3
diff --git a/core/divemode.h b/core/divemode.h
new file mode 100644
index 000000000..3ea012fe6
--- /dev/null
+++ b/core/divemode.h
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
+#ifndef DIVEMODE_H
+#define DIVEMODE_H
+
+enum divemode_t {OC, CCR, PSCR, FREEDIVE, NUM_DIVEMODE, UNDEF_COMP_TYPE}; // Flags (Open-circuit and Closed-circuit-rebreather) for setting dive computer type
+
+#endif
diff --git a/core/planner.c b/core/planner.c
index fb53fb59d..b4400b91f 100644
--- a/core/planner.c
+++ b/core/planner.c
@@ -5,12 +5,11 @@
*
* (c) Dirk Hohndel 2013
*/
-#include "ssrf.h"
#include <assert.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
-#include "dive.h"
+#include "ssrf.h"
#include "divelist.h"
#include "subsurface-string.h"
#include "deco.h"
@@ -638,6 +637,32 @@ void printdecotable(struct decostop *table)
}
}
+static void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_depth)
+{
+ int integral = 0;
+ int last_time = 0;
+ int last_depth = 0;
+ struct divedatapoint *dp = dive->dp;
+
+ *max_depth = 0;
+
+ while (dp) {
+ if (dp->time) {
+ /* Ignore gas indication samples */
+ integral += (dp->depth.mm + last_depth) * (dp->time - last_time) / 2;
+ last_time = dp->time;
+ last_depth = dp->depth.mm;
+ if (dp->depth.mm > *max_depth)
+ *max_depth = dp->depth.mm;
+ }
+ dp = dp->next;
+ }
+ if (last_time)
+ *avg_depth = integral / last_time;
+ else
+ *avg_depth = *max_depth = 0;
+}
+
bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer)
{
diff --git a/core/planner.h b/core/planner.h
index b7e3c7241..404fbe3fc 100644
--- a/core/planner.h
+++ b/core/planner.h
@@ -5,6 +5,35 @@
#define LONGDECO 1
#define NOT_RECREATIONAL 2
+#include "units.h"
+#include "divemode.h"
+
+/* this should be converted to use our types */
+struct divedatapoint {
+ int time;
+ depth_t depth;
+ int cylinderid;
+ pressure_t minimum_gas;
+ int setpoint;
+ bool entered;
+ struct divedatapoint *next;
+ enum divemode_t divemode;
+};
+
+struct diveplan {
+ timestamp_t when;
+ int surface_pressure; /* mbar */
+ int bottomsac; /* ml/min */
+ int decosac; /* ml/min */
+ int salinity;
+ short gflow;
+ short gfhigh;
+ short vpmb_conservatism;
+ struct divedatapoint *dp;
+ int eff_gflow, eff_gfhigh;
+ int surface_interval;
+};
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -27,6 +56,17 @@ extern struct dive *planned_dive;
extern char *cache_data;
extern char *disclaimer;
+struct divedatapoint *plan_add_segment(struct diveplan *diveplan, int duration, int depth, int cylinderid, int po2, bool entered, enum divemode_t divemode);
+struct divedatapoint *create_dp(int time_incr, int depth, int cylinderid, int po2);
+#if DEBUG_PLAN
+void dump_plan(struct diveplan *diveplan);
+#endif
+struct decostop {
+ int depth;
+ int time;
+};
+extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer);
+
#ifdef __cplusplus
}
#endif
diff --git a/core/profile.h b/core/profile.h
index b7bf75664..2c4a632d5 100644
--- a/core/profile.h
+++ b/core/profile.h
@@ -23,8 +23,10 @@ enum plot_pressure {
};
struct membuffer;
+struct deco_state;
struct divecomputer;
struct plot_info;
+
struct plot_data {
unsigned int in_deco : 1;
int sec;
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index bc4c7fb74..cd9fc7b90 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -11,6 +11,7 @@
#include "version.h"
#include "divecomputer.h"
#include "errorhelper.h"
+#include "planner.h"
#include "time.h"
#include "gettextfromc.h"
#include "applicationstate.h"