diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 26093d6ea5761c669f549fa2b26f5f8ebae161ed..3704580ef314aa1a6df6fc96600f2ef3684f2fb6 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -351,7 +351,7 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString // When we are getting the very last component param index, reset the group maps to update for the // new params. By handling this here, we can pick up components which finish up later than the default // component param set. - _setupCategoryMap(); + _setupDefaultComponentCategoryMap(); } } @@ -529,20 +529,20 @@ QStringList ParameterManager::parameterNames(int componentId) return names; } -void ParameterManager::_setupCategoryMap(void) +void ParameterManager::_setupDefaultComponentCategoryMap(void) { // Must be able to handle being called multiple times - _categoryMap.clear(); + _defaultComponentCategoryMap.clear(); for (const QString &name: _mapParameterName2Variant[_vehicle->defaultComponentId()].keys()) { Fact* fact = _mapParameterName2Variant[_vehicle->defaultComponentId()][name].value(); - _categoryMap[fact->category()][fact->group()] += name; + _defaultComponentCategoryMap[fact->category()][fact->group()] += name; } } -const QMap >& ParameterManager::getCategoryMap(void) +const QMap >& ParameterManager::getDefaultComponentCategoryMap(void) { - return _categoryMap; + return _defaultComponentCategoryMap; } /// Requests missing index based parameters from the vehicle. @@ -1433,7 +1433,7 @@ void ParameterManager::_loadOfflineEditingParams(void) } _addMetaDataToDefaultComponent(); - _setupCategoryMap(); + _setupDefaultComponentCategoryMap(); _parametersReady = true; _initialLoadComplete = true; _debugCacheCRC.clear(); @@ -1567,3 +1567,8 @@ void ParameterManager::_setLoadProgress(double loadProgress) _loadProgress = loadProgress; emit loadProgressChanged(loadProgress); } + +QList ParameterManager::componentIds(void) +{ + return _paramCountMap.keys(); +} diff --git a/src/FactSystem/ParameterManager.h b/src/FactSystem/ParameterManager.h index 30dd672b92af317a7043affea7d4b6e5bd88f331..2a69908cd13018cec26f57bc9d287a8902cc729d 100644 --- a/src/FactSystem/ParameterManager.h +++ b/src/FactSystem/ParameterManager.h @@ -49,6 +49,8 @@ public: /// @return Location of parameter cache file static QString parameterCacheFile(int vehicleId, int componentId); + + QList componentIds(void); /// Re-request the full set of parameters from the autopilot void refreshAllParameters(uint8_t componentID = MAV_COMP_ID_ALL); @@ -75,7 +77,7 @@ public: /// @param name Parameter name Fact* getParameter(int componentId, const QString& name); - const QMap >& getCategoryMap(void); + const QMap >& getDefaultComponentCategoryMap(void); /// Returns error messages from loading QString readParametersFromStream(QTextStream& stream); @@ -128,7 +130,7 @@ protected: private: static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); int _actualComponentId(int componentId); - void _setupCategoryMap(void); + void _setupDefaultComponentCategoryMap(void); void _readParameterRaw(int componentId, const QString& paramName, int paramIndex); void _writeParameterRaw(int componentId, const QString& paramName, const QVariant& value); void _writeLocalParamCache(int vehicleId, int componentId); @@ -151,7 +153,7 @@ private: QMap _mapParameterName2Variant; // Category map of default component parameters - QMap > _categoryMap; + QMap > _defaultComponentCategoryMap; double _loadProgress; ///< Parameter load progess, [0.0,1.0] bool _parametersReady; ///< true: parameter load complete diff --git a/src/QmlControls/ParameterEditorController.cc b/src/QmlControls/ParameterEditorController.cc index f448c02dc6f5aab8e40c55201fd083e60f92ddb9..65d5930f4b69d3423197cb8366675de7d8d13aeb 100644 --- a/src/QmlControls/ParameterEditorController.cc +++ b/src/QmlControls/ParameterEditorController.cc @@ -7,10 +7,6 @@ * ****************************************************************************/ - -/// @file -/// @author Don Gagne - #include "ParameterEditorController.h" #include "QGCApplication.h" #include "ParameterManager.h" @@ -25,18 +21,26 @@ #include -/// @Brief Constructs a new ParameterEditorController Widget. This widget is used within the PX4VehicleConfig set of screens. ParameterEditorController::ParameterEditorController(void) - : _currentCategory("Standard") // FIXME: firmware specific - , _parameters(new QmlObjectListModel(this)) + : _currentCategory ("Standard") // FIXME: firmware specific + , _parameters (new QmlObjectListModel(this)) + , _parameterMgr (_vehicle->parameterManager()) + , _componentCategoryPrefix (tr("Component ")) { - const QMap >& categoryMap = _vehicle->parameterManager()->getCategoryMap(); + const QMap >& categoryMap = _parameterMgr->getDefaultComponentCategoryMap(); _categories = categoryMap.keys(); // Move default category to front _categories.removeOne(_currentCategory); _categories.prepend(_currentCategory); + // There is a category for each non default component + for (int compId: _parameterMgr->componentIds()) { + if (compId != _vehicle->defaultComponentId()) { + _categories.append(QString("%1%2").arg(_componentCategoryPrefix).arg(compId)); + } + } + // Be careful about no parameters if (categoryMap.contains(_currentCategory) && categoryMap[_currentCategory].size() != 0) { _currentGroup = categoryMap[_currentCategory].keys()[0]; @@ -54,27 +58,24 @@ ParameterEditorController::~ParameterEditorController() QStringList ParameterEditorController::getGroupsForCategory(const QString& category) { - const QMap >& categoryMap = _vehicle->parameterManager()->getCategoryMap(); - - return categoryMap[category].keys(); -} - -QStringList ParameterEditorController::getParametersForGroup(const QString& category, const QString& group) -{ - const QMap >& categoryMap = _vehicle->parameterManager()->getCategoryMap(); + if (category.startsWith(_componentCategoryPrefix)) { + return QStringList(tr("All")); + } else { + const QMap >& categoryMap = _parameterMgr->getDefaultComponentCategoryMap(); - return categoryMap[category][group]; + return categoryMap[category].keys(); + } } QStringList ParameterEditorController::searchParameters(const QString& searchText, bool searchInName, bool searchInDescriptions) { QStringList list; - for(const QString ¶mName: _vehicle->parameterManager()->parameterNames(_vehicle->defaultComponentId())) { + for(const QString ¶mName: _parameterMgr->parameterNames(_vehicle->defaultComponentId())) { if (searchText.isEmpty()) { list += paramName; } else { - Fact* fact = _vehicle->parameterManager()->getParameter(_vehicle->defaultComponentId(), paramName); + Fact* fact = _parameterMgr->getParameter(_vehicle->defaultComponentId(), paramName); if (searchInName && fact->name().contains(searchText, Qt::CaseInsensitive)) { list += paramName; @@ -111,7 +112,7 @@ void ParameterEditorController::saveToFile(const QString& filename) } QTextStream stream(&file); - _vehicle->parameterManager()->writeParametersToStream(stream); + _parameterMgr->writeParametersToStream(stream); file.close(); } } @@ -129,7 +130,7 @@ void ParameterEditorController::loadFromFile(const QString& filename) } QTextStream stream(&file); - errors = _vehicle->parameterManager()->readParametersFromStream(stream); + errors = _parameterMgr->readParametersFromStream(stream); file.close(); if (!errors.isEmpty()) { @@ -140,12 +141,12 @@ void ParameterEditorController::loadFromFile(const QString& filename) void ParameterEditorController::refresh(void) { - _vehicle->parameterManager()->refreshAllParameters(); + _parameterMgr->refreshAllParameters(); } void ParameterEditorController::resetAllToDefaults(void) { - _vehicle->parameterManager()->resetAllParametersToDefaults(); + _parameterMgr->resetAllParametersToDefaults(); refresh(); } @@ -167,13 +168,21 @@ void ParameterEditorController::_updateParameters(void) QStringList searchItems = _searchText.split(' ', QString::SkipEmptyParts); if (searchItems.isEmpty()) { - const QMap >& categoryMap = _vehicle->parameterManager()->getCategoryMap(); - for (const QString& parameter: categoryMap[_currentCategory][_currentGroup]) { - newParameterList.append(_vehicle->parameterManager()->getParameter(_vehicle->defaultComponentId(), parameter)); + if (_currentCategory.startsWith(_componentCategoryPrefix)) { + int compId = _currentCategory.right(_currentCategory.length() - _componentCategoryPrefix.length()).toInt(); + for (const QString& paramName: _parameterMgr->parameterNames(compId)) { + newParameterList.append(_parameterMgr->getParameter(compId, paramName)); + } + + } else { + const QMap >& categoryMap = _parameterMgr->getDefaultComponentCategoryMap(); + for (const QString& parameter: categoryMap[_currentCategory][_currentGroup]) { + newParameterList.append(_parameterMgr->getParameter(_vehicle->defaultComponentId(), parameter)); + } } } else { - for(const QString ¶meter: _vehicle->parameterManager()->parameterNames(_vehicle->defaultComponentId())) { - Fact* fact = _vehicle->parameterManager()->getParameter(_vehicle->defaultComponentId(), parameter); + for(const QString ¶meter: _parameterMgr->parameterNames(_vehicle->defaultComponentId())) { + Fact* fact = _parameterMgr->getParameter(_vehicle->defaultComponentId(), parameter); bool matched = true; // all of the search items must match in order for the parameter to be added to the list diff --git a/src/QmlControls/ParameterEditorController.h b/src/QmlControls/ParameterEditorController.h index 8b0f442fb2f6a28938eb720d3e13fe265ceb3d3d..a7dba4309f082d826d75c7a896e3d70d3b3fe524 100644 --- a/src/QmlControls/ParameterEditorController.h +++ b/src/QmlControls/ParameterEditorController.h @@ -21,6 +21,7 @@ #include "UASInterface.h" #include "FactPanelController.h" #include "QmlObjectListModel.h" +#include "ParameterManager.h" class ParameterEditorController : public FactPanelController { @@ -37,7 +38,6 @@ public: Q_PROPERTY(QStringList categories MEMBER _categories CONSTANT) Q_INVOKABLE QStringList getGroupsForCategory(const QString& category); - Q_INVOKABLE QStringList getParametersForGroup(const QString& category, const QString& group); Q_INVOKABLE QStringList searchParameters(const QString& searchText, bool searchInName=true, bool searchInDescriptions=true); Q_INVOKABLE void clearRCToParam(void); @@ -64,6 +64,8 @@ private: QString _currentCategory; QString _currentGroup; QmlObjectListModel* _parameters; + ParameterManager* _parameterMgr; + QString _componentCategoryPrefix; }; #endif diff --git a/src/comm/MockLink.cc b/src/comm/MockLink.cc index 53a381b81ebe55050b5bea5472e820a18408419c..f1c600c27964b4b746c472d7d9cdc3c0f2e947a7 100644 --- a/src/comm/MockLink.cc +++ b/src/comm/MockLink.cc @@ -257,6 +257,7 @@ void MockLink::_loadParams(void) QStringList paramData = line.split("\t"); Q_ASSERT(paramData.count() == 5); + int compId = paramData.at(1).toInt(); QString paramName = paramData.at(2); QString valStr = paramData.at(3); uint paramType = paramData.at(4).toUInt(); @@ -292,8 +293,8 @@ void MockLink::_loadParams(void) qCDebug(MockLinkVerboseLog) << "Loading param" << paramName << paramValue; - _mapParamName2Value[_vehicleComponentId][paramName] = paramValue; - _mapParamName2MavParamType[paramName] = static_cast(paramType); + _mapParamName2Value[compId][paramName] = paramValue; + _mapParamName2MavParamType[compId][paramName] = static_cast(paramType); } } @@ -515,11 +516,11 @@ void MockLink::_setParamFloatUnionIntoMap(int componentId, const QString& paramN Q_ASSERT(_mapParamName2Value.contains(componentId)); Q_ASSERT(_mapParamName2Value[componentId].contains(paramName)); - Q_ASSERT(_mapParamName2MavParamType.contains(paramName)); + Q_ASSERT(_mapParamName2MavParamType[componentId].contains(paramName)); valueUnion.param_float = paramFloat; - MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[paramName]; + MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[componentId][paramName]; QVariant paramVariant; @@ -569,9 +570,9 @@ float MockLink::_floatUnionForParam(int componentId, const QString& paramName) Q_ASSERT(_mapParamName2Value.contains(componentId)); Q_ASSERT(_mapParamName2Value[componentId].contains(paramName)); - Q_ASSERT(_mapParamName2MavParamType.contains(paramName)); + Q_ASSERT(_mapParamName2MavParamType[componentId].contains(paramName)); - MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[paramName]; + MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[componentId][paramName]; QVariant paramVar = _mapParamName2Value[componentId][paramName]; switch (paramType) { @@ -677,9 +678,9 @@ void MockLink::_paramRequestListWorker(void) mavlink_message_t responseMsg; Q_ASSERT(_mapParamName2Value[componentId].contains(paramName)); - Q_ASSERT(_mapParamName2MavParamType.contains(paramName)); + Q_ASSERT(_mapParamName2MavParamType[componentId].contains(paramName)); - MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[paramName]; + MAV_PARAM_TYPE paramType = _mapParamName2MavParamType[componentId][paramName]; Q_ASSERT(paramName.length() <= MAVLINK_MSG_ID_PARAM_VALUE_LEN); strncpy(paramId, paramName.toLocal8Bit().constData(), MAVLINK_MSG_ID_PARAM_VALUE_LEN); @@ -726,8 +727,9 @@ void MockLink::_handleParamSet(const mavlink_message_t& msg) qCDebug(MockLinkLog) << "_handleParamSet" << componentId << paramId << request.param_type; Q_ASSERT(_mapParamName2Value.contains(componentId)); + Q_ASSERT(_mapParamName2MavParamType.contains(componentId)); Q_ASSERT(_mapParamName2Value[componentId].contains(paramId)); - Q_ASSERT(request.param_type == _mapParamName2MavParamType[paramId]); + Q_ASSERT(request.param_type == _mapParamName2MavParamType[componentId][paramId]); // Save the new value _setParamFloatUnionIntoMap(componentId, paramId, request.param_value); @@ -795,7 +797,7 @@ void MockLink::_handleParamRequestRead(const mavlink_message_t& msg) } Q_ASSERT(_mapParamName2Value[componentId].contains(paramId)); - Q_ASSERT(_mapParamName2MavParamType.contains(paramId)); + Q_ASSERT(_mapParamName2MavParamType[componentId].contains(paramId)); if (_failureMode == MockConfiguration::FailMissingParamOnAllRequests && strcmp(paramId, _failParam) == 0) { qCDebug(MockLinkLog) << "Ignoring request read for " << _failParam; @@ -809,7 +811,7 @@ void MockLink::_handleParamRequestRead(const mavlink_message_t& msg) &responseMsg, // Outgoing message paramId, // Parameter name _floatUnionForParam(componentId, paramId), // Parameter value - _mapParamName2MavParamType[paramId], // Parameter type + _mapParamName2MavParamType[componentId][paramId], // Parameter type _mapParamName2Value[componentId].count(), // Total number of parameters _mapParamName2Value[componentId].keys().indexOf(paramId)); // Index of this parameter respondWithMavlinkMessage(responseMsg); diff --git a/src/comm/MockLink.h b/src/comm/MockLink.h index 4c6de83084bc4897bb9e2f688504714f60633dcb..3800e5fac7ebbae1ca6ee6ea0a7dd048d06ceb90 100644 --- a/src/comm/MockLink.h +++ b/src/comm/MockLink.h @@ -216,8 +216,8 @@ private: bool _inNSH; bool _mavlinkStarted; - QMap > _mapParamName2Value; - QMap _mapParamName2MavParamType; + QMap> _mapParamName2Value; + QMap> _mapParamName2MavParamType; uint8_t _mavBaseMode; uint32_t _mavCustomMode; diff --git a/src/comm/PX4MockLink.params b/src/comm/PX4MockLink.params index 39592dac7d3c806281cf57290f4eb8b9b75f4260..871d08b172c14c544b405fee3243c1543a5a17e4 100644 --- a/src/comm/PX4MockLink.params +++ b/src/comm/PX4MockLink.params @@ -737,3 +737,4 @@ 1 1 TRIG_MODE 4 6 1 1 VT_B_DEC_MSS 2.000000000000000000 9 1 1 VT_B_REV_DEL 0.000000000000000000 9 +1 2 VT_B_REV_DEL 0.000000000000000000 9