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
|
|
|
|
|
2024-05-03 16:51:03 +00:00
|
|
|
#include "gas.h" // gas_pressures
|
|
|
|
#include "sample.h" // MAX_O2_SENSORS
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
#include <string>
|
2024-05-04 17:15:47 +00:00
|
|
|
#include <array>
|
2024-05-03 16:51:03 +00:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
enum velocity_t {
|
2014-02-28 04:09:57 +00:00
|
|
|
STABLE,
|
|
|
|
SLOW,
|
|
|
|
MODERATE,
|
|
|
|
FAST,
|
|
|
|
CRAZY
|
2024-05-03 16:51:03 +00:00
|
|
|
};
|
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;
|
2024-05-03 16:51:03 +00:00
|
|
|
struct dive;
|
2013-05-04 20:24:23 +00:00
|
|
|
struct divecomputer;
|
2019-08-05 18:43:06 +00:00
|
|
|
|
2019-07-06 15:18:43 +00:00
|
|
|
/*
|
|
|
|
* sensor data for a given cylinder
|
|
|
|
*/
|
|
|
|
struct plot_pressure_data {
|
2024-05-04 17:15:47 +00:00
|
|
|
std::array<int, NUM_PLOT_PRESSURES> data;
|
2019-07-06 15:18:43 +00:00
|
|
|
};
|
|
|
|
|
2013-05-04 22:36:40 +00:00
|
|
|
struct plot_data {
|
2024-05-03 16:51:03 +00:00
|
|
|
bool in_deco = false;
|
|
|
|
int sec = 0;
|
|
|
|
int temperature = 0;
|
2013-05-04 22:36:40 +00:00
|
|
|
/* Depth info */
|
2024-05-03 16:51:03 +00:00
|
|
|
int depth = 0;
|
|
|
|
int ceiling = 0;
|
2024-05-04 17:15:47 +00:00
|
|
|
std::array<int, 16> ceilings;
|
|
|
|
std::array<int, 16> percentages;
|
2024-05-03 16:51:03 +00:00
|
|
|
int ndl = 0;
|
|
|
|
int tts = 0;
|
|
|
|
int rbt = 0;
|
|
|
|
int stoptime = 0;
|
|
|
|
int stopdepth = 0;
|
|
|
|
int cns = 0;
|
|
|
|
int smoothed = 0;
|
|
|
|
int sac = 0;
|
|
|
|
int running_sum = 0;
|
2014-09-15 12:55:20 +00:00
|
|
|
struct gas_pressures pressures;
|
2024-05-03 16:51:03 +00:00
|
|
|
// TODO: make pressure_t default to 0
|
2024-05-04 17:15:47 +00:00
|
|
|
pressure_t o2pressure; // for rebreathers, this is consensus measured po2, or setpoint otherwise. 0 for OC.
|
|
|
|
std::array<pressure_t, MAX_O2_SENSORS> o2sensor; //for rebreathers with several sensors
|
|
|
|
pressure_t o2setpoint;
|
|
|
|
pressure_t scr_OC_pO2;
|
2024-05-03 16:51:03 +00:00
|
|
|
int mod = 0, ead = 0, end = 0, eadd = 0;
|
|
|
|
velocity_t velocity = STABLE;
|
|
|
|
int speed = 0;
|
2013-11-13 18:20:09 +00:00
|
|
|
/* values calculated by us */
|
2024-05-03 16:51:03 +00:00
|
|
|
bool in_deco_calc = false;
|
|
|
|
int ndl_calc = 0;
|
|
|
|
int tts_calc = 0;
|
|
|
|
int stoptime_calc = 0;
|
|
|
|
int stopdepth_calc = 0;
|
|
|
|
int pressure_time = 0;
|
|
|
|
int heartbeat = 0;
|
|
|
|
int bearing = 0;
|
|
|
|
double ambpressure = 0.0;
|
|
|
|
double gfline = 0.0;
|
|
|
|
double surface_gf = 0.0;
|
|
|
|
double current_gf = 0.0;
|
|
|
|
double density = 0.0;
|
|
|
|
bool icd_warning = false;
|
2013-05-04 22:36:40 +00:00
|
|
|
};
|
2014-08-24 18:48:22 +00:00
|
|
|
|
2022-03-12 10:11:04 +00:00
|
|
|
/* Plot info with smoothing, velocity indication
|
|
|
|
* and one-, two- and three-minute minimums and maximums */
|
|
|
|
struct plot_info {
|
2024-05-03 16:51:03 +00:00
|
|
|
int nr = 0; // TODO: remove - redundant with entry.size()
|
|
|
|
int nr_cylinders = 0;
|
|
|
|
int maxtime = 0;
|
|
|
|
int meandepth = 0, maxdepth = 0;
|
|
|
|
int minpressure = 0, maxpressure = 0;
|
|
|
|
int minhr = 0, maxhr = 0;
|
|
|
|
int mintemp = 0, maxtemp = 0;
|
|
|
|
enum {AIR, NITROX, TRIMIX, FREEDIVING} dive_type = AIR;
|
|
|
|
double endtempcoord = 0.0;
|
|
|
|
double maxpp = 0.0;
|
|
|
|
bool waypoint_above_ceiling = false;
|
|
|
|
std::vector<plot_data> entry;
|
2024-05-28 19:31:11 +00:00
|
|
|
std::vector<plot_pressure_data> pressures; /* cylinders.size() blocks of nr entries. */
|
2024-05-03 16:51:03 +00:00
|
|
|
|
|
|
|
plot_info();
|
|
|
|
~plot_info();
|
2022-03-12 10:11:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#define AMB_PERCENTAGE 50.0
|
|
|
|
|
2021-01-08 22:55:20 +00:00
|
|
|
/* when planner_dc is non-null, this is called in planner mode. */
|
2024-05-03 16:51:03 +00:00
|
|
|
extern struct plot_info create_plot_info_new(const struct dive *dive, const struct divecomputer *dc, const struct deco_state *planner_ds);
|
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
|
|
|
|
*/
|
2024-05-03 16:51:03 +00:00
|
|
|
extern int get_maxtime(const struct plot_info &pi);
|
2013-05-04 22:20:49 +00:00
|
|
|
|
2021-12-04 20:04:26 +00:00
|
|
|
/* get the maximum depth to which we want to plot */
|
2024-05-03 16:51:03 +00:00
|
|
|
extern int get_maxdepth(const struct plot_info &pi);
|
2013-05-04 22:20:49 +00:00
|
|
|
|
2024-05-03 16:51:03 +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
|
|
|
{
|
2024-05-03 16:51:03 +00:00
|
|
|
return pi.pressures[cylinder + idx * pi.nr_cylinders].data[sensor];
|
2019-07-05 21:14:07 +00:00
|
|
|
}
|
|
|
|
|
2024-05-03 16:51:03 +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
|
|
|
{
|
2024-05-03 16:51:03 +00:00
|
|
|
pi.pressures[cylinder + idx * pi.nr_cylinders].data[sensor] = value;
|
2019-07-05 21:23:20 +00:00
|
|
|
}
|
|
|
|
|
2024-05-03 16:51:03 +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
|
|
|
}
|
|
|
|
|
2024-05-03 16:51:03 +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
|
|
|
|
2024-05-03 16:51:03 +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
|
|
|
|
2024-03-10 22:11:23 +00:00
|
|
|
// Returns index of sample and array of strings describing the dive details at given time
|
2024-05-03 16:51:03 +00:00
|
|
|
std::pair<int, std::vector<std::string>> get_plot_details_new(const struct dive *d, const struct plot_info &pi, int time);
|
|
|
|
std::vector<std::string> compare_samples(const struct dive *d, const struct plot_info &pi, int idx1, int idx2, bool sum);
|
2024-03-10 22:11:23 +00:00
|
|
|
|
2014-02-11 18:14:46 +00:00
|
|
|
#endif // PROFILE_H
|