From 19e2c07422784aacf45288d90ac61d4a291b5cca Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Thu, 13 Jun 2019 10:22:50 -0700 Subject: [PATCH] Fix crash caused by NULL vehicle --- src/FactSystem/ParameterManager.cc | 15 +++++++++------ src/FactSystem/ParameterManager.h | 28 +++++++++++++++------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 9d66ef7..b71dfed 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -1177,7 +1177,7 @@ void ParameterManager::_initialRequestTimeout(void) QString ParameterManager::parameterMetaDataFile(Vehicle* vehicle, MAV_AUTOPILOT firmwareType, int wantedMajorVersion, int& majorVersion, int& minorVersion) { bool cacheHit = false; - FirmwarePlugin* plugin = vehicle->firmwarePlugin(); + FirmwarePlugin* plugin = _anyVehicleTypeFirmwarePlugin(firmwareType); // Cached files are stored in settings location QSettings settings; @@ -1270,14 +1270,17 @@ QString ParameterManager::parameterMetaDataFile(Vehicle* vehicle, MAV_AUTOPILOT return metaDataFile; } -void ParameterManager::cacheMetaDataFile(const QString& metaDataFile, MAV_AUTOPILOT firmwareType) +FirmwarePlugin* ParameterManager::_anyVehicleTypeFirmwarePlugin(MAV_AUTOPILOT firmwareType) { - // In order to call FirmwarePlugin::getParameterMetaDataVersionInfo we need the firmware plugin. But at this point we do not have a vehicle associated - // with the call. Since the call to FirmwarePlugin::getParameterMetaDataVersionInfo is invariant to vehicle type we just need to use any one of the - // supported vehicle types to get the correct FirmwarePlugin. + // There are cases where we need a FirmwarePlugin but we don't have a vehicle. In those specified case the plugin for any of the supported vehicle types will do. MAV_TYPE anySupportedVehicleType = qgcApp()->toolbox()->firmwarePluginManager()->supportedVehicleTypes(firmwareType)[0]; - FirmwarePlugin* plugin = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(firmwareType, anySupportedVehicleType); + return qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(firmwareType, anySupportedVehicleType); +} + +void ParameterManager::cacheMetaDataFile(const QString& metaDataFile, MAV_AUTOPILOT firmwareType) +{ + FirmwarePlugin* plugin = _anyVehicleTypeFirmwarePlugin(firmwareType); int newMajorVersion, newMinorVersion; plugin->getParameterMetaDataVersionInfo(metaDataFile, newMajorVersion, newMinorVersion); diff --git a/src/FactSystem/ParameterManager.h b/src/FactSystem/ParameterManager.h index 0c025ed..9527b96 100644 --- a/src/FactSystem/ParameterManager.h +++ b/src/FactSystem/ParameterManager.h @@ -129,21 +129,23 @@ protected: void _initialRequestTimeout(void); private: - static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); - int _actualComponentId(int componentId); - 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); - void _tryCacheHashLoad(int vehicleId, int componentId, QVariant hash_value); - void _loadMetaData(void); - void _clearMetaData(void); - void _addMetaDataToDefaultComponent(void); + static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); + static FirmwarePlugin* _anyVehicleTypeFirmwarePlugin(MAV_AUTOPILOT firmwareType); + + int _actualComponentId(int componentId); + 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); + void _tryCacheHashLoad(int vehicleId, int componentId, QVariant hash_value); + void _loadMetaData(void); + void _clearMetaData(void); + void _addMetaDataToDefaultComponent(void); QString _remapParamNameToVersion(const QString& paramName); - void _loadOfflineEditingParams(void); + void _loadOfflineEditingParams(void); QString _logVehiclePrefix(int componentId); - void _setLoadProgress(double loadProgress); - bool _fillIndexBatchQueue(bool waitingParamTimeout); + void _setLoadProgress(double loadProgress); + bool _fillIndexBatchQueue(bool waitingParamTimeout); MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType); FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType);