diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 4fa029eb41420b01b8f3889a9eccb59312c35520..b182b179510048889907a943e95c56b3222c1e44 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -56,7 +56,7 @@ const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTransla FactMetaData::FactMetaData(QObject* parent) : QObject(parent) , _type(valueTypeInt32) - , _decimalPlaces(defaultDecimalPlaces) + , _decimalPlaces(unknownDecimalPlaces) , _rawDefaultValue(0) , _defaultValueAvailable(false) , _group("*Default Group") @@ -75,7 +75,7 @@ FactMetaData::FactMetaData(QObject* parent) FactMetaData::FactMetaData(ValueType_t type, QObject* parent) : QObject(parent) , _type(type) - , _decimalPlaces(defaultDecimalPlaces) + , _decimalPlaces(unknownDecimalPlaces) , _rawDefaultValue(0) , _defaultValueAvailable(false) , _group("*Default Group") @@ -578,3 +578,33 @@ QString FactMetaData::appSettingsDistanceUnitsString(void) return QStringLiteral("m"); } } + +int FactMetaData::decimalPlaces(void) const +{ + int actualDecimalPlaces = defaultDecimalPlaces; + int incrementDecimalPlaces = unknownDecimalPlaces; + + // First determine decimal places from increment + double increment = this->increment(); + if (!qIsNaN(increment)) { + double integralPart; + + // Get the fractional part only + increment = fabs(modf(increment, &integralPart)); + if (increment == 0.0) { + // No fractional part, so no decimal places + incrementDecimalPlaces = 0; + } else { + incrementDecimalPlaces = -ceil(log10(increment)); + } + } + + // Correct decimal places is the larger of the two, increment or meta data value + if (incrementDecimalPlaces != unknownDecimalPlaces && _decimalPlaces == unknownDecimalPlaces) { + actualDecimalPlaces = incrementDecimalPlaces; + } else { + actualDecimalPlaces = qMax(_decimalPlaces, incrementDecimalPlaces); + } + + return actualDecimalPlaces; +} diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index e13484c9423178f3689739fa915a35ba312f760b..bfdcb3a924d0a4633116bfaeb1ef15481156d8c0 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -70,7 +70,7 @@ public: /// Returns the string for distance units which has configued by user static QString appSettingsDistanceUnitsString(void); - int decimalPlaces (void) const { return _decimalPlaces; } + int decimalPlaces (void) const; QVariant rawDefaultValue (void) const; QVariant cookedDefaultValue (void) const { return _rawTranslator(rawDefaultValue()); } bool defaultValueAvailable (void) const { return _defaultValueAvailable; } @@ -139,7 +139,8 @@ public: /// Same as convertAndValidateRaw except for cookedValue input bool convertAndValidateCooked(const QVariant& cookedValue, bool convertOnly, QVariant& typedValue, QString& errorString); - static const int defaultDecimalPlaces = 3; + static const int defaultDecimalPlaces = 3; ///< Default value for decimal places if not specified/known + static const int unknownDecimalPlaces = -1; ///< Number of decimal places to specify is not known static ValueType_t stringToType(const QString& typeString, bool& unknownType); static size_t typeToSize(ValueType_t type); diff --git a/src/MissionManager/MissionCommandList.cc b/src/MissionManager/MissionCommandList.cc index d6429ddabaad315f2d476093d623d0126f8989f2..3987f51983e141386944f0fed86038d0f933a57a 100644 --- a/src/MissionManager/MissionCommandList.cc +++ b/src/MissionManager/MissionCommandList.cc @@ -187,7 +187,7 @@ void MissionCommandList::_loadMavCmdInfoJson(const QString& jsonFilename) paramInfo->_label = paramObject.value(_labelJsonKey).toString(); paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0); - paramInfo->_decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::defaultDecimalPlaces); + paramInfo->_decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::unknownDecimalPlaces); paramInfo->_enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts); paramInfo->_param = i; paramInfo->_units = paramObject.value(_unitsJsonKey).toString(); diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 502bb9bed4557d5af50b4d0ec6aec2dcf6a9c411..0ab5a0ed89a32b0e495b36e4e1ec7a44f90054c8 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -322,16 +322,16 @@ QString SimpleMissionItem::abbreviation() const void SimpleMissionItem::_clearParamMetaData(void) { _param1MetaData.setRawUnits(""); - _param1MetaData.setDecimalPlaces(FactMetaData::defaultDecimalPlaces); + _param1MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); _param1MetaData.setBuiltInTranslator(); _param2MetaData.setRawUnits(""); - _param2MetaData.setDecimalPlaces(FactMetaData::defaultDecimalPlaces); + _param2MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); _param2MetaData.setBuiltInTranslator(); _param3MetaData.setRawUnits(""); - _param3MetaData.setDecimalPlaces(FactMetaData::defaultDecimalPlaces); + _param3MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); _param3MetaData.setBuiltInTranslator(); _param4MetaData.setRawUnits(""); - _param4MetaData.setDecimalPlaces(FactMetaData::defaultDecimalPlaces); + _param4MetaData.setDecimalPlaces(FactMetaData::unknownDecimalPlaces); _param4MetaData.setBuiltInTranslator(); }