diff options
author | Stefan Fuchs <sfuchs@gmx.de> | 2017-11-05 15:56:35 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-11-13 20:50:10 -0800 |
commit | 1f8506ce645000bd158fcd3b2c9c799505c78bb2 (patch) | |
tree | e0a2b81e3198240d8cf16a59ef7ff00054dc5c18 | |
parent | de81effb258c9c55af299ef48e79df4de941b391 (diff) | |
download | subsurface-1f8506ce645000bd158fcd3b2c9c799505c78bb2.tar.gz |
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>
-rw-r--r-- | core/display.h | 1 | ||||
-rw-r--r-- | core/dive.c | 10 | ||||
-rw-r--r-- | core/dive.h | 44 | ||||
-rw-r--r-- | core/profile.c | 44 | ||||
-rw-r--r-- | core/units.h | 9 |
5 files changed, 61 insertions, 47 deletions
diff --git a/core/display.h b/core/display.h index 6d74b5c87..b5b6a3938 100644 --- a/core/display.h +++ b/core/display.h @@ -25,7 +25,6 @@ struct plot_info { enum {AIR, NITROX, TRIMIX, FREEDIVING} dive_type; double endtempcoord; double maxpp; - bool has_ndl; struct plot_data *entry; }; diff --git a/core/dive.c b/core/dive.c index fccfe4da9..9e3d42a44 100644 --- a/core/dive.c +++ b/core/dive.c @@ -753,6 +753,10 @@ struct sample *prepare_sample(struct divecomputer *dc) sample->sensor[0] = sample[-1].sensor[0]; sample->sensor[1] = sample[-1].sensor[1]; } + // Init some values with -1 + sample->bearing.degrees = -1; + sample->ndl.seconds = -1; + return sample; } return NULL; @@ -1261,12 +1265,12 @@ static void fixup_meandepth(struct dive *dive) static void fixup_duration(struct dive *dive) { struct divecomputer *dc; - unsigned int duration = 0; + duration_t duration = { }; 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; } /* diff --git a/core/dive.h b/core/dive.h index 0563e0d4e..a862748d7 100644 --- a/core/dive.h +++ b/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); #define MAX_SENSORS 2 -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 stoptime; // uint32_t 4 seconds (0-18 h) time duration of next deco stop - duration_t ndl; // uint32_t 4 seconds (0-18 h) time duration before no-deco limit - duration_t tts; // uint32_t 4 seconds (0-18 h) time duration to reach the surface - duration_t rbt; // uint32_t 4 seconds (0-18 h) remaining bottom time - 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 - 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) - 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) - bearing_t bearing; // int16_t 2 degrees (-32k to 32k deg) compass bearing - 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 - uint8_t heartbeat; // uint8_t 1 beats/m (0-255) heart rate measurement - volume_t sac; // 4 ml/min predefined SAC - 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, - // not calculated when planning a dive -}; // Total size of structure: 57 bytes, excluding padding at end +struct sample // BASE TYPE BYTES UNITS RANGE DESCRIPTION +{ // --------- ----- ----- ----- ----------- + duration_t time; // int32_t 4 seconds (0-34 yrs) elapsed dive time up to this sample + duration_t stoptime; // int32_t 4 seconds (0-34 yrs) time duration of next deco stop + duration_t ndl; // int32_t 4 seconds (-1 no val, 0-34 yrs) time duration before no-deco limit + duration_t tts; // int32_t 4 seconds (0-34 yrs) time duration to reach the surface + 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 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 + 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 o2sensor[3]; // uint16_t 6 mbar (0-65 bar) Up to 3 PO2 sensor values (rebreather) + 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 + uint16_t cns; // uint16_t 1 % (0-64k %) cns% accumulated + uint8_t heartbeat; // uint8_t 1 beats/m (0-255) heart rate measurement + volume_t sac; // 4 ml/min predefined SAC + 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, + // not calculated when planning a dive +}; // Total size of structure: 57 bytes, excluding padding at end struct divetag { /* diff --git a/core/profile.c b/core/profile.c index a1d0c45f0..50e906a09 100644 --- a/core/profile.c +++ b/core/profile.c @@ -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; \ memset(entry->pressure, 0, sizeof(entry->pressure)); \ entry->sac = _sac; \ + entry->ndl = -1; \ + entry->bearing = -1; \ entry++; \ idx++ @@ -576,7 +578,6 @@ struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer * entry->stoptime = sample->stoptime.seconds; entry->ndl = sample->ndl.seconds; entry->tts = sample->tts.seconds; - pi->has_ndl |= sample->ndl.seconds; entry->in_deco = sample->in_deco; entry->cns = sample->cns; if (dc->divemode == CCR) { @@ -1320,7 +1321,7 @@ struct divecomputer *select_dc(struct dive *dive) 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; 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); if (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); - 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); - 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); - if (prefs.mod) { + if (prefs.mod && entry->mod > 0) { mod = lrint(get_depth_units(lrint(entry->mod), NULL, &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) { switch (pi->dive_type) { case NITROX: - ead = lrint(get_depth_units(lrint(entry->ead), NULL, &depth_unit)); - put_format(b, translate("gettextFromC", "EAD: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), ead, depth_unit, eadd, depth_unit, entry->density); - break; + if (entry->ead > 0) { + ead = lrint(get_depth_units(lrint(entry->ead), NULL, &depth_unit)); + put_format(b, translate("gettextFromC", "EAD: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), ead, depth_unit, eadd, depth_unit, entry->density); + break; + } case TRIMIX: - end = lrint(get_depth_units(lrint(entry->end), NULL, &depth_unit)); - put_format(b, translate("gettextFromC", "END: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), end, depth_unit, eadd, depth_unit, entry->density); - break; + if (entry->end > 0) { + end = lrint(get_depth_units(lrint(entry->end), NULL, &depth_unit)); + put_format(b, translate("gettextFromC", "END: %d%s\nEADD: %d%s / %.1fg/ℓ\n"), end, depth_unit, eadd, depth_unit, entry->density); + break; + } 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: /* nothing */ break; @@ -1384,7 +1391,7 @@ static void plot_string(struct plot_info *pi, struct plot_data *entry, struct me } if (entry->stopdepth) { 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 */ if (entry->stoptime) 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) { 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)); } 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) 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); if (entry->running_sum) { 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; 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; if (entry->sec >= time) break; } if (entry) - plot_string(pi, entry, mb, pi->has_ndl); + plot_string(pi, entry, mb); return (entry); } diff --git a/core/units.h b/core/units.h index d44c50ab4..5e92a00ba 100644 --- a/core/units.h +++ b/core/units.h @@ -42,8 +42,11 @@ extern "C" { * We also strive to make '0' a meaningless number saying "not * initialized", since many values are things that may not have * been reported (eg cylinder pressure or temperature from dive - * computers that don't support them). But sometimes -1 is an even - * more explicit way of saying "not there". + * computers that don't support them). But for some of the values + * 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 * temperatures. Doing temperatures in celsius or fahrenheit would @@ -70,7 +73,7 @@ typedef int64_t timestamp_t; typedef struct { - uint32_t seconds; // durations up to 68 yrs + int32_t seconds; // durations up to 34 yrs } duration_t; typedef struct |