From eccfcb0a762e30b254054b0a745a5d3e9a106201 Mon Sep 17 00:00:00 2001 From: tstellanova Date: Sat, 24 Aug 2013 11:27:53 -0700 Subject: [PATCH] workaround for QVariants incoming as QString meta type --- src/uas/UASParameterDataModel.cc | 31 +++++++++++++++++++------------ src/uas/UASParameterDataModel.h | 5 +++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/uas/UASParameterDataModel.cc b/src/uas/UASParameterDataModel.cc index da1a6b987..4493758a3 100644 --- a/src/uas/UASParameterDataModel.cc +++ b/src/uas/UASParameterDataModel.cc @@ -80,11 +80,8 @@ void UASParameterDataModel::setPendingParam(int compId, const QString& key, con { //ensure we have a placeholder map for this component addComponent(compId); - QMap *pendParams = getPendingParamsForComponent(compId); - if (pendParams) { - pendParams->insert(key,value); - emit pendingParamUpdate(compId, key, value, true); - } + setParamWithTypeInMap(compId,key,value,pendingParameters); + emit pendingParamUpdate(compId, key, value, true); } void UASParameterDataModel::removePendingParam(int compId, const QString& key) @@ -105,11 +102,12 @@ void UASParameterDataModel::setOnboardParam(int compId, const QString &key, con { //ensure we have a placeholder map for this component addComponent(compId); + //TODO use setParamWithTypeInMap instead and verify QMap *params = getOnboardParamsForComponent(compId); params->insert(key,value); } -void UASParameterDataModel::setOnboardParamWithType(int compId, const QString& key, const QVariant &value) +void UASParameterDataModel::setParamWithTypeInMap(int compId, const QString& key, const QVariant &value, QMap* >& map) { switch ((int)value.type()) @@ -117,25 +115,35 @@ void UASParameterDataModel::setOnboardParamWithType(int compId, const QString& k case QVariant::Int: { QVariant fixedValue(value.toInt()); - onboardParameters.value(compId)->insert(key, fixedValue); + map.value(compId)->insert(key, fixedValue); } break; case QVariant::UInt: { QVariant fixedValue(value.toUInt()); - onboardParameters.value(compId)->insert(key, fixedValue); + map.value(compId)->insert(key, fixedValue); } break; case QMetaType::Float: { QVariant fixedValue(value.toFloat()); - onboardParameters.value(compId)->insert(key, fixedValue); + map.value(compId)->insert(key, fixedValue); } break; case QMetaType::QChar: { QVariant fixedValue(QChar((unsigned char)value.toUInt())); - onboardParameters.value(compId)->insert(key, fixedValue); + map.value(compId)->insert(key, fixedValue); + } + break; + case QMetaType::QString: + { + QString strVal = value.toString(); + float floatVal = strVal.toFloat(); + QVariant fixedValue( floatVal ); + //TODO track down WHY we're getting unexpected QString values here...this is a workaround + qDebug() << "Unexpected string QVariant:" << key << " val:" << value << "fixedVal:" << fixedValue; + map.value(compId)->insert(key, fixedValue); } break; default: @@ -165,8 +173,7 @@ void UASParameterDataModel::handleParamUpdate(int compId, const QString ¶mNa QVariant reqVal = pendingParams->value(paramName); if (reqVal == value) { //notify everyone that this item is being removed from the pending parameters list since it's now confirmed - emit pendingParamUpdate(compId, paramName, value, false); - pendingParams->remove(paramName); + removePendingParam(compId,paramName); } else { qDebug() << "Pending commit for " << paramName << " want: " << reqVal << " got: " << value; diff --git a/src/uas/UASParameterDataModel.h b/src/uas/UASParameterDataModel.h index c7c1dd057..84761a968 100644 --- a/src/uas/UASParameterDataModel.h +++ b/src/uas/UASParameterDataModel.h @@ -41,8 +41,6 @@ public: */ virtual QList getComponentForOnboardParam(const QString& parameter) const; - /** @brief Save the onboard parameter with a the type specified in the QVariant as fixed */ - virtual void setOnboardParamWithType(int componentId, const QString &key, const QVariant& value); /** @brief clears every parameter for every loaded component */ virtual void forgetAllOnboardParams(); @@ -91,6 +89,9 @@ protected: /** @brief set the confirmed value of a parameter in the onboard params list */ virtual void setOnboardParam(int componentId, const QString& key, const QVariant& value); + /** @brief Save the parameter with a the type specified in the QVariant as fixed */ + void setParamWithTypeInMap(int compId, const QString& key, const QVariant &value, QMap* >& map); + /** @brief Write a new pending parameter value that may be eventually sent to the UAS */ virtual void setPendingParam(int componentId, const QString &key, const QVariant& value); /** @brief remove a parameter from the pending list */ -- 2.22.0