summaryrefslogtreecommitdiffstats
path: root/core/units.c
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-06-04 09:05:17 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-06-19 13:11:10 -0700
commitbff80cf4625c4a97182e8333633403d06725a613 (patch)
tree0154f660c6e7db88ff79ad434f5a1df5bf6e076f /core/units.c
parent7f4d9db962e73aa5d5089c43c99b78b3690ffb87 (diff)
downloadsubsurface-bff80cf4625c4a97182e8333633403d06725a613.tar.gz
Cleanup: move unit-related functions to own translation unit
Create a units.c translation unit. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core/units.c')
-rw-r--r--core/units.c174
1 files changed, 174 insertions, 0 deletions
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;
+}