2017-04-27 18:24:53 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2013-05-04 20:24:23 +00:00
|
|
|
#ifndef PROFILE_H
|
|
|
|
#define PROFILE_H
|
|
|
|
|
2016-02-02 02:00:49 +00:00
|
|
|
#include "dive.h"
|
2019-07-06 09:58:27 +00:00
|
|
|
#include "display.h"
|
2016-02-02 02:00:49 +00:00
|
|
|
|
2013-05-04 20:24:23 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
typedef enum {
|
|
|
|
STABLE,
|
|
|
|
SLOW,
|
|
|
|
MODERATE,
|
|
|
|
FAST,
|
|
|
|
CRAZY
|
|
|
|
} velocity_t;
|
2013-05-04 22:36:40 +00:00
|
|
|
|
2019-07-05 21:29:34 +00:00
|
|
|
enum plot_pressure {
|
|
|
|
SENSOR_PR = 0,
|
|
|
|
INTERPOLATED_PR = 1,
|
|
|
|
NUM_PLOT_PRESSURES = 2
|
|
|
|
};
|
|
|
|
|
2014-01-19 00:21:13 +00:00
|
|
|
struct membuffer;
|
2019-08-05 18:43:06 +00:00
|
|
|
struct deco_state;
|
2013-05-04 20:24:23 +00:00
|
|
|
struct divecomputer;
|
|
|
|
struct plot_info;
|
2019-08-05 18:43:06 +00:00
|
|
|
|
2013-05-04 22:36:40 +00:00
|
|
|
struct plot_data {
|
2014-02-28 04:09:57 +00:00
|
|
|
unsigned int in_deco : 1;
|
2016-03-10 15:37:18 +00:00
|
|
|
int sec;
|
2019-07-05 21:29:34 +00:00
|
|
|
/* One pressure item per cylinder and pressure type */
|
|
|
|
int pressure[MAX_CYLINDERS][NUM_PLOT_PRESSURES];
|
2013-05-04 22:36:40 +00:00
|
|
|
int temperature;
|
|
|
|
/* Depth info */
|
|
|
|
int depth;
|
|
|
|
int ceiling;
|
2013-05-30 18:56:00 +00:00
|
|
|
int ceilings[16];
|
2014-09-15 12:09:00 +00:00
|
|
|
int percentages[16];
|
2013-05-04 22:36:40 +00:00
|
|
|
int ndl;
|
2014-07-09 20:13:36 +00:00
|
|
|
int tts;
|
Add support for RBT reported sample value
RBT (Remaining Bottom Time) is a value calculated on the fly by some air
integrated divecomputers, for example Uwatec devices. This value is an
estimation based in some heuristic around time function pressure
gradients. This way, RBT would be the time a diver can spend at actual
depth without running out of gas (taking account of ascent, deco, if
required, and rock bottom gas reserve, if set).
Older Uwatec devices just made the calculus and only stored alarm events
if this time value reached zero, but modern devices store the value each
sample, in minutes.
It seems that Suunto Eon Steel is storing RBT values too, in seconds.
Libdivecomputer has supported RBT for a while, but Subsurface just
printed it to stdout and dropped it.
This adds support for RBT value on subsurface sample structure and shows
it in the profile's info box, right under TTS(calc), if selected, where
these two values can be easily compared by humans.
Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-07-22 15:02:33 +00:00
|
|
|
int rbt;
|
2013-05-04 22:36:40 +00:00
|
|
|
int stoptime;
|
|
|
|
int stopdepth;
|
|
|
|
int cns;
|
|
|
|
int smoothed;
|
2013-10-14 21:48:43 +00:00
|
|
|
int sac;
|
2014-12-12 13:30:13 +00:00
|
|
|
int running_sum;
|
2014-09-15 12:55:20 +00:00
|
|
|
struct gas_pressures pressures;
|
2014-11-18 09:30:24 +00:00
|
|
|
pressure_t o2pressure; // for rebreathers, this is consensus measured po2, or setpoint otherwise. 0 for OC.
|
|
|
|
pressure_t o2sensor[3]; //for rebreathers with up to 3 PO2 sensors
|
2015-01-05 07:20:26 +00:00
|
|
|
pressure_t o2setpoint;
|
2018-03-14 15:13:37 +00:00
|
|
|
pressure_t scr_OC_pO2;
|
2013-05-04 22:36:40 +00:00
|
|
|
double mod, ead, end, eadd;
|
|
|
|
velocity_t velocity;
|
2013-09-25 00:07:07 +00:00
|
|
|
int speed;
|
2016-04-20 22:55:51 +00:00
|
|
|
// stats over 9 minute window:
|
|
|
|
int min, max; // indices into pi->entry[]
|
2013-11-13 18:20:09 +00:00
|
|
|
/* values calculated by us */
|
2014-02-28 04:09:57 +00:00
|
|
|
unsigned int in_deco_calc : 1;
|
2013-11-13 18:20:09 +00:00
|
|
|
int ndl_calc;
|
|
|
|
int tts_calc;
|
|
|
|
int stoptime_calc;
|
|
|
|
int stopdepth_calc;
|
2014-01-01 12:35:16 +00:00
|
|
|
int pressure_time;
|
2014-01-17 22:00:28 +00:00
|
|
|
int heartbeat;
|
|
|
|
int bearing;
|
2014-09-15 12:09:00 +00:00
|
|
|
double ambpressure;
|
|
|
|
double gfline;
|
2019-01-23 15:46:45 +00:00
|
|
|
double surface_gf;
|
2017-05-12 13:36:24 +00:00
|
|
|
double density;
|
2018-04-10 19:20:38 +00:00
|
|
|
bool icd_warning;
|
2013-05-04 22:36:40 +00:00
|
|
|
};
|
2014-08-24 18:48:22 +00:00
|
|
|
|
|
|
|
struct ev_select {
|
|
|
|
char *ev_name;
|
|
|
|
bool plot_ev;
|
|
|
|
};
|
|
|
|
|
2019-07-06 09:58:27 +00:00
|
|
|
extern void compare_samples(struct plot_info *p1, int idx1, int idx2, char *buf, int bufsize, bool sum);
|
2019-07-05 21:35:57 +00:00
|
|
|
extern struct plot_info *analyze_plot_info(struct plot_info *pi);
|
2019-08-25 10:56:41 +00:00
|
|
|
extern void init_plot_info(struct plot_info *pi);
|
2019-07-05 21:35:57 +00:00
|
|
|
extern void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast, struct deco_state *planner_ds);
|
|
|
|
extern void calculate_deco_information(struct deco_state *ds, const struct deco_state *planner_de, const struct dive *dive, const struct divecomputer *dc, struct plot_info *pi, bool print_mode);
|
2019-07-06 09:58:27 +00:00
|
|
|
extern int get_plot_details_new(struct plot_info *pi, int time, struct membuffer *);
|
2019-07-05 21:35:57 +00:00
|
|
|
extern void free_plot_info_data(struct plot_info *pi);
|
2013-05-04 20:24:23 +00:00
|
|
|
|
2013-05-04 22:20:49 +00:00
|
|
|
/*
|
|
|
|
* When showing dive profiles, we scale things to the
|
|
|
|
* current dive. However, we don't scale past less than
|
|
|
|
* 30 minutes or 90 ft, just so that small dives show
|
|
|
|
* up as such unless zoom is enabled.
|
|
|
|
* We also need to add 180 seconds at the end so the min/max
|
|
|
|
* plots correctly
|
|
|
|
*/
|
2019-07-05 21:35:57 +00:00
|
|
|
extern int get_maxtime(struct plot_info *pi);
|
2013-05-04 22:20:49 +00:00
|
|
|
|
|
|
|
/* get the maximum depth to which we want to plot
|
|
|
|
* take into account the additional verical space needed to plot
|
|
|
|
* partial pressure graphs */
|
2019-07-05 21:35:57 +00:00
|
|
|
extern int get_maxdepth(struct plot_info *pi);
|
2013-05-04 22:20:49 +00:00
|
|
|
|
2019-07-06 10:35:33 +00:00
|
|
|
static inline int get_plot_pressure_data(const struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder)
|
2019-07-05 21:14:07 +00:00
|
|
|
{
|
2019-07-06 10:35:33 +00:00
|
|
|
return pi->entry[idx].pressure[cylinder][sensor];
|
2019-07-05 21:14:07 +00:00
|
|
|
}
|
|
|
|
|
2019-07-06 10:59:12 +00:00
|
|
|
static inline void set_plot_pressure_data(struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder, int value)
|
2019-07-05 21:23:20 +00:00
|
|
|
{
|
2019-07-06 10:59:12 +00:00
|
|
|
pi->entry[idx].pressure[cylinder][sensor] = value;
|
2019-07-05 21:23:20 +00:00
|
|
|
}
|
|
|
|
|
2019-07-06 10:35:33 +00:00
|
|
|
static inline int get_plot_sensor_pressure(const struct plot_info *pi, int idx, int cylinder)
|
2019-07-05 21:14:07 +00:00
|
|
|
{
|
2019-07-06 10:35:33 +00:00
|
|
|
return get_plot_pressure_data(pi, idx, SENSOR_PR, cylinder);
|
2019-07-05 21:14:07 +00:00
|
|
|
}
|
|
|
|
|
2019-07-06 10:35:33 +00:00
|
|
|
static inline int get_plot_interpolated_pressure(const struct plot_info *pi, int idx, int cylinder)
|
2019-07-05 21:14:07 +00:00
|
|
|
{
|
2019-07-06 10:35:33 +00:00
|
|
|
return get_plot_pressure_data(pi, idx, INTERPOLATED_PR, cylinder);
|
2019-07-05 21:14:07 +00:00
|
|
|
}
|
2019-07-05 20:56:27 +00:00
|
|
|
|
2019-07-06 09:58:27 +00:00
|
|
|
static inline int get_plot_pressure(const struct plot_info *pi, int idx, int cylinder)
|
2019-07-05 20:56:27 +00:00
|
|
|
{
|
2019-07-06 10:35:33 +00:00
|
|
|
int res = get_plot_sensor_pressure(pi, idx, cylinder);
|
|
|
|
return res ? res : get_plot_interpolated_pressure(pi, idx, cylinder);
|
2019-07-05 20:56:27 +00:00
|
|
|
}
|
2013-05-09 03:24:03 +00:00
|
|
|
|
2013-05-04 20:24:23 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
2014-02-11 18:14:46 +00:00
|
|
|
#endif // PROFILE_H
|