diff --git a/src/uas/QGCUASParamManager.cc b/src/uas/QGCUASParamManager.cc index 6796ef0b49a5a746b6de55becce1d45a08603364..fcc78a6cb669391de11a8245515ac321b4a6f16c 100644 --- a/src/uas/QGCUASParamManager.cc +++ b/src/uas/QGCUASParamManager.cc @@ -26,7 +26,7 @@ QGCUASParamManager::QGCUASParamManager(UASInterface* uas, QWidget *parent) : bool QGCUASParamManager::getParameterValue(int component, const QString& parameter, QVariant& value) const { - return paramDataModel->getOnboardParameterValue(component,parameter,value); + return paramDataModel->getOnboardParamValue(component,parameter,value); } diff --git a/src/uas/UASParameterCommsMgr.cc b/src/uas/UASParameterCommsMgr.cc index c2655dc046184e6486e34b3b2acf4c7d327fe64f..47ec654b3fefcc7f16ecf8960bfdfd107d7b14b9 100644 --- a/src/uas/UASParameterCommsMgr.cc +++ b/src/uas/UASParameterCommsMgr.cc @@ -168,7 +168,6 @@ void UASParameterCommsMgr::resendReadWriteRequests() // Re-request at maximum retransmissionBurstRequestSize parameters at once // to prevent link flooding' int requestedReadCount = 0; - compIds = transmissionMissingPackets.keys(); foreach (compId, compIds) { // Request n parameters from this component (at maximum) @@ -214,6 +213,10 @@ void UASParameterCommsMgr::resendReadWriteRequests() transmissionActive = false; } } + else { + //restart the timer now that we've sent + setRetransmissionGuardEnabled(true); + } } void UASParameterCommsMgr::resetAfterListReceive() @@ -354,7 +357,7 @@ void UASParameterCommsMgr::setParameter(int component, QString parameterName, QV } QVariant onboardVal; - paramDataModel->getOnboardParameterValue(component,parameterName,onboardVal); + paramDataModel->getOnboardParamValue(component,parameterName,onboardVal); if (onboardVal == value) { setParameterStatusMsg(tr("REJ. %1 already %2").arg(parameterName).arg(dblValue), ParamCommsStatusLevel_Warning @@ -408,7 +411,7 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para Q_UNUSED(uas); //this object is assigned to one UAS only //notify the data model that we have an updated param - paramDataModel->handleParameterUpdate(compId,paramName,value); + paramDataModel->handleParamUpdate(compId,paramName,value); // Missing packets list has to be instantiated for all components if (!transmissionMissingPackets.contains(compId)) { @@ -554,7 +557,7 @@ void UASParameterCommsMgr::sendPendingParameters() { // Iterate through all components, through all pending parameters and send them to UAS int parametersSent = 0; - QMap*>* changedValues = paramDataModel->getPendingParameters(); + QMap*>* changedValues = paramDataModel->getAllPendingParams(); QMap*>::iterator i; for (i = changedValues->begin(); i != changedValues->end(); ++i) { // Iterate through the parameters of the component diff --git a/src/uas/UASParameterDataModel.cc b/src/uas/UASParameterDataModel.cc index a4f6976ee668be04d2cc60e649dc010c01a5d5a0..c942b4437b29bb61b602f600164cf1231ef6ba91 100644 --- a/src/uas/UASParameterDataModel.cc +++ b/src/uas/UASParameterDataModel.cc @@ -18,53 +18,58 @@ UASParameterDataModel::UASParameterDataModel(QObject *parent) : -bool UASParameterDataModel::checkParameterChanged(int compId, const QString& key, const QVariant& value) + + +bool UASParameterDataModel::updatePendingParamWithValue(int compId, QString& key, QVariant& value) { - bool changed = true; + bool pending = true; //ensure we have this component in our onboard and pending lists already addComponent(compId); - QMap* existParams = getOnbardParametersForComponent(compId); + QMap* existParams = getOnboardParamsForComponent(compId); if (existParams->contains(key)) { QVariant existValue = existParams->value(key); if (existValue == value) { - changed = false; + pending = false; } } - return changed; -} + if (pending) { + setPendingParam(compId,key,value); + } + else { + removePendingParam(compId,key); + } -bool UASParameterDataModel::addPendingIfParameterChanged(int componentId, QString& key, QVariant &value) + return pending; +} +void UASParameterDataModel::removePendingParam(int compId, QString& key) { - bool changed = checkParameterChanged(componentId,key,value); - - if (changed ) { - setPendingParameter(componentId,key,value); + QMap *params = getPendingParamsForComponent(compId); + if (params) { + params->remove(key); } - - return changed; } -void UASParameterDataModel::setPendingParameter(int componentId, QString& key, const QVariant &value) +void UASParameterDataModel::setPendingParam(int compId, QString& key, const QVariant &value) { //ensure we have a placeholder map for this component - addComponent(componentId); - QMap *params = getPendingParametersForComponent(componentId); + addComponent(compId); + QMap *params = getPendingParamsForComponent(compId); params->insert(key,value); } -void UASParameterDataModel::setOnboardParameter(int componentId, QString& key, const QVariant& value) +void UASParameterDataModel::setOnboardParam(int compId, QString& key, const QVariant& value) { //ensure we have a placeholder map for this component - addComponent(componentId); - QMap *params = getOnbardParametersForComponent(componentId); + addComponent(compId); + QMap *params = getOnboardParamsForComponent(compId); params->insert(key,value); } -void UASParameterDataModel::setOnboardParameterWithType(int componentId, QString& key, QVariant& value) +void UASParameterDataModel::setOnboardParamWithType(int compId, QString& key, QVariant& value) { // switch ((int)onboardParameters.value(componentId)->value(key).type()) @@ -73,25 +78,25 @@ void UASParameterDataModel::setOnboardParameterWithType(int componentId, QString case QVariant::Int: { QVariant fixedValue(value.toInt()); - onboardParameters.value(componentId)->insert(key, fixedValue); + onboardParameters.value(compId)->insert(key, fixedValue); } break; case QVariant::UInt: { QVariant fixedValue(value.toUInt()); - onboardParameters.value(componentId)->insert(key, fixedValue); + onboardParameters.value(compId)->insert(key, fixedValue); } break; case QMetaType::Float: { QVariant fixedValue(value.toFloat()); - onboardParameters.value(componentId)->insert(key, fixedValue); + onboardParameters.value(compId)->insert(key, fixedValue); } break; case QMetaType::QChar: { QVariant fixedValue(QChar((unsigned char)value.toUInt())); - onboardParameters.value(componentId)->insert(key, fixedValue); + onboardParameters.value(compId)->insert(key, fixedValue); } break; default: @@ -111,7 +116,7 @@ void UASParameterDataModel::addComponent(int compId) } -void UASParameterDataModel::handleParameterUpdate(int compId, QString& key, QVariant& value) +void UASParameterDataModel::handleParamUpdate(int compId, QString& key, QVariant& value) { //verify that the value requested by the user matches the set value //if it doesn't match, leave the pending parameter in the pending list! @@ -128,13 +133,13 @@ void UASParameterDataModel::handleParameterUpdate(int compId, QString& key, QVar } } - setOnboardParameter(compId,key,value); + setOnboardParam(compId,key,value); emit parameterUpdated(compId,key,value); } -bool UASParameterDataModel::getOnboardParameterValue(int componentId, const QString& key, QVariant& value) const +bool UASParameterDataModel::getOnboardParamValue(int componentId, const QString& key, QVariant& value) const { if (onboardParameters.contains(componentId)) { @@ -147,14 +152,13 @@ bool UASParameterDataModel::getOnboardParameterValue(int componentId, const QStr return false; } -void UASParameterDataModel::forgetAllOnboardParameters() +void UASParameterDataModel::forgetAllOnboardParams() { onboardParameters.clear(); } -void UASParameterDataModel::readUpdateParametersFromStream( QTextStream& stream) +void UASParameterDataModel::readUpdateParamsFromStream( QTextStream& stream) { - bool userWarned = false; while (!stream.atEnd()) { @@ -165,7 +169,7 @@ void UASParameterDataModel::readUpdateParametersFromStream( QTextStream& stream) if (wpParams.size() == 5) { // Only load parameters for right mav if (!userWarned && (uasId != lineMavId)) { - //TODO warn the user somehow + //TODO warn the user somehow ?? QString msg = tr("The parameters in the stream have been saved from system %1, but the currently selected system has the ID %2.").arg(lineMavId).arg(uasId); // MainWindow::instance()->showCriticalMessage( // tr("Parameter loading warning"), @@ -199,26 +203,17 @@ void UASParameterDataModel::readUpdateParametersFromStream( QTextStream& stream) switch (paramType) { case MAV_PARAM_TYPE_REAL32: - //receivedParameterUpdate(wpParams.at(0).toInt(), componentId, key, valStr.toFloat()); - setPendingParameter(componentId,key,QVariant(valStr.toFloat())); - //setParameter(componentId, key, valStr.toFloat()); + setPendingParam(componentId,key,QVariant(valStr.toFloat())); break; case MAV_PARAM_TYPE_UINT32: - //receivedParameterUpdate(wpParams.at(0).toInt(), componentId, key, valStr.toUInt()); - setPendingParameter(componentId,key, QVariant(valStr.toUInt())); - //setParameter(componentId, key, QVariant(valStr.toUInt())); + setPendingParam(componentId,key, QVariant(valStr.toUInt())); break; case MAV_PARAM_TYPE_INT32: - //receivedParameterUpdate(wpParams.at(0).toInt(), componentId, key, valStr.toInt()); - setPendingParameter(componentId,key,QVariant(valStr.toInt())); - //setParameter(componentId, key, QVariant(valStr.toInt())); + setPendingParam(componentId,key,QVariant(valStr.toInt())); break; default: qDebug() << "FAILED LOADING PARAM" << key << "UNKNOWN DATA TYPE"; } - - //TODO update display - } @@ -228,7 +223,7 @@ void UASParameterDataModel::readUpdateParametersFromStream( QTextStream& stream) } -void UASParameterDataModel::writeOnboardParametersToStream( QTextStream &stream, const QString& name) +void UASParameterDataModel::writeOnboardParamsToStream( QTextStream &stream, const QString& name) { stream << "# Onboard parameters for system " << name << "\n"; stream << "#\n"; diff --git a/src/uas/UASParameterDataModel.h b/src/uas/UASParameterDataModel.h index 57dbc8f0afcca2a71c81a282292d5a180681058f..6ae4f685cd2f206bb85b8a83a6ea1387255f253e 100644 --- a/src/uas/UASParameterDataModel.h +++ b/src/uas/UASParameterDataModel.h @@ -35,55 +35,51 @@ public: virtual void addComponent(int compId); /** @brief Write a new pending parameter value that may be eventually sent to the UAS */ - virtual void setPendingParameter(int componentId, QString& key, const QVariant& value); - virtual void setOnboardParameter(int componentId, QString& key, const QVariant& value); + virtual void setPendingParam(int componentId, QString& key, const QVariant& value); + + virtual void removePendingParam(int compId, QString& key); /** @brief Save the onboard parameter with a the type specified in the QVariant as fixed */ - virtual void setOnboardParameterWithType(int componentId, QString& key, QVariant& value); + virtual void setOnboardParamWithType(int componentId, QString& key, QVariant& value); /** @brief clears every parameter for every loaded component */ - virtual void forgetAllOnboardParameters(); - - /** - * @return true if the given value for the parameter is different from the existing value - */ - virtual bool checkParameterChanged(int componentId, const QString& key, const QVariant &value); + virtual void forgetAllOnboardParams(); /** @brief add this parameter to pending list iff it has changed from onboard value - * @return true if the parameter has changed + * @return true if the parameter is now pending */ - virtual bool addPendingIfParameterChanged(int componentId, QString& key, QVariant& value); - + virtual bool updatePendingParamWithValue(int componentId, QString& key, QVariant& value); + virtual void handleParamUpdate(int componentId, QString& key, QVariant& value); + virtual bool getOnboardParamValue(int componentId, const QString& key, QVariant& value) const; - virtual void handleParameterUpdate(int componentId, QString& key, QVariant& value); - - virtual bool getOnboardParameterValue(int componentId, const QString& key, QVariant& value) const; - - QMap* getPendingParametersForComponent(int componentId) { + QMap* getPendingParamsForComponent(int componentId) { return pendingParameters.value(componentId); } - QMap* getOnbardParametersForComponent(int componentId) { + QMap* getOnboardParamsForComponent(int componentId) { return onboardParameters.value(componentId); } - QMap* >* getPendingParameters() { + QMap* >* getAllPendingParams() { return &pendingParameters; } - QMap* >* getOnboardParameters() { + QMap* >* getAllOnboardParams() { return &onboardParameters; } - virtual void writeOnboardParametersToStream(QTextStream &stream, const QString& uasName); - virtual void readUpdateParametersFromStream(QTextStream &stream); + virtual void writeOnboardParamsToStream(QTextStream &stream, const QString& uasName); + virtual void readUpdateParamsFromStream(QTextStream &stream); virtual void loadParamMetaInfoFromStream(QTextStream& stream); void setUASID(int anId) { this->uasId = anId; } +protected: + virtual void setOnboardParam(int componentId, QString& key, const QVariant& value); + signals: /** @brief We've received an update of a parameter's value */ diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index 484d61d5deceb0a18d64ff72e1012119fb911c37..7f18df8c93810bab691cda00449dc7f8df71e9c6 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -213,7 +213,7 @@ void QGCParamWidget::handleParameterListUpToDate() //rewrite the component item tree after receiving the full list QMap*>::iterator i; - QMap*>* onboardParams = paramDataModel->getOnboardParameters(); + QMap*>* onboardParams = paramDataModel->getAllOnboardParams(); for (i = onboardParams->begin(); i != onboardParams->end(); ++i) { int compId = i.key(); @@ -352,13 +352,12 @@ void QGCParamWidget::parameterItemChanged(QTreeWidgetItem* current, int column) QString key = current->data(0, Qt::DisplayRole).toString(); QVariant value = current->data(1, Qt::DisplayRole); - bool changed = paramDataModel->addPendingIfParameterChanged(componentId,key,value); - - // If the value was numerically changed, display it differently - if (changed) { + bool pending = paramDataModel->updatePendingParamWithValue(componentId,key,value); + // If the value will result in an update + if (pending) { // Set parameter on changed list to be transmitted to MAV - statusLabel->setText(tr("Transmit pend. %1:%2: %3").arg(componentId).arg(key).arg(value.toFloat(), 5, 'f', 1, QChar(' '))); + statusLabel->setText(tr("Pending: %1:%2: %3").arg(componentId).arg(key).arg(value.toFloat(), 5, 'f', 1, QChar(' '))); if (current == tree->currentItem()) { //need to unset current item to clear highlighting (green by default) @@ -366,9 +365,14 @@ void QGCParamWidget::parameterItemChanged(QTreeWidgetItem* current, int column) } current->setBackground(0, QBrush(QColor(QGC::colorOrange))); current->setBackground(1, QBrush(QColor(QGC::colorOrange))); - tree->update(); } - + else { + QMap* pendingParams = paramDataModel->getOnboardParamsForComponent(componentId); + int pendingCount = pendingParams->count(); + statusLabel->setText(tr("Pending items: %1").arg(pendingCount)); + current->setBackground(0, Qt::NoBrush); + current->setBackground(1, Qt::NoBrush); + } } } @@ -385,7 +389,7 @@ void QGCParamWidget::saveParametersToFile() } QTextStream outstream(&file); - paramDataModel->writeOnboardParametersToStream(outstream,mav->getUASName()); + paramDataModel->writeOnboardParamsToStream(outstream,mav->getUASName()); file.close(); } @@ -399,7 +403,7 @@ void QGCParamWidget::loadParametersFromFile() return; QTextStream in(&file); - paramDataModel->readUpdateParametersFromStream(in); + paramDataModel->readUpdateParamsFromStream(in); file.close(); } @@ -431,7 +435,7 @@ void QGCParamWidget::writeParameters() int changedParamCount = 0; QMap*>::iterator i; - QMap*>* changedValues = paramDataModel->getPendingParameters(); + QMap*>* changedValues = paramDataModel->getAllPendingParams(); for (i = changedValues->begin(); (i != changedValues->end()) && (0 == changedParamCount); ++i) { // Iterate through the pending parameters of the component, break on the first changed parameter