Commit 716930e0 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #3813 from NaterGator/unitconvfixes

Switch to exact conversion constants
parents 083e47bf f863dd73
...@@ -17,10 +17,22 @@ ...@@ -17,10 +17,22 @@
#include "QGroundControlQmlGlobal.h" #include "QGroundControlQmlGlobal.h"
#include <QDebug> #include <QDebug>
#include <QtMath>
#include <limits> #include <limits>
#include <cmath> #include <cmath>
// Conversion Constants
// Time
const qreal FactMetaData::UnitConsts_s::secondsPerHour = 3600.0;
// Velocity
const qreal FactMetaData::UnitConsts_s::knotsToKPH = 1.852; // exact, hence weird base for knotsToMetersPerSecond
// Length
const qreal FactMetaData::UnitConsts_s::milesToMeters = 1609.344;
const qreal FactMetaData::UnitConsts_s::feetToMeters = 0.3048;
// Built in translations for all Facts // Built in translations for all Facts
const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = { const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = {
{ "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees }, { "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees },
...@@ -379,62 +391,62 @@ void FactMetaData::setBuiltInTranslator(void) ...@@ -379,62 +391,62 @@ void FactMetaData::setBuiltInTranslator(void)
QVariant FactMetaData::_degreesToRadians(const QVariant& degrees) QVariant FactMetaData::_degreesToRadians(const QVariant& degrees)
{ {
return QVariant(degrees.toDouble() * (M_PI / 180.0)); return QVariant(qDegreesToRadians(degrees.toDouble()));
} }
QVariant FactMetaData::_radiansToDegrees(const QVariant& radians) QVariant FactMetaData::_radiansToDegrees(const QVariant& radians)
{ {
return QVariant(radians.toDouble() * (180 / M_PI)); return QVariant(qRadiansToDegrees(radians.toDouble()));
} }
QVariant FactMetaData::_centiDegreesToDegrees(const QVariant& centiDegrees) QVariant FactMetaData::_centiDegreesToDegrees(const QVariant& centiDegrees)
{ {
return QVariant(centiDegrees.toFloat() / 100.0f); return QVariant(centiDegrees.toReal() / 100.0);
} }
QVariant FactMetaData::_degreesToCentiDegrees(const QVariant& degrees) QVariant FactMetaData::_degreesToCentiDegrees(const QVariant& degrees)
{ {
return QVariant((unsigned int)(degrees.toFloat() * 100.0f)); return QVariant(qRound(degrees.toReal() * 100.0));
} }
QVariant FactMetaData::_metersToFeet(const QVariant& meters) QVariant FactMetaData::_metersToFeet(const QVariant& meters)
{ {
return QVariant(meters.toDouble() * 3.28083989501); return QVariant(meters.toDouble() * 1.0/constants.feetToMeters);
} }
QVariant FactMetaData::_feetToMeters(const QVariant& feet) QVariant FactMetaData::_feetToMeters(const QVariant& feet)
{ {
return QVariant(feet.toDouble() * 0.305); return QVariant(feet.toDouble() * constants.feetToMeters);
} }
QVariant FactMetaData::_metersPerSecondToMilesPerHour(const QVariant& metersPerSecond) QVariant FactMetaData::_metersPerSecondToMilesPerHour(const QVariant& metersPerSecond)
{ {
return QVariant((metersPerSecond.toDouble() * 0.000621371192) * 60.0 * 60.0); return QVariant((metersPerSecond.toDouble() * 1.0/constants.milesToMeters) * constants.secondsPerHour);
} }
QVariant FactMetaData::_milesPerHourToMetersPerSecond(const QVariant& milesPerHour) QVariant FactMetaData::_milesPerHourToMetersPerSecond(const QVariant& milesPerHour)
{ {
return QVariant((milesPerHour.toDouble() * 1609.344) / (60.0 * 60.0)); return QVariant((milesPerHour.toDouble() * constants.milesToMeters) / constants.secondsPerHour);
} }
QVariant FactMetaData::_metersPerSecondToKilometersPerHour(const QVariant& metersPerSecond) QVariant FactMetaData::_metersPerSecondToKilometersPerHour(const QVariant& metersPerSecond)
{ {
return QVariant((metersPerSecond.toDouble() / 1000.0) * 60.0 * 60.0); return QVariant((metersPerSecond.toDouble() / 1000.0) * constants.secondsPerHour);
} }
QVariant FactMetaData::_kilometersPerHourToMetersPerSecond(const QVariant& kilometersPerHour) QVariant FactMetaData::_kilometersPerHourToMetersPerSecond(const QVariant& kilometersPerHour)
{ {
return QVariant((kilometersPerHour.toDouble() * 1000.0) / (60.0 * 60.0)); return QVariant((kilometersPerHour.toDouble() * 1000.0) / constants.secondsPerHour);
} }
QVariant FactMetaData::_metersPerSecondToKnots(const QVariant& metersPerSecond) QVariant FactMetaData::_metersPerSecondToKnots(const QVariant& metersPerSecond)
{ {
return QVariant(metersPerSecond.toDouble() * 1.94384449244); return QVariant(metersPerSecond.toDouble() * constants.secondsPerHour / (1000.0 * constants.knotsToKPH));
} }
QVariant FactMetaData::_knotsToMetersPerSecond(const QVariant& knots) QVariant FactMetaData::_knotsToMetersPerSecond(const QVariant& knots)
{ {
return QVariant(knots.toDouble() * 0.51444444444); return QVariant(knots.toDouble() * (constants.knotsToKPH / (1000.0 * constants.secondsPerHour)));
} }
QVariant FactMetaData::_percentToNorm(const QVariant& percent) QVariant FactMetaData::_percentToNorm(const QVariant& percent)
......
...@@ -188,6 +188,14 @@ private: ...@@ -188,6 +188,14 @@ private:
bool _rebootRequired; bool _rebootRequired;
double _increment; double _increment;
// Exact conversion constants
static const struct UnitConsts_s {
static const qreal secondsPerHour;
static const qreal knotsToKPH;
static const qreal milesToMeters;
static const qreal feetToMeters;
} constants;
struct BuiltInTranslation_s { struct BuiltInTranslation_s {
const char* rawUnits; const char* rawUnits;
const char* cookedUnits; const char* cookedUnits;
...@@ -195,6 +203,7 @@ private: ...@@ -195,6 +203,7 @@ private:
Translator cookedTranslator; Translator cookedTranslator;
}; };
static const BuiltInTranslation_s _rgBuiltInTranslations[]; static const BuiltInTranslation_s _rgBuiltInTranslations[];
static const AppSettingsTranslation_s _rgAppSettingsTranslations[]; static const AppSettingsTranslation_s _rgAppSettingsTranslations[];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment