diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 2fc884185838f63b133cad5ade8eb08797d427e7..400c3693336cec3089604198f0a6321144fc40e8 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -34,9 +34,10 @@ const qreal FactMetaData::UnitConsts_s::inchesToCentimeters = 2.54; // Built in translations for all Facts const FactMetaData::BuiltInTranslation_s FactMetaData::_rgBuiltInTranslations[] = { - { "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees }, - { "radians", "deg", FactMetaData::_radiansToDegrees, FactMetaData::_degreesToRadians }, - { "norm", "%", FactMetaData::_normToPercent, FactMetaData::_percentToNorm }, + { "centi-degrees", "deg", FactMetaData::_centiDegreesToDegrees, FactMetaData::_degreesToCentiDegrees }, + { "radians", "deg", FactMetaData::_radiansToDegrees, FactMetaData::_degreesToRadians }, + { "gimbal-degrees", "deg", FactMetaData::_mavlinkGimbalDegreesToUserGimbalDegrees, FactMetaData::_userGimbalDegreesToMavlinkGimbalDegrees }, + { "norm", "%", FactMetaData::_normToPercent, FactMetaData::_percentToNorm }, }; // Translations driven by app settings @@ -256,7 +257,7 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO case FactMetaData::valueTypeInt32: typedValue = QVariant(rawValue.toInt(&convertOk)); if (!convertOnly && convertOk) { - if (rawMin() > typedValue || typedValue > rawMax()) { + if (typedValue < rawMin() || typedValue > rawMax()) { errorString = QString("Value must be within %1 and %2").arg(cookedMin().toInt()).arg(cookedMax().toInt()); } } @@ -267,7 +268,7 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO case FactMetaData::valueTypeUint32: typedValue = QVariant(rawValue.toUInt(&convertOk)); if (!convertOnly && convertOk) { - if (rawMin() > typedValue || typedValue > rawMax()) { + if (typedValue < rawMin() || typedValue > rawMax()) { errorString = QString("Value must be within %1 and %2").arg(cookedMin().toUInt()).arg(cookedMax().toUInt()); } } @@ -276,7 +277,7 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO case FactMetaData::valueTypeFloat: typedValue = QVariant(rawValue.toFloat(&convertOk)); if (!convertOnly && convertOk) { - if (rawMin() > typedValue || typedValue > rawMax()) { + if (typedValue < rawMin() || typedValue > rawMax()) { errorString = QString("Value must be within %1 and %2").arg(cookedMin().toFloat()).arg(cookedMax().toFloat()); } } @@ -285,7 +286,7 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO case FactMetaData::valueTypeDouble: typedValue = QVariant(rawValue.toDouble(&convertOk)); if (!convertOnly && convertOk) { - if (rawMin() > typedValue || typedValue > rawMax()) { + if (typedValue < rawMin() || typedValue > rawMax()) { errorString = QString("Value must be within %1 and %2").arg(cookedMin().toDouble()).arg(cookedMax().toDouble()); } } @@ -455,6 +456,20 @@ QVariant FactMetaData::_degreesToCentiDegrees(const QVariant& degrees) return QVariant(qRound(degrees.toReal() * 100.0)); } +QVariant FactMetaData::_userGimbalDegreesToMavlinkGimbalDegrees(const QVariant& userGimbalDegrees) +{ + // User facing gimbal degree values are from 0 (level) to 90 (straight down) + // Mavlink gimbal degree values are from 0 (level) to -90 (straight down) + return userGimbalDegrees.toDouble() * -1.0; +} + +QVariant FactMetaData::_mavlinkGimbalDegreesToUserGimbalDegrees(const QVariant& mavlinkGimbalDegrees) +{ + // User facing gimbal degree values are from 0 (level) to 90 (straight down) + // Mavlink gimbal degree values are from 0 (level) to -90 (straight down) + return mavlinkGimbalDegrees.toDouble() * -1.0; +} + QVariant FactMetaData::_metersToFeet(const QVariant& meters) { return QVariant(meters.toDouble() * 1.0/constants.feetToMeters); @@ -908,3 +923,29 @@ QMap FactMetaData::createMapFromJsonFile(const QString& return metaDataMap; } + +QVariant FactMetaData::cookedMax(void) const +{ + // We have to be careful with cooked min/max. Running the raw values through the translator could flip min and max. + QVariant cookedMax = _rawTranslator(_rawMax); + QVariant cookedMin = _rawTranslator(_rawMin); + if (cookedMax < cookedMin) { + // We need to flip + return cookedMin; + } else { + return cookedMax; + } +} + +QVariant FactMetaData::cookedMin(void) const +{ + // We have to be careful with cooked min/max. Running the raw values through the translator could flip min and max. + QVariant cookedMax = _rawTranslator(_rawMax); + QVariant cookedMin = _rawTranslator(_rawMin); + if (cookedMax < cookedMin) { + // We need to flip + return cookedMax; + } else { + return cookedMin; + } +} diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 60f4e6c60f1f1e654f1859dc7740e2570e18bae5..f34b73e387986a9fd1562cc5b610ad8f468d1857 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -83,10 +83,10 @@ public: QString group (void) const { return _group; } QString longDescription (void) const { return _longDescription;} QVariant rawMax (void) const { return _rawMax; } - QVariant cookedMax (void) const { return _rawTranslator(_rawMax); } + QVariant cookedMax (void) const; bool maxIsDefaultForType (void) const { return _maxIsDefaultForType; } QVariant rawMin (void) const { return _rawMin; } - QVariant cookedMin (void) const { return _rawTranslator(_rawMin); } + QVariant cookedMin (void) const; bool minIsDefaultForType (void) const { return _minIsDefaultForType; } QString name (void) const { return _name; } QString shortDescription (void) const { return _shortDescription; } @@ -155,6 +155,8 @@ private: static QVariant _radiansToDegrees(const QVariant& radians); static QVariant _centiDegreesToDegrees(const QVariant& centiDegrees); static QVariant _degreesToCentiDegrees(const QVariant& degrees); + static QVariant _userGimbalDegreesToMavlinkGimbalDegrees(const QVariant& userGimbalDegrees); + static QVariant _mavlinkGimbalDegreesToUserGimbalDegrees(const QVariant& mavlinkGimbalDegrees); static QVariant _metersToFeet(const QVariant& meters); static QVariant _feetToMeters(const QVariant& feet); static QVariant _squareMetersToSquareKilometers(const QVariant& squareMeters); diff --git a/src/MissionManager/CameraSection.FactMetaData.json b/src/MissionManager/CameraSection.FactMetaData.json index 5726fd97edff0e7029e89f07c1712d24af40b569..6856fc1bf0183e4a4049611f459e898737ba8549 100644 --- a/src/MissionManager/CameraSection.FactMetaData.json +++ b/src/MissionManager/CameraSection.FactMetaData.json @@ -29,7 +29,7 @@ "name": "GimbalPitch", "shortDescription": "Gimbal pitch rotation.", "type": "double", - "units": "deg", + "units": "gimbal-degrees", "min": -90, "max": 0, "decimalPlaces": 0,