From 58edcc3af8fa1e58371a17adefcc06e2b6b0c064 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Thu, 12 Nov 2015 13:55:24 +0100 Subject: [PATCH 1/2] Fixes #3059: added unit conversions from km/h --- radio/src/telemetry/telemetry.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 4f790fff9..b6ef48e61 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -560,22 +560,40 @@ int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t } else if (unit == UNIT_KTS) { if (destUnit == UNIT_KMH) { - // kts to km/h (1 knot = 1.85200 kilometers per hour) + // 1 knot = 1.85200 kilometers per hour value = (value * 1852) / 1000; } else if (destUnit == UNIT_MPH) { - // kts to mph (1 knot = 1.15077945 miles per hour) + // 1 knot = 1.15077945 miles per hour value = (value * 1151) / 1000; } else if (destUnit == UNIT_METERS_PER_SECOND) { - // kts to m/s (1 knot = 0.514444444 meters / second) - value = (value * 514) / 1000; + // 1 knot = 0.514444444 meters / second (divide with 1.94384449) + value = (value * 1000) / 1944; } else if (destUnit == UNIT_FEET_PER_SECOND) { - // kts to f/s (1 knot = 1.68780986 feet per second) + // 1 knot = 1.68780986 feet per second value = (value * 1688) / 1000; } } + else if (unit == UNIT_KMH) { + if (destUnit == UNIT_KTS) { + // 1 km/h = 0.539956803 knots (divide with 1.85200) + value = (value * 1000) / 1852; + } + else if (destUnit == UNIT_MPH) { + // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) + value = (value * 1000) / 1609; + } + else if (destUnit == UNIT_METERS_PER_SECOND) { + // 1 km/h = 0.277777778 meters / second (or beter division with 3.6) + value = (value * 1000) / 3600; + } + else if (destUnit == UNIT_FEET_PER_SECOND) { + // (1 km/h = 0.911344415 feet per second + value = (value * 911) / 1000; + } + } else if (unit == UNIT_CELSIUS) { if (destUnit == UNIT_FAHRENHEIT) { // T(°F) = T(°C)×1,8 + 32 From 454a664d0101c91f1f1716398a609fe91a9683ac Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Thu, 12 Nov 2015 14:34:46 +0100 Subject: [PATCH 2/2] Re #3059: table lookup used for unit conversion, saved some 50 bytes of FLASH --- radio/src/telemetry/telemetry.cpp | 83 ++++++++++++++----------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index b6ef48e61..b7c51318a 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -547,62 +547,51 @@ bool TelemetrySensor::isAvailable() const return ZLEN(label) > 0; } +PACK(typedef struct { + uint8_t unitFrom; + uint8_t unitTo; + int16_t multiplier; + int16_t divisor; +}) UnitConversionRule; + +const UnitConversionRule unitConversionTable[] = { + /* unitFrom unitTo multiplier divisor */ + { UNIT_METERS, UNIT_FEET, 105, 32}, + { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, 105, 32}, + + { UNIT_KTS, UNIT_KMH, 1852, 1000}, // 1 knot = 1.85200 kilometers per hour + { UNIT_KTS, UNIT_MPH, 1151, 1000}, // 1 knot = 1.15077945 miles per hour + { UNIT_KTS, UNIT_METERS_PER_SECOND, 1000, 1944}, // 1 knot = 0.514444444 meters / second (divide with 1.94384449) + { UNIT_KTS, UNIT_FEET_PER_SECOND, 1688, 1000}, // 1 knot = 1.68780986 feet per second + + { UNIT_KMH, UNIT_KTS, 1000, 1852}, // 1 km/h = 0.539956803 knots (divide with 1.85200) + { UNIT_KMH, UNIT_MPH, 1000, 1609}, // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) + { UNIT_KMH, UNIT_METERS_PER_SECOND, 10, 36}, // 1 km/h = 0.277777778 meters / second (divide with 3.6) + { UNIT_KMH, UNIT_FEET_PER_SECOND, 911, 1000}, // 1 km/h = 0.911344415 feet per second + + { UNIT_MILLILITERS, UNIT_FLOZ, 100, 2957}, + { 0, 0, 0, 0} // termination +}; + int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec) { for (int i=prec; idivisor) { + if (p->unitFrom == unit && p->unitTo == destUnit) { + value = (value * (int32_t)p->multiplier) / (int32_t)p->divisor; + break; + } + ++p; } }