From bff80cf4625c4a97182e8333633403d06725a613 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Tue, 4 Jun 2019 09:05:17 +0200 Subject: Cleanup: move unit-related functions to own translation unit Create a units.c translation unit. Signed-off-by: Berthold Stoeger --- core/CMakeLists.txt | 1 + core/dive.c | 171 --------------------------------------------------- core/dive.h | 13 ---- core/units.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++ core/units.h | 17 ++++- 5 files changed, 190 insertions(+), 186 deletions(-) create mode 100644 core/units.c (limited to 'core') diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 6a0a1ad40..5121222cc 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -156,6 +156,7 @@ set(SUBSURFACE_CORE_LIB_SRCS uemis.c uemis.h units.h + units.c version.c version.h videoframeextractor.cpp diff --git a/core/dive.c b/core/dive.c index b64d2654e..2d82f5565 100644 --- a/core/dive.c +++ b/core/dive.c @@ -273,177 +273,6 @@ struct gasmix get_gasmix_from_event(const struct dive *dive, const struct event return dummy; } -int get_pressure_units(int mb, const char **units) -{ - int pressure; - const char *unit; - const struct units *units_p = get_units(); - - switch (units_p->pressure) { - case PASCAL: - pressure = mb * 100; - unit = translate("gettextFromC", "pascal"); - break; - case BAR: - default: - pressure = (mb + 500) / 1000; - unit = translate("gettextFromC", "bar"); - break; - case PSI: - pressure = mbar_to_PSI(mb); - unit = translate("gettextFromC", "psi"); - break; - } - if (units) - *units = unit; - return pressure; -} - -double get_temp_units(unsigned int mk, const char **units) -{ - double deg; - const char *unit; - const struct units *units_p = get_units(); - - if (units_p->temperature == FAHRENHEIT) { - deg = mkelvin_to_F(mk); - unit = "°F"; - } else { - deg = mkelvin_to_C(mk); - unit = "°C"; - } - if (units) - *units = unit; - return deg; -} - -double get_volume_units(unsigned int ml, int *frac, const char **units) -{ - int decimals; - double vol; - const char *unit; - const struct units *units_p = get_units(); - - switch (units_p->volume) { - case LITER: - default: - vol = ml / 1000.0; - unit = translate("gettextFromC", "ℓ"); - decimals = 1; - break; - case CUFT: - vol = ml_to_cuft(ml); - unit = translate("gettextFromC", "cuft"); - decimals = 2; - break; - } - if (frac) - *frac = decimals; - if (units) - *units = unit; - return vol; -} - -int units_to_sac(double volume) -{ - if (get_units()->volume == CUFT) - return lrint(cuft_to_l(volume) * 1000.0); - else - return lrint(volume * 1000); -} - -depth_t units_to_depth(double depth) -{ - depth_t internaldepth; - if (get_units()->length == METERS) { - internaldepth.mm = lrint(depth * 1000); - } else { - internaldepth.mm = feet_to_mm(depth); - } - return internaldepth; -} - -double get_depth_units(int mm, int *frac, const char **units) -{ - int decimals; - double d; - const char *unit; - const struct units *units_p = get_units(); - - switch (units_p->length) { - case METERS: - default: - d = mm / 1000.0; - unit = translate("gettextFromC", "m"); - decimals = d < 20; - break; - case FEET: - d = mm_to_feet(mm); - unit = translate("gettextFromC", "ft"); - decimals = 0; - break; - } - if (frac) - *frac = decimals; - if (units) - *units = unit; - return d; -} - -double get_vertical_speed_units(unsigned int mms, int *frac, const char **units) -{ - double d; - const char *unit; - const struct units *units_p = get_units(); - const double time_factor = units_p->vertical_speed_time == MINUTES ? 60.0 : 1.0; - - switch (units_p->length) { - case METERS: - default: - d = mms / 1000.0 * time_factor; - if (units_p->vertical_speed_time == MINUTES) - unit = translate("gettextFromC", "m/min"); - else - unit = translate("gettextFromC", "m/s"); - break; - case FEET: - d = mm_to_feet(mms) * time_factor; - if (units_p->vertical_speed_time == MINUTES) - unit = translate("gettextFromC", "ft/min"); - else - unit = translate("gettextFromC", "ft/s"); - break; - } - if (frac) - *frac = d < 10; - if (units) - *units = unit; - return d; -} - -double get_weight_units(unsigned int grams, int *frac, const char **units) -{ - int decimals; - double value; - const char *unit; - const struct units *units_p = get_units(); - - if (units_p->weight == LBS) { - value = grams_to_lbs(grams); - unit = translate("gettextFromC", "lbs"); - decimals = 0; - } else { - value = grams / 1000.0; - unit = translate("gettextFromC", "kg"); - decimals = 1; - } - if (frac) - *frac = decimals; - if (units) - *units = unit; - return value; -} - // we need this to be uniq. oh, and it has no meaning whatsoever // - that's why we have the silly initial number and increment by 3 :-) int dive_getUniqID() diff --git a/core/dive.h b/core/dive.h index 6fd78d2dc..093046cf4 100644 --- a/core/dive.h +++ b/core/dive.h @@ -63,16 +63,6 @@ struct event { extern int event_is_gaschange(const struct event *ev); -extern int get_pressure_units(int mb, const char **units); -extern double get_depth_units(int mm, int *frac, const char **units); -extern double get_volume_units(unsigned int ml, int *frac, const char **units); -extern double get_temp_units(unsigned int mk, const char **units); -extern double get_weight_units(unsigned int grams, int *frac, const char **units); -extern double get_vertical_speed_units(unsigned int mms, int *frac, const char **units); - -extern depth_t units_to_depth(double depth); -extern int units_to_sac(double volume); - /* Volume in mliter of a cylinder at pressure 'p' */ extern int gas_volume(const cylinder_t *cyl, pressure_t p); extern double gas_compressibility_factor(struct gasmix gas, double bar); @@ -294,9 +284,6 @@ extern bool autogroup; struct dive *unregister_dive(int idx); extern void delete_single_dive(int idx); -extern const struct units SI_units, IMPERIAL_units; - -extern const struct units *get_units(void); extern int run_survey, verbose, quit, force_root; extern struct dive_table dive_table; diff --git a/core/units.c b/core/units.c new file mode 100644 index 000000000..f0dba064b --- /dev/null +++ b/core/units.c @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "units.h" +#include "gettext.h" + +int get_pressure_units(int mb, const char **units) +{ + int pressure; + const char *unit; + const struct units *units_p = get_units(); + + switch (units_p->pressure) { + case PASCAL: + pressure = mb * 100; + unit = translate("gettextFromC", "pascal"); + break; + case BAR: + default: + pressure = (mb + 500) / 1000; + unit = translate("gettextFromC", "bar"); + break; + case PSI: + pressure = mbar_to_PSI(mb); + unit = translate("gettextFromC", "psi"); + break; + } + if (units) + *units = unit; + return pressure; +} + +double get_temp_units(unsigned int mk, const char **units) +{ + double deg; + const char *unit; + const struct units *units_p = get_units(); + + if (units_p->temperature == FAHRENHEIT) { + deg = mkelvin_to_F(mk); + unit = "°F"; + } else { + deg = mkelvin_to_C(mk); + unit = "°C"; + } + if (units) + *units = unit; + return deg; +} + +double get_volume_units(unsigned int ml, int *frac, const char **units) +{ + int decimals; + double vol; + const char *unit; + const struct units *units_p = get_units(); + + switch (units_p->volume) { + case LITER: + default: + vol = ml / 1000.0; + unit = translate("gettextFromC", "ℓ"); + decimals = 1; + break; + case CUFT: + vol = ml_to_cuft(ml); + unit = translate("gettextFromC", "cuft"); + decimals = 2; + break; + } + if (frac) + *frac = decimals; + if (units) + *units = unit; + return vol; +} + +int units_to_sac(double volume) +{ + if (get_units()->volume == CUFT) + return lrint(cuft_to_l(volume) * 1000.0); + else + return lrint(volume * 1000); +} + +depth_t units_to_depth(double depth) +{ + depth_t internaldepth; + if (get_units()->length == METERS) { + internaldepth.mm = lrint(depth * 1000); + } else { + internaldepth.mm = feet_to_mm(depth); + } + return internaldepth; +} + +double get_depth_units(int mm, int *frac, const char **units) +{ + int decimals; + double d; + const char *unit; + const struct units *units_p = get_units(); + + switch (units_p->length) { + case METERS: + default: + d = mm / 1000.0; + unit = translate("gettextFromC", "m"); + decimals = d < 20; + break; + case FEET: + d = mm_to_feet(mm); + unit = translate("gettextFromC", "ft"); + decimals = 0; + break; + } + if (frac) + *frac = decimals; + if (units) + *units = unit; + return d; +} + +double get_vertical_speed_units(unsigned int mms, int *frac, const char **units) +{ + double d; + const char *unit; + const struct units *units_p = get_units(); + const double time_factor = units_p->vertical_speed_time == MINUTES ? 60.0 : 1.0; + + switch (units_p->length) { + case METERS: + default: + d = mms / 1000.0 * time_factor; + if (units_p->vertical_speed_time == MINUTES) + unit = translate("gettextFromC", "m/min"); + else + unit = translate("gettextFromC", "m/s"); + break; + case FEET: + d = mm_to_feet(mms) * time_factor; + if (units_p->vertical_speed_time == MINUTES) + unit = translate("gettextFromC", "ft/min"); + else + unit = translate("gettextFromC", "ft/s"); + break; + } + if (frac) + *frac = d < 10; + if (units) + *units = unit; + return d; +} + +double get_weight_units(unsigned int grams, int *frac, const char **units) +{ + int decimals; + double value; + const char *unit; + const struct units *units_p = get_units(); + + if (units_p->weight == LBS) { + value = grams_to_lbs(grams); + unit = translate("gettextFromC", "lbs"); + decimals = 0; + } else { + value = grams / 1000.0; + unit = translate("gettextFromC", "kg"); + decimals = 1; + } + if (frac) + *frac = decimals; + if (units) + *units = unit; + return value; +} diff --git a/core/units.h b/core/units.h index 2307622e9..565b15d58 100644 --- a/core/units.h +++ b/core/units.h @@ -319,15 +319,28 @@ struct units { #define SI_UNITS \ { \ .length = METERS, .volume = LITER, .pressure = BAR, .temperature = CELSIUS, .weight = KG, \ - .vertical_speed_time = MINUTES, .duration_units = MIXED, .show_units_table = false \ + .vertical_speed_time = MINUTES, .duration_units = MIXED, .show_units_table = false \ } #define IMPERIAL_UNITS \ { \ .length = FEET, .volume = CUFT, .pressure = PSI, .temperature = FAHRENHEIT, .weight = LBS, \ - .vertical_speed_time = MINUTES, .duration_units = MIXED, .show_units_table = false \ + .vertical_speed_time = MINUTES, .duration_units = MIXED, .show_units_table = false \ } +extern const struct units SI_units, IMPERIAL_units; + +extern const struct units *get_units(void); + +extern int get_pressure_units(int mb, const char **units); +extern double get_depth_units(int mm, int *frac, const char **units); +extern double get_volume_units(unsigned int ml, int *frac, const char **units); +extern double get_temp_units(unsigned int mk, const char **units); +extern double get_weight_units(unsigned int grams, int *frac, const char **units); +extern double get_vertical_speed_units(unsigned int mms, int *frac, const char **units); + +extern depth_t units_to_depth(double depth); +extern int units_to_sac(double volume); #ifdef __cplusplus } #endif -- cgit v1.2.3-70-g09d2