mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
profile: C++-ify plot_info
Use more C++ style memory management for plot_info: Use std::vector for array data. Return the plot_info instead of filling an output parameter. Add a constructor/destructor pair so that the caller isn't bothered with memory management. The bulk of the commit is replacement of pointers with references, which is kind of gratuitous. But I started and then went on... Default initializiation of gas_pressures made it necessary to convert gas.c to c++, though with minimal changes to the code. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
aaab5157d4
commit
48f7828d10
14 changed files with 635 additions and 670 deletions
153
core/profile.h
153
core/profile.h
|
@ -2,20 +2,22 @@
|
|||
#ifndef PROFILE_H
|
||||
#define PROFILE_H
|
||||
|
||||
#include "dive.h"
|
||||
#include "sample.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
#include "gas.h" // gas_pressures
|
||||
#include "sample.h" // MAX_O2_SENSORS
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
enum velocity_t {
|
||||
STABLE,
|
||||
SLOW,
|
||||
MODERATE,
|
||||
FAST,
|
||||
CRAZY
|
||||
} velocity_t;
|
||||
};
|
||||
|
||||
enum plot_pressure {
|
||||
SENSOR_PR = 0,
|
||||
|
@ -25,6 +27,7 @@ enum plot_pressure {
|
|||
|
||||
struct membuffer;
|
||||
struct deco_state;
|
||||
struct dive;
|
||||
struct divecomputer;
|
||||
|
||||
/*
|
||||
|
@ -35,72 +38,74 @@ struct plot_pressure_data {
|
|||
};
|
||||
|
||||
struct plot_data {
|
||||
unsigned int in_deco : 1;
|
||||
int sec;
|
||||
int temperature;
|
||||
bool in_deco = false;
|
||||
int sec = 0;
|
||||
int temperature = 0;
|
||||
/* Depth info */
|
||||
int depth;
|
||||
int ceiling;
|
||||
int ceilings[16];
|
||||
int percentages[16];
|
||||
int ndl;
|
||||
int tts;
|
||||
int rbt;
|
||||
int stoptime;
|
||||
int stopdepth;
|
||||
int cns;
|
||||
int smoothed;
|
||||
int sac;
|
||||
int running_sum;
|
||||
int depth = 0;
|
||||
int ceiling = 0;
|
||||
int ceilings[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
int percentages[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
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;
|
||||
struct gas_pressures pressures;
|
||||
pressure_t o2pressure; // for rebreathers, this is consensus measured po2, or setpoint otherwise. 0 for OC.
|
||||
pressure_t o2sensor[MAX_O2_SENSORS]; //for rebreathers with several sensors
|
||||
pressure_t o2setpoint;
|
||||
pressure_t scr_OC_pO2;
|
||||
int mod, ead, end, eadd;
|
||||
velocity_t velocity;
|
||||
int speed;
|
||||
// TODO: make pressure_t default to 0
|
||||
pressure_t o2pressure = { 0 }; // for rebreathers, this is consensus measured po2, or setpoint otherwise. 0 for OC.
|
||||
pressure_t o2sensor[MAX_O2_SENSORS] = {{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }}; //for rebreathers with several sensors
|
||||
pressure_t o2setpoint = { 0 };
|
||||
pressure_t scr_OC_pO2 = { 0 };
|
||||
int mod = 0, ead = 0, end = 0, eadd = 0;
|
||||
velocity_t velocity = STABLE;
|
||||
int speed = 0;
|
||||
/* values calculated by us */
|
||||
unsigned int in_deco_calc : 1;
|
||||
int ndl_calc;
|
||||
int tts_calc;
|
||||
int stoptime_calc;
|
||||
int stopdepth_calc;
|
||||
int pressure_time;
|
||||
int heartbeat;
|
||||
int bearing;
|
||||
double ambpressure;
|
||||
double gfline;
|
||||
double surface_gf;
|
||||
double current_gf;
|
||||
double density;
|
||||
bool icd_warning;
|
||||
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;
|
||||
};
|
||||
|
||||
/* Plot info with smoothing, velocity indication
|
||||
* and one-, two- and three-minute minimums and maximums */
|
||||
struct plot_info {
|
||||
int nr;
|
||||
int nr_cylinders;
|
||||
int maxtime;
|
||||
int meandepth, maxdepth;
|
||||
int minpressure, maxpressure;
|
||||
int minhr, maxhr;
|
||||
int mintemp, maxtemp;
|
||||
enum {AIR, NITROX, TRIMIX, FREEDIVING} dive_type;
|
||||
double endtempcoord;
|
||||
double maxpp;
|
||||
bool waypoint_above_ceiling;
|
||||
struct plot_data *entry;
|
||||
struct plot_pressure_data *pressures; /* cylinders.nr blocks of nr entries. */
|
||||
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;
|
||||
std::vector<plot_pressure_data> pressures; /* cylinders.nr blocks of nr entries. */
|
||||
|
||||
plot_info();
|
||||
~plot_info();
|
||||
};
|
||||
|
||||
#define AMB_PERCENTAGE 50.0
|
||||
|
||||
extern void init_plot_info(struct plot_info *pi);
|
||||
/* when planner_dc is non-null, this is called in planner mode. */
|
||||
extern void create_plot_info_new(const struct dive *dive, const struct divecomputer *dc, struct plot_info *pi, const struct deco_state *planner_ds);
|
||||
extern void free_plot_info_data(struct plot_info *pi);
|
||||
extern struct plot_info create_plot_info_new(const struct dive *dive, const struct divecomputer *dc, const struct deco_state *planner_ds);
|
||||
|
||||
/*
|
||||
* When showing dive profiles, we scale things to the
|
||||
|
@ -110,46 +115,40 @@ extern void free_plot_info_data(struct plot_info *pi);
|
|||
* We also need to add 180 seconds at the end so the min/max
|
||||
* plots correctly
|
||||
*/
|
||||
extern int get_maxtime(const struct plot_info *pi);
|
||||
extern int get_maxtime(const struct plot_info &pi);
|
||||
|
||||
/* get the maximum depth to which we want to plot */
|
||||
extern int get_maxdepth(const struct plot_info *pi);
|
||||
extern int get_maxdepth(const struct plot_info &pi);
|
||||
|
||||
static inline int get_plot_pressure_data(const struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder)
|
||||
static inline int get_plot_pressure_data(const struct plot_info &pi, int idx, enum plot_pressure sensor, int cylinder)
|
||||
{
|
||||
return pi->pressures[cylinder + idx * pi->nr_cylinders].data[sensor];
|
||||
return pi.pressures[cylinder + idx * pi.nr_cylinders].data[sensor];
|
||||
}
|
||||
|
||||
static inline void set_plot_pressure_data(struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder, int value)
|
||||
static inline void set_plot_pressure_data(struct plot_info &pi, int idx, enum plot_pressure sensor, int cylinder, int value)
|
||||
{
|
||||
pi->pressures[cylinder + idx * pi->nr_cylinders].data[sensor] = value;
|
||||
pi.pressures[cylinder + idx * pi.nr_cylinders].data[sensor] = value;
|
||||
}
|
||||
|
||||
static inline int get_plot_sensor_pressure(const struct plot_info *pi, int idx, int cylinder)
|
||||
static inline int get_plot_sensor_pressure(const struct plot_info &pi, int idx, int cylinder)
|
||||
{
|
||||
return get_plot_pressure_data(pi, idx, SENSOR_PR, cylinder);
|
||||
}
|
||||
|
||||
static inline int get_plot_interpolated_pressure(const struct plot_info *pi, int idx, int cylinder)
|
||||
static inline int get_plot_interpolated_pressure(const struct plot_info &pi, int idx, int cylinder)
|
||||
{
|
||||
return get_plot_pressure_data(pi, idx, INTERPOLATED_PR, cylinder);
|
||||
}
|
||||
|
||||
static inline int get_plot_pressure(const struct plot_info *pi, int idx, int cylinder)
|
||||
static inline int get_plot_pressure(const struct plot_info &pi, int idx, int cylinder)
|
||||
{
|
||||
int res = get_plot_sensor_pressure(pi, idx, cylinder);
|
||||
return res ? res : get_plot_interpolated_pressure(pi, idx, cylinder);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
// C++ only formatting functions
|
||||
#include <string>
|
||||
#include <vector>
|
||||
// Returns index of sample and array of strings describing the dive details at given time
|
||||
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);
|
||||
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);
|
||||
|
||||
#endif
|
||||
#endif // PROFILE_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue