2019-06-04 07:05:17 +00:00
|
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
#include "units.h"
|
|
|
|
|
#include "gettext.h"
|
2021-01-02 12:56:56 +00:00
|
|
|
|
#include "pref.h"
|
2019-06-04 07:05:17 +00:00
|
|
|
|
|
|
|
|
|
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 BAR:
|
|
|
|
|
default:
|
|
|
|
|
pressure = (mb + 500) / 1000;
|
|
|
|
|
unit = translate("gettextFromC", "bar");
|
|
|
|
|
break;
|
|
|
|
|
case PSI:
|
core: return floating point from to_PSI() functions
Dive data are stored internally using integral types using
appropriately fine units (mm, mbar, mkelvin, etc.). These
are converted with functions defined in units.h for display
(m, bar, C, etc.). Usually floating points are returned by
these functions, to retain the necessary precision. There
is one exception: the to_PSI() and mbar_to_PSI() functions.
For consistency, make these functions likewise return floats.
This will be needed for the rework of the profile-axes.
The plan is to use the conversion functions to make the
axes aware of the displayed values. This in turn will be
necessary to place the ticks at sensible distances. However,
the conversions need to be precise, which is not the
case for the current to_PSI() functions.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-09-24 13:07:11 +00:00
|
|
|
|
pressure = (int)lrint(mbar_to_PSI(mb));
|
2019-06-04 07:05:17 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2021-01-02 12:56:56 +00:00
|
|
|
|
|
|
|
|
|
const struct units *get_units()
|
|
|
|
|
{
|
|
|
|
|
return &prefs.units;
|
|
|
|
|
}
|