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 OvmsMetrics MyMetrics
__attribute__ ((init_priority (1800))); __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) void metrics_list(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int argc, const char* const* argv)
{ {
bool found = false; bool found = false;
@ -1465,10 +1505,6 @@ const char* OvmsMetricUnitLabel(metric_unit_t units)
case WattHoursPK: return "Wh/km"; case WattHoursPK: return "Wh/km";
case WattHoursPM: return "Wh/mi"; case WattHoursPM: return "Wh/mi";
case Nm: return "Nm"; case Nm: return "Nm";
case rpm: return "rpm";
case kVA: return "kVA";
case Bar: return "bar";
case mBar: return "mBar";
default: return ""; default: return "";
} }
} }
@ -1478,30 +1514,48 @@ int UnitConvert(metric_unit_t from, metric_unit_t to, int value)
switch (from) switch (from)
{ {
case Kilometers: case Kilometers:
if (to == Miles) return (value*5)/8; switch (to)
else if (to == Meters) return value/1000; {
break; 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: case Miles:
if (to == Kilometers) return (value*8)/5; switch (to)
else if (to == Meters) return (value*8000)/5; {
break; 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: case Meters:
if (to == Feet) return (int)(value * 3.28084); switch (to)
break; {
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: case Feet:
if (to == Meters) return (int)(value * 0.3048); switch (to)
break; {
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: 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; else if (to == MetersPSS) return (value*1000)/3600;
break; break;
case MphPS: case MphPS:
if (to == KphPS) return (value*8)/5; if (to == KphPS) return mi_to_km(value);
else if (to == MetersPSS) return (value*8000)/(5*3600); else if (to == MetersPSS) return mi_to_km(value*1000) / 3600; // (value*8000)/(5*3600);
break; break;
case MetersPSS: case MetersPSS:
if (to == KphPS) return (int) (value*3.6); if (to == KphPS) return (value*3600 / 1000);
else if (to == MphPS) return (int) (value*3.6/1.60934); else if (to == MphPS) return km_to_mi(value*3600) / 1000;
break; break;
case kW: case kW:
if (to == Watts) return (value*1000); 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); if (to == kWh) return (value/1000);
break; break;
case WattHoursPK: case WattHoursPK:
if (to == WattHoursPM) return (value*8)/5; switch (to)
break; {
case WattHoursPM: return pkm_to_pmi(value);
default: break;
}
case WattHoursPM: case WattHoursPM:
if (to == WattHoursPK) return (value*5)/8; switch (to)
{
case WattHoursPK: return pmi_to_pkm(value);
default: break;
}
break; break;
case Celcius: case Celcius:
if (to == Fahrenheit) return ((value*9)/5) + 32; 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; else if (to == Hours) return value/3600;
break; break;
case Kph: case Kph:
if (to == Mph) return (value*5)/8; if (to == Mph) return km_to_mi(value);
break; break;
case Mph: case Mph:
if (to == Kph) return (value*8)/5; if (to == Kph) return mi_to_km(value);
break; break;
case dbm: case dbm:
if (to == sq) return (value <= -51)?((value + 113)/2):0; 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) switch (from)
{ {
case Kilometers: case Kilometers:
if (to == Miles) return (value/1.60934); switch (to)
else if (to == Meters) return value/1000; {
break; 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: case Miles:
if (to == Kilometers) return (value*1.60934); switch (to)
else if (to == Meters) return (value*1609.34); {
break; 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: case Meters:
if (to == Feet) return (value * 3.28084); switch (to)
break; {
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: case Feet:
if (to == Meters) return (value * 0.3048); switch (to)
break; {
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: 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; else if (to == MetersPSS) return value/3.6;
break; break;
case MphPS: case MphPS:
if (to == KphPS) return (value*8)/5; if (to == KphPS) return mi_to_km(value);
else if (to == MetersPSS) return (value*1.60934/3.6); else if (to == MetersPSS) return (mi_to_km(value)/3.6);
break; break;
case MetersPSS: case MetersPSS:
if (to == KphPS) return (value*3.6); 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; break;
case kW: case kW:
if (to == Watts) return (value*1000); 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); if (to == kWh) return (value/1000);
break; break;
case WattHoursPK: case WattHoursPK:
if (to == WattHoursPM) return (value*1.60934); switch (to)
break; {
case WattHoursPM: return pkm_to_pmi(value);
default: break;
}
case WattHoursPM: case WattHoursPM:
if (to == WattHoursPK) return (value/1.60934); switch (to)
{
case WattHoursPK: return pmi_to_pkm(value);
default: break;
}
break; break;
case Celcius: case Celcius:
if (to == Fahrenheit) return ((value*9)/5) + 32; 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; else if (to == Minutes) return value*60;
break; break;
case Kph: case Kph:
if (to == Mph) return (value/1.60934); if (to == Mph) return km_to_mi(value);
break; break;
case Mph: case Mph:
if (to == Kph) return (value*1.60934); if (to == Kph) return mi_to_km(value);
break; break;
case dbm: case dbm:
if (to == sq) return int((value <= -51)?((value + 113)/2):0); if (to == sq) return int((value <= -51)?((value + 113)/2):0);