Commit 6bc50564 authored by tstellanova's avatar tstellanova

fix pending parameter change check

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