diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 775c4e92376c852261b0714455b6996e72975552..a2bd96c6a3a3156e7bcf0666f979f114186449af 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -22,12 +22,9 @@ #include #include -/* types for local parameter cache */ -typedef QPair ParamTypeVal; -typedef QMap CacheMapName2ParamTypeVal; - -QGC_LOGGING_CATEGORY(ParameterManagerVerbose1Log, "ParameterManagerVerbose1Log") -QGC_LOGGING_CATEGORY(ParameterManagerVerbose2Log, "ParameterManagerVerbose2Log") +QGC_LOGGING_CATEGORY(ParameterManagerVerbose1Log, "ParameterManagerVerbose1Log") +QGC_LOGGING_CATEGORY(ParameterManagerVerbose2Log, "ParameterManagerVerbose2Log") +QGC_LOGGING_CATEGORY(ParameterManagerDebugCacheFailureLog, "ParameterManagerDebugCacheFailureLog") // Turn on to debug parameter cache crc misses Fact ParameterManager::_defaultFact; @@ -141,6 +138,24 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString return; } + // Used to debug cache crc misses (turn on ParameterManagerDebugCacheFailureLog) + if (!_initialLoadComplete && !_logReplay && _debugCacheCRC.contains(componentId) && _debugCacheCRC[componentId]) { + if (_debugCacheMap[componentId].contains(parameterName)) { + const ParamTypeVal& cacheParamTypeVal = _debugCacheMap[componentId][parameterName]; + size_t dataSize = FactMetaData::typeToSize(static_cast(cacheParamTypeVal.first)); + const void *cacheData = cacheParamTypeVal.second.constData(); + + const void *vehicleData = value.constData(); + + if (memcmp(cacheData, vehicleData, dataSize)) { + qDebug() << "Cache/Vehicle values differ for name:cache:actual" << parameterName << value << cacheParamTypeVal.second; + } + _debugCacheParamSeen[componentId][parameterName] = true; + } else { + qDebug() << "Parameter missing from cache" << parameterName; + } + } + _initialRequestTimeoutTimer.stop(); _waitingParamTimeoutTimer.stop(); @@ -854,6 +869,14 @@ void ParameterManager::_tryCacheHashLoad(int vehicleId, int componentId, QVarian _parameterSetMajorVersion = -1; _clearMetaData(); qCInfo(ParameterManagerLog) << "Parameters cache match failed" << qPrintable(QFileInfo(cacheFile).absoluteFilePath()); + if (ParameterManagerDebugCacheFailureLog().isDebugEnabled()) { + _debugCacheCRC[componentId] = true; + _debugCacheMap[componentId] = cacheMap; + foreach (const QString& name, cacheMap.keys()) { + _debugCacheParamSeen[componentId][name] = false; + } + qgcApp()->showMessage(tr("Parameter cache CRC match failed")); + } } } @@ -1054,6 +1077,18 @@ void ParameterManager::_checkInitialLoadComplete(void) // We aren't waiting for any more initial parameter updates, initial parameter loading is complete _initialLoadComplete = true; + // Parameter cache crc failure debugging + foreach (int componentId, _debugCacheParamSeen.keys()) { + if (!_logReplay && _debugCacheCRC.contains(componentId) && _debugCacheCRC[componentId]) { + foreach (const QString& paramName, _debugCacheParamSeen[componentId].keys()) { + if (!_debugCacheParamSeen[componentId][paramName]) { + qDebug() << "Parameter in cache but not on vehicle componentId:Name" << componentId << paramName; + } + } + } + } + _debugCacheCRC.clear(); + qCDebug(ParameterManagerLog) << _logVehiclePrefix() << "Initial load complete"; // Check for index based load failures @@ -1367,6 +1402,7 @@ void ParameterManager::_loadOfflineEditingParams(void) _setupCategoryMap(); _parametersReady = true; _initialLoadComplete = true; + _debugCacheCRC.clear(); } void ParameterManager::saveToJson(int componentId, const QStringList& paramsToSave, QJsonObject& saveObject) diff --git a/src/FactSystem/ParameterManager.h b/src/FactSystem/ParameterManager.h index a4f06d76e467d8a3009fcef18e1e3c0a4ccbd342..33d14ff8a3aa64a8fcd868f5a327bcfd44089227 100644 --- a/src/FactSystem/ParameterManager.h +++ b/src/FactSystem/ParameterManager.h @@ -30,6 +30,7 @@ Q_DECLARE_LOGGING_CATEGORY(ParameterManagerVerbose1Log) Q_DECLARE_LOGGING_CATEGORY(ParameterManagerVerbose2Log) +Q_DECLARE_LOGGING_CATEGORY(ParameterManagerDebugCacheFailureLog) /// Connects to Parameter Manager to load/update Facts class ParameterManager : public QObject @@ -174,6 +175,13 @@ private: int _parameterSetMajorVersion; ///< Version for parameter set, -1 if not known QObject* _parameterMetaData; ///< Opaque data from FirmwarePlugin::loadParameterMetaDataCall + typedef QPair ParamTypeVal; + typedef QMap CacheMapName2ParamTypeVal; + + QMap _debugCacheCRC; ///< true: debug cache crc failure + QMap _debugCacheMap; + QMap> _debugCacheParamSeen; + // Wait counts from previous parameter update cycle int _prevWaitingReadParamIndexCount; int _prevWaitingReadParamNameCount;