Commit d11f7b61 authored by DonLakeFlyer's avatar DonLakeFlyer

Faster initial request param retry logic

parent ed23fc5c
...@@ -59,6 +59,7 @@ ParameterManager::ParameterManager(Vehicle* vehicle) ...@@ -59,6 +59,7 @@ ParameterManager::ParameterManager(Vehicle* vehicle)
, _prevWaitingWriteParamNameCount(0) , _prevWaitingWriteParamNameCount(0)
, _initialRequestRetryCount(0) , _initialRequestRetryCount(0)
, _disableAllRetries(false) , _disableAllRetries(false)
, _indexBatchQueueActive(false)
, _totalParamCount(0) , _totalParamCount(0)
{ {
_versionParam = vehicle->firmwarePlugin()->getVersionParam(); _versionParam = vehicle->firmwarePlugin()->getVersionParam();
...@@ -75,7 +76,7 @@ ParameterManager::ParameterManager(Vehicle* vehicle) ...@@ -75,7 +76,7 @@ ParameterManager::ParameterManager(Vehicle* vehicle)
connect(&_initialRequestTimeoutTimer, &QTimer::timeout, this, &ParameterManager::_initialRequestTimeout); connect(&_initialRequestTimeoutTimer, &QTimer::timeout, this, &ParameterManager::_initialRequestTimeout);
_waitingParamTimeoutTimer.setSingleShot(true); _waitingParamTimeoutTimer.setSingleShot(true);
_waitingParamTimeoutTimer.setInterval(30000); _waitingParamTimeoutTimer.setInterval(3000);
connect(&_waitingParamTimeoutTimer, &QTimer::timeout, this, &ParameterManager::_waitingParamTimeout); connect(&_waitingParamTimeoutTimer, &QTimer::timeout, this, &ParameterManager::_waitingParamTimeout);
connect(_vehicle->uas(), &UASInterface::parameterUpdate, this, &ParameterManager::_parameterUpdate); connect(_vehicle->uas(), &UASInterface::parameterUpdate, this, &ParameterManager::_parameterUpdate);
...@@ -117,11 +118,13 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString ...@@ -117,11 +118,13 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString
_initialRequestTimeoutTimer.stop(); _initialRequestTimeoutTimer.stop();
#if 0 #if 0
// Handy for testing retry logic if (!_initialLoadComplete && !_indexBatchQueueActive) {
static int counter = 0; // Handy for testing retry logic
if (counter++ & 0x8) { static int counter = 0;
qCDebug(ParameterManagerLog) << "Artificial discard" << counter; if (counter++ & 0x8) {
return; qCDebug(ParameterManagerLog) << "Artificial discard" << counter;
return;
}
} }
#endif #endif
...@@ -179,7 +182,11 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString ...@@ -179,7 +182,11 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString
} }
// Remove this parameter from the waiting lists // Remove this parameter from the waiting lists
_waitingReadParamIndexMap[componentId].remove(parameterId); if (_waitingReadParamIndexMap[componentId].contains(parameterId)) {
_waitingReadParamIndexMap[componentId].remove(parameterId);
_indexBatchQueue.removeOne(parameterId);
_fillIndexBatchQueue(false /* waitingParamTimeout */);
}
_waitingReadParamNameMap[componentId].remove(parameterName); _waitingReadParamNameMap[componentId].remove(parameterName);
_waitingWriteParamNameMap[componentId].remove(parameterName); _waitingWriteParamNameMap[componentId].remove(parameterName);
if (_waitingReadParamIndexMap[componentId].count()) { if (_waitingReadParamIndexMap[componentId].count()) {
...@@ -507,25 +514,39 @@ const QMap<int, QMap<QString, QStringList> >& ParameterManager::getGroupMap(void ...@@ -507,25 +514,39 @@ const QMap<int, QMap<QString, QStringList> >& ParameterManager::getGroupMap(void
return _mapGroup2ParameterName; return _mapGroup2ParameterName;
} }
void ParameterManager::_waitingParamTimeout(void) /// Requests missing index based parameters from the vehicle.
/// @param waitingParamTimeout: true: being called due to timeout, false: being called to re-fill the batch queue
/// return true: Parameters were requested, false: No more requests needed
bool ParameterManager::_fillIndexBatchQueue(bool waitingParamTimeout)
{ {
bool paramsRequested = false; if (!_indexBatchQueueActive) {
const int maxBatchSize = 10; return false;
int batchCount = 0; }
qCDebug(ParameterManagerLog) << _logVehiclePrefix() << "_waitingParamTimeout"; const int maxBatchSize = 10;
// First check for any missing parameters from the initial index based load if (waitingParamTimeout) {
// We timed out, clear the queue and try again
qCDebug(ParameterManagerLog) << "Refilling index based batch queue due to timeout";
_indexBatchQueue.clear();
} else {
qCDebug(ParameterManagerLog) << "Refilling index based batch queue due to received parameter";
}
batchCount = 0;
foreach(int componentId, _waitingReadParamIndexMap.keys()) { foreach(int componentId, _waitingReadParamIndexMap.keys()) {
if (_waitingReadParamIndexMap[componentId].count()) { if (_waitingReadParamIndexMap[componentId].count()) {
qCDebug(ParameterManagerLog) << _logVehiclePrefix() << "_waitingReadParamIndexMap" << _waitingReadParamIndexMap[componentId]; qCDebug(ParameterManagerLog) << _logVehiclePrefix() << "_waitingReadParamIndexMap count" << _waitingReadParamIndexMap[componentId].count();
qCDebug(ParameterManagerVerbose1Log) << _logVehiclePrefix() << "_waitingReadParamIndexMap" << _waitingReadParamIndexMap[componentId];
} }
foreach(int paramIndex, _waitingReadParamIndexMap[componentId].keys()) { foreach(int paramIndex, _waitingReadParamIndexMap[componentId].keys()) {
if (++batchCount > maxBatchSize) { if (_indexBatchQueue.contains(paramIndex)) {
goto Out; // Don't add more than once
continue;
}
if (_indexBatchQueue.count() > maxBatchSize) {
break;
} }
_waitingReadParamIndexMap[componentId][paramIndex]++; // Bump retry count _waitingReadParamIndexMap[componentId][paramIndex]++; // Bump retry count
...@@ -536,13 +557,30 @@ void ParameterManager::_waitingParamTimeout(void) ...@@ -536,13 +557,30 @@ void ParameterManager::_waitingParamTimeout(void)
_waitingReadParamIndexMap[componentId].remove(paramIndex); _waitingReadParamIndexMap[componentId].remove(paramIndex);
} else { } else {
// Retry again // Retry again
paramsRequested = true; _indexBatchQueue.append(paramIndex);
_readParameterRaw(componentId, "", paramIndex); _readParameterRaw(componentId, "", paramIndex);
qCDebug(ParameterManagerLog) << _logVehiclePrefix(componentId) << "Read re-request for (paramIndex:" << paramIndex << "retryCount:" << _waitingReadParamIndexMap[componentId][paramIndex] << ")"; qCDebug(ParameterManagerLog) << _logVehiclePrefix(componentId) << "Read re-request for (paramIndex:" << paramIndex << "retryCount:" << _waitingReadParamIndexMap[componentId][paramIndex] << ")";
} }
} }
} }
return _indexBatchQueue.count() != 0;
}
void ParameterManager::_waitingParamTimeout(void)
{
bool paramsRequested = false;
const int maxBatchSize = 10;
int batchCount = 0;
qCDebug(ParameterManagerLog) << _logVehiclePrefix() << "_waitingParamTimeout";
// Now that we have timed out for possibly the first time we can activate the index batch queue
_indexBatchQueueActive = true;
// First check for any missing parameters from the initial index based load
paramsRequested = _fillIndexBatchQueue(true /* waitingParamTimeout */);
if (!paramsRequested && !_waitingForDefaultComponent && !_mapParameterName2Variant.contains(_vehicle->defaultComponentId())) { if (!paramsRequested && !_waitingForDefaultComponent && !_mapParameterName2Variant.contains(_vehicle->defaultComponentId())) {
// Initial load is complete but we still don't have any default component params. Wait one more cycle to see if the // Initial load is complete but we still don't have any default component params. Wait one more cycle to see if the
// any show up. // any show up.
......
...@@ -147,6 +147,7 @@ private: ...@@ -147,6 +147,7 @@ private:
void _loadOfflineEditingParams(void); void _loadOfflineEditingParams(void);
QString _logVehiclePrefix(int componentId = -1); QString _logVehiclePrefix(int componentId = -1);
void _setLoadProgress(double loadProgress); void _setLoadProgress(double loadProgress);
bool _fillIndexBatchQueue(bool waitingParamTimeout);
MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType); MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType);
FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType); FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType);
...@@ -178,13 +179,15 @@ private: ...@@ -178,13 +179,15 @@ private:
int _prevWaitingReadParamNameCount; int _prevWaitingReadParamNameCount;
int _prevWaitingWriteParamNameCount; int _prevWaitingWriteParamNameCount;
static const int _maxInitialRequestListRetry = 4; ///< Maximum retries for request list static const int _maxInitialRequestListRetry = 4; ///< Maximum retries for request list
int _initialRequestRetryCount; ///< Current retry count for request list int _initialRequestRetryCount; ///< Current retry count for request list
static const int _maxInitialLoadRetrySingleParam = 5; ///< Maximum retries for initial index based load of a single param static const int _maxInitialLoadRetrySingleParam = 5; ///< Maximum retries for initial index based load of a single param
static const int _maxReadWriteRetry = 5; ///< Maximum retries read/write static const int _maxReadWriteRetry = 5; ///< Maximum retries read/write
bool _disableAllRetries; ///< true: Don't retry any requests (used for testing) bool _disableAllRetries; ///< true: Don't retry any requests (used for testing)
bool _indexBatchQueueActive; ///< true: we are actively batching re-requests for missing index base params, false: index based re-request has not yet started
QList<int> _indexBatchQueue; ///< The current queue of index re-requests
QMap<int, int> _paramCountMap; ///< Key: Component id, Value: count of parameters in this component QMap<int, int> _paramCountMap; ///< Key: Component id, Value: count of parameters in this component
QMap<int, QMap<int, int> > _waitingReadParamIndexMap; ///< Key: Component id, Value: Map { Key: parameter index still waiting for, Value: retry count } QMap<int, QMap<int, int> > _waitingReadParamIndexMap; ///< Key: Component id, Value: Map { Key: parameter index still waiting for, Value: retry count }
QMap<int, QMap<QString, int> > _waitingReadParamNameMap; ///< Key: Component id, Value: Map { Key: parameter name still waiting for, Value: retry count } QMap<int, QMap<QString, int> > _waitingReadParamNameMap; ///< Key: Component id, Value: Map { Key: parameter name still waiting for, Value: retry count }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment