2017-04-27 18:18:03 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2013-05-30 18:56:00 +00:00
|
|
|
#ifndef DECO_H
|
|
|
|
#define DECO_H
|
|
|
|
|
2019-08-05 18:43:06 +00:00
|
|
|
#include "units.h"
|
|
|
|
#include "gas.h"
|
|
|
|
#include "divemode.h"
|
2024-05-04 15:55:50 +00:00
|
|
|
#include <memory>
|
2019-08-05 18:43:06 +00:00
|
|
|
|
2019-07-15 21:36:14 +00:00
|
|
|
struct dive;
|
2019-08-05 18:43:06 +00:00
|
|
|
struct divecomputer;
|
2019-07-15 21:36:14 +00:00
|
|
|
struct decostop;
|
|
|
|
|
2019-08-05 18:43:06 +00:00
|
|
|
struct deco_state {
|
2024-05-29 16:01:26 +00:00
|
|
|
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 = 0.0; // 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] = {};
|
2019-08-05 18:43:06 +00:00
|
|
|
pressure_t first_ceiling_pressure;
|
|
|
|
pressure_t max_bottom_ceiling_pressure;
|
2024-05-29 16:01:26 +00:00
|
|
|
int ci_pointing_to_guiding_tissue = 0;
|
|
|
|
double gf_low_pressure_this_dive = 0.0;
|
|
|
|
int deco_time = 0;
|
|
|
|
bool icd_warning = false;
|
|
|
|
int sum1 = 0;
|
|
|
|
long sumx = 0, sumxx = 0;
|
|
|
|
double sumy = 0, sumxy = 0;
|
|
|
|
int plot_depth = 0;
|
2019-08-05 18:43:06 +00:00
|
|
|
};
|
|
|
|
|
2019-06-04 16:51:54 +00:00
|
|
|
extern const double buehlmann_N2_t_halflife[];
|
2014-09-15 12:09:00 +00:00
|
|
|
|
2018-08-16 22:58:30 +00:00
|
|
|
extern int deco_allowed_depth(double tissues_tolerance, double surface_pressure, const struct dive *dive, bool smooth);
|
2013-05-30 18:56:00 +00:00
|
|
|
|
2017-11-22 19:42:33 +00:00
|
|
|
double get_gf(struct deco_state *ds, double ambpressure_bar, const struct dive *dive);
|
2021-02-12 16:52:31 +00:00
|
|
|
extern void clear_deco(struct deco_state *ds, double surface_pressure, bool in_planner);
|
2019-07-15 21:36:14 +00:00
|
|
|
extern void dump_tissues(struct deco_state *ds);
|
|
|
|
extern void set_gf(short gflow, short gfhigh);
|
|
|
|
extern void set_vpmb_conservatism(short conservatism);
|
|
|
|
extern void nuclear_regeneration(struct deco_state *ds, double time);
|
|
|
|
extern void vpmb_start_gradient(struct deco_state *ds);
|
2021-02-12 16:47:52 +00:00
|
|
|
extern void vpmb_next_gradient(struct deco_state *ds, double deco_time, double surface_pressure, bool in_planner);
|
2021-02-12 17:19:24 +00:00
|
|
|
extern double tissue_tolerance_calc(struct deco_state *ds, const struct dive *dive, double pressure, bool in_planner);
|
2019-07-15 21:36:14 +00:00
|
|
|
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);
|
2021-02-12 16:39:46 +00:00
|
|
|
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, bool in_planner);
|
2016-10-26 05:21:47 +00:00
|
|
|
|
2019-08-05 21:23:10 +00:00
|
|
|
extern double regressiona(const struct deco_state *ds);
|
|
|
|
extern double regressionb(const struct deco_state *ds);
|
|
|
|
extern void reset_regression(struct deco_state *ds);
|
|
|
|
extern void update_regression(struct deco_state *ds, const struct dive *dive);
|
2019-06-04 16:34:54 +00:00
|
|
|
|
2024-03-07 18:08:22 +00:00
|
|
|
struct deco_state_cache {
|
|
|
|
// Test if there is cached data
|
|
|
|
operator bool () {
|
|
|
|
return !!data;
|
|
|
|
}
|
|
|
|
void cache(const struct deco_state *source);
|
|
|
|
void restore(struct deco_state *target, bool keep_vpmb_state) const;
|
|
|
|
private:
|
|
|
|
std::unique_ptr<deco_state> data;
|
|
|
|
};
|
|
|
|
|
2014-02-11 18:14:46 +00:00
|
|
|
#endif // DECO_H
|