diff --git a/src/FactSystem/Fact.cc b/src/FactSystem/Fact.cc index 116992a2cf8cec730e6889cda67c022eac220551..645904a153b42e2dc0c9aa746e72c1894ed01bb1 100644 --- a/src/FactSystem/Fact.cc +++ b/src/FactSystem/Fact.cc @@ -482,3 +482,13 @@ QString Fact::validate(const QString& cookedValue, bool convertOnly) return QString("Internal error: Meta data pointer missing"); } } + +bool Fact::rebootRequired(void) const +{ + if (_metaData) { + return _metaData->rebootRequired(); + } else { + qWarning() << "Meta data pointer missing"; + return false; + } +} diff --git a/src/FactSystem/Fact.h b/src/FactSystem/Fact.h index 0c68756ee71a00881eba0a53aa1c39dada3cdc28..8e3eaa5190f9af1384d1218e40ddc4aaf765f02b 100644 --- a/src/FactSystem/Fact.h +++ b/src/FactSystem/Fact.h @@ -66,6 +66,7 @@ public: Q_PROPERTY(QString minString READ cookedMinString CONSTANT) Q_PROPERTY(bool minIsDefaultForType READ minIsDefaultForType CONSTANT) Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(bool rebootRequired READ rebootRequired CONSTANT) Q_PROPERTY(QString shortDescription READ shortDescription CONSTANT) Q_PROPERTY(FactMetaData::ValueType_t type READ type CONSTANT) Q_PROPERTY(QString units READ cookedUnits CONSTANT) @@ -109,6 +110,7 @@ public: QString rawValueString (void) const; QString cookedValueString (void) const; bool valueEqualsDefault (void) const; + bool rebootRequired (void) const; void setRawValue (const QVariant& value); void setCookedValue (const QVariant& value); diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 26160336e8e2fc007bd80c4bbf083f61cebe9b00..18ab974b1bc5ed45df3eac93f18ab04397806947 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -51,6 +51,7 @@ FactMetaData::FactMetaData(QObject* parent) , _minIsDefaultForType(true) , _rawTranslator(_defaultTranslator) , _cookedTranslator(_defaultTranslator) + , _rebootRequired(false) { } @@ -68,6 +69,7 @@ FactMetaData::FactMetaData(ValueType_t type, QObject* parent) , _minIsDefaultForType(true) , _rawTranslator(_defaultTranslator) , _cookedTranslator(_defaultTranslator) + , _rebootRequired(false) { } @@ -100,6 +102,7 @@ const FactMetaData& FactMetaData::operator=(const FactMetaData& other) _cookedUnits = other._cookedUnits; _rawTranslator = other._rawTranslator; _cookedTranslator = other._cookedTranslator; + _rebootRequired = other._rebootRequired; return *this; } diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 8791814ac7f70b2dc3ba8d431074e68611e95739..dafb5b75d701da33258f8cea8090e3af9f7a4f27 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -81,6 +81,7 @@ public: ValueType_t type (void) const { return _type; } QString rawUnits (void) const { return _rawUnits; } QString cookedUnits (void) const { return _cookedUnits; } + bool rebootRequired (void) const { return _rebootRequired; } Translator rawTranslator (void) const { return _rawTranslator; } Translator cookedTranslator (void) const { return _cookedTranslator; } @@ -102,6 +103,7 @@ public: void setName (const QString& name) { _name = name; } void setShortDescription(const QString& shortDescription) { _shortDescription = shortDescription; } void setRawUnits (const QString& rawUnits); + void setRebootRequired (bool rebootRequired) { _rebootRequired = rebootRequired; } void setTranslators(Translator rawTranslator, Translator cookedTranslator); @@ -150,6 +152,7 @@ private: QString _cookedUnits; Translator _rawTranslator; Translator _cookedTranslator; + bool _rebootRequired; struct BuiltInTranslation_s { const char* rawUnits; diff --git a/src/FactSystem/ParameterLoader.cc b/src/FactSystem/ParameterLoader.cc index dab06c20994bd835674a7b8b9ece430f679a347a..f48b43b3aa7ff71d567f7088f693eb1c4c3fce0a 100644 --- a/src/FactSystem/ParameterLoader.cc +++ b/src/FactSystem/ParameterLoader.cc @@ -295,6 +295,10 @@ void ParameterLoader::_valueUpdated(const QVariant& value) _writeParameterRaw(componentId, fact->name(), value); qCDebug(ParameterLoaderLog) << "Set parameter (componentId:" << componentId << "name:" << name << value << ")"; + + if (fact->rebootRequired()) { + qgcApp()->showMessage(QStringLiteral("Change of parameter %1 requires a Vehicle reboot to take affect").arg(name)); + } } void ParameterLoader::refreshAllParameters(void) diff --git a/src/FirmwarePlugin/APM/APMParameterMetaData.cc b/src/FirmwarePlugin/APM/APMParameterMetaData.cc index 6397f11041c817afbd5b19a18c7bc3efdc84afa2..be7fc932cd3900a1ebb5f71f675ab719c928b45d 100644 --- a/src/FirmwarePlugin/APM/APMParameterMetaData.cc +++ b/src/FirmwarePlugin/APM/APMParameterMetaData.cc @@ -342,6 +342,7 @@ bool APMParameterMetaData::parseParameterAttributes(QXmlStreamReader& xml, APMFa // skip empty elements. Somehow I am getting lot of these. Dont know what to do with them. } else if (elementName == "field") { QString attributeName = xml.attributes().value("name").toString(); + if ( attributeName == "Range") { QString range = xml.readElementText().trimmed(); QStringList rangeList = range.split(' '); @@ -402,6 +403,11 @@ bool APMParameterMetaData::parseParameterAttributes(QXmlStreamReader& xml, APMFa if (parseError) { rawMetaData->bitmask.clear(); } + } else if (attributeName == "RebootRequired") { + QString strValue = xml.readElementText().trimmed(); + if (strValue.compare("true", Qt::CaseInsensitive) == 0) { + rawMetaData->rebootRequired = true; + } } } else if (elementName == "values") { // doing nothing individual value will follow anyway. May be used for sanity checking. @@ -447,6 +453,7 @@ void APMParameterMetaData::addMetaDataToFact(Fact* fact, MAV_TYPE vehicleType) metaData->setName(rawMetaData->name); metaData->setGroup(rawMetaData->group); + metaData->setRebootRequired(rawMetaData->rebootRequired); if (!rawMetaData->shortDescription.isEmpty()) { metaData->setShortDescription(rawMetaData->shortDescription); diff --git a/src/FirmwarePlugin/APM/APMParameterMetaData.h b/src/FirmwarePlugin/APM/APMParameterMetaData.h index e346d8dfb249132f476e17729d89ec240c7edab9..66a4749bc3b8f59f20be2295a1c8e13468823fb8 100644 --- a/src/FirmwarePlugin/APM/APMParameterMetaData.h +++ b/src/FirmwarePlugin/APM/APMParameterMetaData.h @@ -37,14 +37,19 @@ class APMFactMetaDataRaw { public: - QString name; - QString group; - QString shortDescription; - QString longDescription; - QString min; - QString max; - QString incrementSize; - QString units; + APMFactMetaDataRaw(void) + : rebootRequired(false) + { } + + QString name; + QString group; + QString shortDescription; + QString longDescription; + QString min; + QString max; + QString incrementSize; + QString units; + bool rebootRequired; QList > values; QList > bitmask; }; diff --git a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc index d8357f34a10e9a8dab8d1c9145ea36082a913109..052c78e10938673dd72c49f28ef03fb182ac37ab 100644 --- a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc +++ b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc @@ -312,6 +312,14 @@ void PX4ParameterMetaData::_loadParameterFactMetaData(void) qCWarning(PX4ParameterMetaDataLog) << "Invalid decimals value, name:" << metaData->name() << " type:" << metaData->type() << " decimals:" << text << " error: invalid number"; } + } else if (elementName == "reboot_required") { + Q_ASSERT(metaData); + QString text = xml.readElementText(); + qCDebug(PX4ParameterMetaDataLog) << "RebootRequired:" << text; + if (text.compare("true", Qt::CaseInsensitive) == 0) { + metaData->setRebootRequired(true); + } + } else { qDebug() << "Unknown element in XML: " << elementName; }