Original project changes: Metrics - Improve accuracy/consistency km <--> mi and other length conversions

This commit is contained in:
Carsten Schmiemann 2022-11-18 23:24:11 +01:00
parent 3121178a97
commit c761ec774c
1 changed files with 129 additions and 43 deletions

View File

@ -58,6 +58,46 @@ std::map<std::size_t, const char*> pmetrics_keymap // hash key → me
OvmsMetrics MyMetrics
__attribute__ ((init_priority (1800)));
static inline int mi_to_km(int mi)
{
return mi * 4023 / 2500; // mi * 1.6092
}
static inline float mi_to_km(float mi)
{
return mi * 1.609347;
}
static inline double mi_to_km(double mi)
{
return mi * 1.609347;
}
static inline int km_to_mi(int km)
{
return km * 2500 / 4023; // km / 1.6092
}
static inline float km_to_mi(float km)
{
return km * 0.6213700; // km / 1.609347;
}
static inline double km_to_mi(double km)
{
return km * 0.6213700; // 1 / 1.609347;
}
const int feet_per_mile = 5280;
// Alias for reading clarity.
template<typename T>
T pmi_to_pkm(T pmi)
{
return km_to_mi(pmi);
}
// Alias for reading clarity.
template<typename T>
T pkm_to_pmi(T pkm)
{
return mi_to_km(pkm);
}
void metrics_list(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int argc, const char* const* argv)
{
bool found = false;
@ -1465,10 +1505,6 @@ const char* OvmsMetricUnitLabel(metric_unit_t units)
case WattHoursPK: return "Wh/km";
case WattHoursPM: return "Wh/mi";
case Nm: return "Nm";
case rpm: return "rpm";
case kVA: return "kVA";
case Bar: return "bar";
case mBar: return "mBar";
default: return "";
}
}
@ -1478,30 +1514,48 @@ int UnitConvert(metric_unit_t from, metric_unit_t to, int value)
switch (from)
{
case Kilometers:
if (to == Miles) return (value*5)/8;
else if (to == Meters) return value/1000;
break;
switch (to)
{
case Miles: return km_to_mi(value);
case Meters: return value*1000;
case Feet: return km_to_mi(value) * feet_per_mile;
default: break;
}
case Miles:
if (to == Kilometers) return (value*8)/5;
else if (to == Meters) return (value*8000)/5;
break;
switch (to)
{
case Kilometers: return mi_to_km(value);
case Meters: return mi_to_km(value*1000);
case Feet: return value * feet_per_mile;
default: break;
}
case Meters:
if (to == Feet) return (int)(value * 3.28084);
break;
switch (to)
{
case Miles: return km_to_mi(value)/1000;
case Kilometers: return value/1000;
case Feet: return km_to_mi( value * feet_per_mile)/ 1000;
default: break;
}
case Feet:
if (to == Meters) return (int)(value * 0.3048);
break;
switch (to)
{
case Kilometers: return mi_to_km(value)/feet_per_mile;
case Meters: return (mi_to_km(value*1000)/feet_per_mile);
case Miles: return value / feet_per_mile;
default: break;
}
case KphPS:
if (to == MphPS) return (value*5)/8;
if (to == MphPS) return km_to_mi(value);
else if (to == MetersPSS) return (value*1000)/3600;
break;
case MphPS:
if (to == KphPS) return (value*8)/5;
else if (to == MetersPSS) return (value*8000)/(5*3600);
if (to == KphPS) return mi_to_km(value);
else if (to == MetersPSS) return mi_to_km(value*1000) / 3600; // (value*8000)/(5*3600);
break;
case MetersPSS:
if (to == KphPS) return (int) (value*3.6);
else if (to == MphPS) return (int) (value*3.6/1.60934);
if (to == KphPS) return (value*3600 / 1000);
else if (to == MphPS) return km_to_mi(value*3600) / 1000;
break;
case kW:
if (to == Watts) return (value*1000);
@ -1516,10 +1570,17 @@ int UnitConvert(metric_unit_t from, metric_unit_t to, int value)
if (to == kWh) return (value/1000);
break;
case WattHoursPK:
if (to == WattHoursPM) return (value*8)/5;
break;
switch (to)
{
case WattHoursPM: return pkm_to_pmi(value);
default: break;
}
case WattHoursPM:
if (to == WattHoursPK) return (value*5)/8;
switch (to)
{
case WattHoursPK: return pmi_to_pkm(value);
default: break;
}
break;
case Celcius:
if (to == Fahrenheit) return ((value*9)/5) + 32;
@ -1565,10 +1626,10 @@ int UnitConvert(metric_unit_t from, metric_unit_t to, int value)
else if (to == Hours) return value/3600;
break;
case Kph:
if (to == Mph) return (value*5)/8;
if (to == Mph) return km_to_mi(value);
break;
case Mph:
if (to == Kph) return (value*8)/5;
if (to == Kph) return mi_to_km(value);
break;
case dbm:
if (to == sq) return (value <= -51)?((value + 113)/2):0;
@ -1587,30 +1648,48 @@ float UnitConvert(metric_unit_t from, metric_unit_t to, float value)
switch (from)
{
case Kilometers:
if (to == Miles) return (value/1.60934);
else if (to == Meters) return value/1000;
break;
switch (to)
{
case Miles: return km_to_mi(value);
case Meters: return value*1000;
case Feet: return km_to_mi(value) * feet_per_mile;
default: break;
}
case Miles:
if (to == Kilometers) return (value*1.60934);
else if (to == Meters) return (value*1609.34);
break;
switch (to)
{
case Kilometers: return mi_to_km(value);
case Meters: return (mi_to_km(value)*1000);
case Feet: return value * feet_per_mile;
default: break;
}
case Meters:
if (to == Feet) return (value * 3.28084);
break;
switch (to)
{
case Miles: return km_to_mi(value/1000);
case Kilometers: return value/1000;
case Feet: return km_to_mi(value/1000) * feet_per_mile;
default: break;
}
case Feet:
if (to == Meters) return (value * 0.3048);
break;
switch (to)
{
case Kilometers: return mi_to_km(value/feet_per_mile);
case Meters: return (mi_to_km(value/feet_per_mile)*1000);
case Miles: return value / feet_per_mile;
default: break;
}
case KphPS:
if (to == MphPS) return (value/1.60934);
if (to == MphPS) return km_to_mi(value);
else if (to == MetersPSS) return value/3.6;
break;
case MphPS:
if (to == KphPS) return (value*8)/5;
else if (to == MetersPSS) return (value*1.60934/3.6);
if (to == KphPS) return mi_to_km(value);
else if (to == MetersPSS) return (mi_to_km(value)/3.6);
break;
case MetersPSS:
if (to == KphPS) return (value*3.6);
else if (to == MphPS) return (value*3.6/1.60934);
else if (to == MphPS) return (km_to_mi(value)*3.6);
break;
case kW:
if (to == Watts) return (value*1000);
@ -1625,10 +1704,17 @@ float UnitConvert(metric_unit_t from, metric_unit_t to, float value)
if (to == kWh) return (value/1000);
break;
case WattHoursPK:
if (to == WattHoursPM) return (value*1.60934);
break;
switch (to)
{
case WattHoursPM: return pkm_to_pmi(value);
default: break;
}
case WattHoursPM:
if (to == WattHoursPK) return (value/1.60934);
switch (to)
{
case WattHoursPK: return pmi_to_pkm(value);
default: break;
}
break;
case Celcius:
if (to == Fahrenheit) return ((value*9)/5) + 32;
@ -1661,10 +1747,10 @@ float UnitConvert(metric_unit_t from, metric_unit_t to, float value)
else if (to == Minutes) return value*60;
break;
case Kph:
if (to == Mph) return (value/1.60934);
if (to == Mph) return km_to_mi(value);
break;
case Mph:
if (to == Kph) return (value*1.60934);
if (to == Kph) return mi_to_km(value);
break;
case dbm:
if (to == sq) return int((value <= -51)?((value + 113)/2):0);