mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-17 22:46:16 +00:00
Display values in info box only if value is interesting
Type duration_t changed from uint to int. Default value of '-1' introduced for some of the values in struct sample: NDL used -1 as default. Bearing uses -1 as default (no bearing set). Display pXX, EAD, END, density, MOD only if values are larger than 0. In profile don't display data from two first and two last plot_data entries in info box. Signed-off-by: Stefan Fuchs <sfuchs@gmx.de>
This commit is contained in:
parent
de81effb25
commit
1f8506ce64
5 changed files with 61 additions and 47 deletions
|
@ -25,7 +25,6 @@ struct plot_info {
|
||||||
enum {AIR, NITROX, TRIMIX, FREEDIVING} dive_type;
|
enum {AIR, NITROX, TRIMIX, FREEDIVING} dive_type;
|
||||||
double endtempcoord;
|
double endtempcoord;
|
||||||
double maxpp;
|
double maxpp;
|
||||||
bool has_ndl;
|
|
||||||
struct plot_data *entry;
|
struct plot_data *entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
10
core/dive.c
10
core/dive.c
|
@ -753,6 +753,10 @@ struct sample *prepare_sample(struct divecomputer *dc)
|
||||||
sample->sensor[0] = sample[-1].sensor[0];
|
sample->sensor[0] = sample[-1].sensor[0];
|
||||||
sample->sensor[1] = sample[-1].sensor[1];
|
sample->sensor[1] = sample[-1].sensor[1];
|
||||||
}
|
}
|
||||||
|
// Init some values with -1
|
||||||
|
sample->bearing.degrees = -1;
|
||||||
|
sample->ndl.seconds = -1;
|
||||||
|
|
||||||
return sample;
|
return sample;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1261,12 +1265,12 @@ static void fixup_meandepth(struct dive *dive)
|
||||||
static void fixup_duration(struct dive *dive)
|
static void fixup_duration(struct dive *dive)
|
||||||
{
|
{
|
||||||
struct divecomputer *dc;
|
struct divecomputer *dc;
|
||||||
unsigned int duration = 0;
|
duration_t duration = { };
|
||||||
|
|
||||||
for_each_dc (dive, dc)
|
for_each_dc (dive, dc)
|
||||||
duration = MAX(duration, dc->duration.seconds);
|
duration.seconds = MAX(duration.seconds, dc->duration.seconds);
|
||||||
|
|
||||||
dive->duration.seconds = duration;
|
dive->duration.seconds = duration.seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
44
core/dive.h
44
core/dive.h
|
@ -199,28 +199,28 @@ void get_gas_string(const struct gasmix *gasmix, char *text, int len);
|
||||||
const char *gasname(const struct gasmix *gasmix);
|
const char *gasname(const struct gasmix *gasmix);
|
||||||
|
|
||||||
#define MAX_SENSORS 2
|
#define MAX_SENSORS 2
|
||||||
struct sample // BASE TYPE BYTES UNITS RANGE DESCRIPTION
|
struct sample // BASE TYPE BYTES UNITS RANGE DESCRIPTION
|
||||||
{ // --------- ----- ----- ----- -----------
|
{ // --------- ----- ----- ----- -----------
|
||||||
duration_t time; // uint32_t 4 seconds (0-68 yrs) elapsed dive time up to this sample
|
duration_t time; // int32_t 4 seconds (0-34 yrs) elapsed dive time up to this sample
|
||||||
duration_t stoptime; // uint32_t 4 seconds (0-18 h) time duration of next deco stop
|
duration_t stoptime; // int32_t 4 seconds (0-34 yrs) time duration of next deco stop
|
||||||
duration_t ndl; // uint32_t 4 seconds (0-18 h) time duration before no-deco limit
|
duration_t ndl; // int32_t 4 seconds (-1 no val, 0-34 yrs) time duration before no-deco limit
|
||||||
duration_t tts; // uint32_t 4 seconds (0-18 h) time duration to reach the surface
|
duration_t tts; // int32_t 4 seconds (0-34 yrs) time duration to reach the surface
|
||||||
duration_t rbt; // uint32_t 4 seconds (0-18 h) remaining bottom time
|
duration_t rbt; // int32_t 4 seconds (0-34 yrs) remaining bottom time
|
||||||
depth_t depth; // int32_t 4 mm (0-2000 km) dive depth of this sample
|
depth_t depth; // int32_t 4 mm (0-2000 km) dive depth of this sample
|
||||||
depth_t stopdepth; // int32_t 4 mm (0-2000 km) depth of next deco stop
|
depth_t stopdepth; // int32_t 4 mm (0-2000 km) depth of next deco stop
|
||||||
temperature_t temperature; // int32_t 4 mdegrK (0-2 MdegK) ambient temperature
|
temperature_t temperature; // int32_t 4 mdegrK (0-2 MdegK) ambient temperature
|
||||||
pressure_t pressure[MAX_SENSORS]; // int32_t 4 mbar (0-2 Mbar) cylinder pressures (main and CCR o2)
|
pressure_t pressure[MAX_SENSORS]; // int32_t 4 mbar (0-2 Mbar) cylinder pressures (main and CCR o2)
|
||||||
o2pressure_t setpoint; // uint16_t 2 mbar (0-65 bar) O2 partial pressure (will be setpoint)
|
o2pressure_t setpoint; // uint16_t 2 mbar (0-65 bar) O2 partial pressure (will be setpoint)
|
||||||
o2pressure_t o2sensor[3]; // uint16_t 6 mbar (0-65 bar) Up to 3 PO2 sensor values (rebreather)
|
o2pressure_t o2sensor[3]; // uint16_t 6 mbar (0-65 bar) Up to 3 PO2 sensor values (rebreather)
|
||||||
bearing_t bearing; // int16_t 2 degrees (-32k to 32k deg) compass bearing
|
bearing_t bearing; // int16_t 2 degrees (-1 no val, 0-360 deg) compass bearing
|
||||||
uint8_t sensor[MAX_SENSORS]; // uint8_t 1 sensorID (0-255) ID of cylinder pressure sensor
|
uint8_t sensor[MAX_SENSORS]; // uint8_t 1 sensorID (0-255) ID of cylinder pressure sensor
|
||||||
uint16_t cns; // uint16_t 1 % (0-64k %) cns% accumulated
|
uint16_t cns; // uint16_t 1 % (0-64k %) cns% accumulated
|
||||||
uint8_t heartbeat; // uint8_t 1 beats/m (0-255) heart rate measurement
|
uint8_t heartbeat; // uint8_t 1 beats/m (0-255) heart rate measurement
|
||||||
volume_t sac; // 4 ml/min predefined SAC
|
volume_t sac; // 4 ml/min predefined SAC
|
||||||
bool in_deco; // bool 1 y/n y/n this sample is part of deco
|
bool in_deco; // bool 1 y/n y/n this sample is part of deco
|
||||||
bool manually_entered; // bool 1 y/n y/n this sample was entered by the user,
|
bool manually_entered; // bool 1 y/n y/n this sample was entered by the user,
|
||||||
// not calculated when planning a dive
|
// not calculated when planning a dive
|
||||||
}; // Total size of structure: 57 bytes, excluding padding at end
|
}; // Total size of structure: 57 bytes, excluding padding at end
|
||||||
|
|
||||||
struct divetag {
|
struct divetag {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -495,6 +495,8 @@ struct plot_info calculate_max_limits_new(struct dive *dive, struct divecomputer
|
||||||
entry->running_sum = (entry - 1)->running_sum + (_time - (entry - 1)->sec) * (_depth + (entry - 1)->depth) / 2; \
|
entry->running_sum = (entry - 1)->running_sum + (_time - (entry - 1)->sec) * (_depth + (entry - 1)->depth) / 2; \
|
||||||
memset(entry->pressure, 0, sizeof(entry->pressure)); \
|
memset(entry->pressure, 0, sizeof(entry->pressure)); \
|
||||||
entry->sac = _sac; \
|
entry->sac = _sac; \
|
||||||
|
entry->ndl = -1; \
|
||||||
|
entry->bearing = -1; \
|
||||||
entry++; \
|
entry++; \
|
||||||
idx++
|
idx++
|
||||||
|
|
||||||
|
@ -576,7 +578,6 @@ struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *
|
||||||
entry->stoptime = sample->stoptime.seconds;
|
entry->stoptime = sample->stoptime.seconds;
|
||||||
entry->ndl = sample->ndl.seconds;
|
entry->ndl = sample->ndl.seconds;
|
||||||
entry->tts = sample->tts.seconds;
|
entry->tts = sample->tts.seconds;
|
||||||
pi->has_ndl |= sample->ndl.seconds;
|
|
||||||
entry->in_deco = sample->in_deco;
|
entry->in_deco = sample->in_deco;
|
||||||
entry->cns = sample->cns;
|
entry->cns = sample->cns;
|
||||||
if (dc->divemode == CCR) {
|
if (dc->divemode == CCR) {
|
||||||
|
@ -1320,7 +1321,7 @@ struct divecomputer *select_dc(struct dive *dive)
|
||||||
return get_dive_dc(dive, i);
|
return get_dive_dc(dive, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plot_string(struct plot_info *pi, struct plot_data *entry, struct membuffer *b, bool has_ndl)
|
static void plot_string(struct plot_info *pi, struct plot_data *entry, struct membuffer *b)
|
||||||
{
|
{
|
||||||
int pressurevalue, mod, ead, end, eadd;
|
int pressurevalue, mod, ead, end, eadd;
|
||||||
const char *depth_unit, *pressure_unit, *temp_unit, *vertical_speed_unit;
|
const char *depth_unit, *pressure_unit, *temp_unit, *vertical_speed_unit;
|
||||||
|
@ -1353,13 +1354,13 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me
|
||||||
put_format(b, translate("gettextFromC", "SAC: %.*f%s/min\n"), decimals, sacvalue, unit);
|
put_format(b, translate("gettextFromC", "SAC: %.*f%s/min\n"), decimals, sacvalue, unit);
|
||||||
if (entry->cns)
|
if (entry->cns)
|
||||||
put_format(b, translate("gettextFromC", "CNS: %u%%\n"), entry->cns);
|
put_format(b, translate("gettextFromC", "CNS: %u%%\n"), entry->cns);
|
||||||
if (prefs.pp_graphs.po2)
|
if (prefs.pp_graphs.po2 && entry->pressures.o2 > 0)
|
||||||
put_format(b, translate("gettextFromC", "pO%s: %.2fbar\n"), UTF8_SUBSCRIPT_2, entry->pressures.o2);
|
put_format(b, translate("gettextFromC", "pO%s: %.2fbar\n"), UTF8_SUBSCRIPT_2, entry->pressures.o2);
|
||||||
if (prefs.pp_graphs.pn2)
|
if (prefs.pp_graphs.pn2 && entry->pressures.n2 > 0)
|
||||||
put_format(b, translate("gettextFromC", "pN%s: %.2fbar\n"), UTF8_SUBSCRIPT_2, entry->pressures.n2);
|
put_format(b, translate("gettextFromC", "pN%s: %.2fbar\n"), UTF8_SUBSCRIPT_2, entry->pressures.n2);
|
||||||
if (prefs.pp_graphs.phe)
|
if (prefs.pp_graphs.phe && entry->pressures.he > 0)
|
||||||
put_format(b, translate("gettextFromC", "pHe: %.2fbar\n"), entry->pressures.he);
|
put_format(b, translate("gettextFromC", "pHe: %.2fbar\n"), entry->pressures.he);
|
||||||
if (prefs.mod) {
|
if (prefs.mod && entry->mod > 0) {
|
||||||
mod = lrint(get_depth_units(lrint(entry->mod), NULL, &depth_unit));
|
mod = lrint(get_depth_units(lrint(entry->mod), NULL, &depth_unit));
|
||||||
put_format(b, translate("gettextFromC", "MOD: %d%s\n"), mod, depth_unit);
|
put_format(b, translate("gettextFromC", "MOD: %d%s\n"), mod, depth_unit);
|
||||||
}
|
}
|
||||||
|
@ -1368,15 +1369,21 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me
|
||||||
if (prefs.ead) {
|
if (prefs.ead) {
|
||||||
switch (pi->dive_type) {
|
switch (pi->dive_type) {
|
||||||
case NITROX:
|
case NITROX:
|
||||||
ead = lrint(get_depth_units(lrint(entry->ead), NULL, &depth_unit));
|
if (entry->ead > 0) {
|
||||||
put_format(b, translate("gettextFromC", "EAD: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), ead, depth_unit, eadd, depth_unit, entry->density);
|
ead = lrint(get_depth_units(lrint(entry->ead), NULL, &depth_unit));
|
||||||
break;
|
put_format(b, translate("gettextFromC", "EAD: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), ead, depth_unit, eadd, depth_unit, entry->density);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TRIMIX:
|
case TRIMIX:
|
||||||
end = lrint(get_depth_units(lrint(entry->end), NULL, &depth_unit));
|
if (entry->end > 0) {
|
||||||
put_format(b, translate("gettextFromC", "END: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), end, depth_unit, eadd, depth_unit, entry->density);
|
end = lrint(get_depth_units(lrint(entry->end), NULL, &depth_unit));
|
||||||
break;
|
put_format(b, translate("gettextFromC", "END: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), end, depth_unit, eadd, depth_unit, entry->density);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case AIR:
|
case AIR:
|
||||||
put_format(b, translate("gettextFromC", "Density: %.1fg/ℓ\n"), entry->density);
|
if (entry->density > 0) {
|
||||||
|
put_format(b, translate("gettextFromC", "Density: %.1fg/ℓ\n"), entry->density);
|
||||||
|
}
|
||||||
case FREEDIVING:
|
case FREEDIVING:
|
||||||
/* nothing */
|
/* nothing */
|
||||||
break;
|
break;
|
||||||
|
@ -1384,7 +1391,7 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me
|
||||||
}
|
}
|
||||||
if (entry->stopdepth) {
|
if (entry->stopdepth) {
|
||||||
depthvalue = get_depth_units(entry->stopdepth, NULL, &depth_unit);
|
depthvalue = get_depth_units(entry->stopdepth, NULL, &depth_unit);
|
||||||
if (entry->ndl) {
|
if (entry->ndl > 0) {
|
||||||
/* this is a safety stop as we still have ndl */
|
/* this is a safety stop as we still have ndl */
|
||||||
if (entry->stoptime)
|
if (entry->stoptime)
|
||||||
put_format(b, translate("gettextFromC", "Safety stop: %umin @ %.0f%s\n"), DIV_UP(entry->stoptime, 60),
|
put_format(b, translate("gettextFromC", "Safety stop: %umin @ %.0f%s\n"), DIV_UP(entry->stoptime, 60),
|
||||||
|
@ -1403,7 +1410,7 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me
|
||||||
}
|
}
|
||||||
} else if (entry->in_deco) {
|
} else if (entry->in_deco) {
|
||||||
put_string(b, translate("gettextFromC", "In deco\n"));
|
put_string(b, translate("gettextFromC", "In deco\n"));
|
||||||
} else if (has_ndl) {
|
} else if (entry->ndl >= 0) {
|
||||||
put_format(b, translate("gettextFromC", "NDL: %umin\n"), DIV_UP(entry->ndl, 60));
|
put_format(b, translate("gettextFromC", "NDL: %umin\n"), DIV_UP(entry->ndl, 60));
|
||||||
}
|
}
|
||||||
if (entry->tts)
|
if (entry->tts)
|
||||||
|
@ -1448,7 +1455,7 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me
|
||||||
}
|
}
|
||||||
if (entry->heartbeat && prefs.hrgraph)
|
if (entry->heartbeat && prefs.hrgraph)
|
||||||
put_format(b, translate("gettextFromC", "heart rate: %d\n"), entry->heartbeat);
|
put_format(b, translate("gettextFromC", "heart rate: %d\n"), entry->heartbeat);
|
||||||
if (entry->bearing)
|
if (entry->bearing >= 0)
|
||||||
put_format(b, translate("gettextFromC", "bearing: %d\n"), entry->bearing);
|
put_format(b, translate("gettextFromC", "bearing: %d\n"), entry->bearing);
|
||||||
if (entry->running_sum) {
|
if (entry->running_sum) {
|
||||||
depthvalue = get_depth_units(entry->running_sum / entry->sec, NULL, &depth_unit);
|
depthvalue = get_depth_units(entry->running_sum / entry->sec, NULL, &depth_unit);
|
||||||
|
@ -1463,13 +1470,14 @@ struct plot_data *get_plot_details_new(struct plot_info *pi, int time, struct me
|
||||||
struct plot_data *entry = NULL;
|
struct plot_data *entry = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < pi->nr; i++) {
|
/* The two first and the two last plot entries do not have useful data */
|
||||||
|
for (i = 2; i < pi->nr - 2; i++) {
|
||||||
entry = pi->entry + i;
|
entry = pi->entry + i;
|
||||||
if (entry->sec >= time)
|
if (entry->sec >= time)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (entry)
|
if (entry)
|
||||||
plot_string(pi, entry, mb, pi->has_ndl);
|
plot_string(pi, entry, mb);
|
||||||
return (entry);
|
return (entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,11 @@ extern "C" {
|
||||||
* We also strive to make '0' a meaningless number saying "not
|
* We also strive to make '0' a meaningless number saying "not
|
||||||
* initialized", since many values are things that may not have
|
* initialized", since many values are things that may not have
|
||||||
* been reported (eg cylinder pressure or temperature from dive
|
* been reported (eg cylinder pressure or temperature from dive
|
||||||
* computers that don't support them). But sometimes -1 is an even
|
* computers that don't support them). But for some of the values
|
||||||
* more explicit way of saying "not there".
|
* 0 doesn't works as a flag for not initialized. Examples are
|
||||||
|
* compass bearing (bearing_t) or NDL (duration_t).
|
||||||
|
* Therefore some types have a default value which is -1 and has to
|
||||||
|
* be set at certain points in the code.
|
||||||
*
|
*
|
||||||
* Thus "millibar" for pressure, for example, or "millikelvin" for
|
* Thus "millibar" for pressure, for example, or "millikelvin" for
|
||||||
* temperatures. Doing temperatures in celsius or fahrenheit would
|
* temperatures. Doing temperatures in celsius or fahrenheit would
|
||||||
|
@ -70,7 +73,7 @@ typedef int64_t timestamp_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t seconds; // durations up to 68 yrs
|
int32_t seconds; // durations up to 34 yrs
|
||||||
} duration_t;
|
} duration_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
Loading…
Add table
Reference in a new issue