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) :
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()
// 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<int, QMap<QString, QVariant>*>* changedValues = paramDataModel->getPendingParameters();
QMap<int, QMap<QString, QVariant>*>* changedValues = paramDataModel->getAllPendingParams();
QMap<int, QMap<QString, QVariant>*>::iterator i;
for (i = changedValues->begin(); i != changedValues->end(); ++i) {
// Iterate through the parameters of the component
......
......@@ -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<QString, QVariant>* existParams = getOnbardParametersForComponent(compId);
QMap<QString, QVariant>* 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<QString, QVariant> *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<QString, QVariant> *params = getPendingParametersForComponent(componentId);
addComponent(compId);
QMap<QString, QVariant> *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<QString, QVariant> *params = getOnbardParametersForComponent(componentId);
addComponent(compId);
QMap<QString, QVariant> *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";
......
......@@ -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<QString , QVariant>* getPendingParametersForComponent(int componentId) {
QMap<QString , QVariant>* getPendingParamsForComponent(int componentId) {
return pendingParameters.value(componentId);
}
QMap<QString , QVariant>* getOnbardParametersForComponent(int componentId) {
QMap<QString , QVariant>* getOnboardParamsForComponent(int componentId) {
return onboardParameters.value(componentId);
}
QMap<int, QMap<QString, QVariant>* >* getPendingParameters() {
QMap<int, QMap<QString, QVariant>* >* getAllPendingParams() {
return &pendingParameters;
}
QMap<int, QMap<QString, QVariant>* >* getOnboardParameters() {
QMap<int, QMap<QString, QVariant>* >* 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 */
......
......@@ -213,7 +213,7 @@ void QGCParamWidget::handleParameterListUpToDate()
//rewrite the component item tree after receiving the full list
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) {
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<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()
}
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<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) {
// 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