Commit 1fad00a1 authored by tstellanova's avatar tstellanova

fix updating of pending param list after transmit

parent 6b1801a8
...@@ -80,8 +80,8 @@ void UASParameterCommsMgr::requestParameterList() ...@@ -80,8 +80,8 @@ void UASParameterCommsMgr::requestParameterList()
transmissionListSizeKnown.clear(); transmissionListSizeKnown.clear();
transmissionListMode = true; transmissionListMode = true;
foreach (int key, transmissionMissingPackets.keys()) { foreach (int key, missingReadPackets.keys()) {
transmissionMissingPackets.value(key)->clear(); missingReadPackets.value(key)->clear();
} }
transmissionActive = true; transmissionActive = true;
...@@ -106,10 +106,10 @@ void UASParameterCommsMgr::clearRetransmissionLists(int& missingReadCount, int& ...@@ -106,10 +106,10 @@ void UASParameterCommsMgr::clearRetransmissionLists(int& missingReadCount, int&
qDebug() << __FILE__ << __LINE__ << "clearRetransmissionLists"; qDebug() << __FILE__ << __LINE__ << "clearRetransmissionLists";
missingReadCount = 0; missingReadCount = 0;
QList<int> readKeys = transmissionMissingPackets.keys(); QList<int> readKeys = missingReadPackets.keys();
foreach (int compId, readKeys) { foreach (int compId, readKeys) {
missingReadCount += transmissionMissingPackets.value(compId)->count(); missingReadCount += missingReadPackets.value(compId)->count();
transmissionMissingPackets.value(compId)->clear(); missingReadPackets.value(compId)->clear();
} }
missingWriteCount = 0; missingWriteCount = 0;
...@@ -169,10 +169,11 @@ void UASParameterCommsMgr::resendReadWriteRequests() ...@@ -169,10 +169,11 @@ 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 = missingReadPackets.keys();
foreach (compId, compIds) { foreach (compId, compIds) {
// Request n parameters from this component (at maximum) // Request n parameters from this component (at maximum)
QList<int>* missingReadParams = transmissionMissingPackets.value(compId, NULL); QList<int>* missingReadParams = missingReadPackets.value(compId, NULL);
qDebug() << "missingReadParams:" << missingReadParams->count();
foreach (int paramId, *missingReadParams) { foreach (int paramId, *missingReadParams) {
if (requestedReadCount < retransmissionBurstRequestSize) { if (requestedReadCount < retransmissionBurstRequestSize) {
//qDebug() << __FILE__ << __LINE__ << "RETRANSMISSION GUARD REQUESTS RETRANSMISSION OF PARAM #" << paramId << "FROM COMPONENT #" << compId; //qDebug() << __FILE__ << __LINE__ << "RETRANSMISSION GUARD REQUESTS RETRANSMISSION OF PARAM #" << paramId << "FROM COMPONENT #" << compId;
...@@ -423,11 +424,11 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para ...@@ -423,11 +424,11 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para
paramDataModel->handleParamUpdate(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 (!missingReadPackets.contains(compId)) {
transmissionMissingPackets.insert(compId, new QList<int>()); missingReadPackets.insert(compId, new QList<int>());
} }
QList<int>* compXmitMissing = transmissionMissingPackets.value(compId); QList<int>* compMissReadPackets = missingReadPackets.value(compId);
// List mode is different from single parameter transfers // List mode is different from single parameter transfers
if (transmissionListMode) { if (transmissionListMode) {
...@@ -439,8 +440,8 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para ...@@ -439,8 +440,8 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para
qDebug() << "Mark all parameters as missing: " << paramCount; qDebug() << "Mark all parameters as missing: " << paramCount;
for (int i = 1; i < paramCount; ++i) { //TODO check: param Id 0 is "all parameters" and not valid ? for (int i = 1; i < paramCount; ++i) { //TODO check: param Id 0 is "all parameters" and not valid ?
if (!compXmitMissing->contains(i)) { if (!compMissReadPackets->contains(i)) {
compXmitMissing->append(i); compMissReadPackets->append(i);
} }
} }
...@@ -456,28 +457,27 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para ...@@ -456,28 +457,27 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para
} }
// Mark this parameter as received in read list // Mark this parameter as received in read list
int index = compXmitMissing->indexOf(paramId); int index = compMissReadPackets->indexOf(paramId);
// If the MAV sent the parameter without request, it wont be in missing list
if (index != -1) { if (index != -1) {
compXmitMissing->removeAt(index); compMissReadPackets->removeAt(index);
} }
bool justWritten = false; bool justWritten = false;
bool writeMismatch = false; bool writeMismatch = false;
// Mark this parameter as received in write ACK list // Mark this parameter as received in write ACK list
QMap<QString, QVariant>* map = missingWriteAckPackets.value(compId); QMap<QString, QVariant>* compMissWritePackets = missingWriteAckPackets.value(compId);
if (map && map->contains(paramName)) { if (compMissWritePackets && compMissWritePackets->contains(paramName)) {
justWritten = true; justWritten = true;
if (map->value(paramName) != value) { if (compMissWritePackets->value(paramName) != value) {
writeMismatch = true; writeMismatch = true;
} }
map->remove(paramName); compMissWritePackets->remove(paramName);
} }
int missReadCount = 0; int missReadCount = 0;
foreach (int key, transmissionMissingPackets.keys()) { foreach (int key, missingReadPackets.keys()) {
missReadCount += transmissionMissingPackets.value(key)->count(); missReadCount += missingReadPackets.value(key)->count();
} }
int missWriteCount = 0; int missWriteCount = 0;
...@@ -488,15 +488,14 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para ...@@ -488,15 +488,14 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para
//TODO simplify this if-else tree //TODO simplify this if-else tree
if (justWritten) { if (justWritten) {
if (!writeMismatch) { if (!writeMismatch) {
setParameterStatusMsg(tr("SUCCESS: Wrote %2 (#%1/%4): %3").arg(paramId+1).arg(paramName).arg(value.toDouble()).arg(paramCount)); setParameterStatusMsg(tr("SUCCESS: Wrote %2 (#%1/%4): %3 [%5]").arg(paramId+1).arg(paramName).arg(value.toDouble()).arg(paramCount).arg(missWriteCount));
if (0 == missWriteCount) { if (0 == missWriteCount) {
setParameterStatusMsg(tr("SUCCESS: WROTE ALL PARAMETERS")); setParameterStatusMsg(tr("SUCCESS: WROTE ALL PARAMETERS"));
paramDataModel->commitAllPendingParams();
} }
} }
else { else {
// Mismatch, tell user // Mismatch, tell user
setParameterStatusMsg(tr("FAILURE: Wrote %1: sent %2 != onboard %3").arg(paramName).arg(map->value(paramName).toDouble()).arg(value.toDouble()), setParameterStatusMsg(tr("FAILURE: Wrote %1: sent %2 != onboard %3").arg(paramName).arg(compMissWritePackets->value(paramName).toDouble()).arg(value.toDouble()),
ParamCommsStatusLevel_Warning); ParamCommsStatusLevel_Warning);
} }
} }
...@@ -512,6 +511,7 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para ...@@ -512,6 +511,7 @@ void UASParameterCommsMgr::receivedParameterUpdate(int uas, int compId, int para
QString val = QString("%1").arg(value.toFloat(), 5, 'f', 1, QChar(' ')); QString val = QString("%1").arg(value.toFloat(), 5, 'f', 1, QChar(' '));
setParameterStatusMsg(tr("OK: %1 %2 (%3/%4)").arg(paramName).arg(val).arg(paramCount-missReadCount).arg(paramCount), setParameterStatusMsg(tr("OK: %1 %2 (%3/%4)").arg(paramName).arg(val).arg(paramCount-missReadCount).arg(paramCount),
ParamCommsStatusLevel_Warning); ParamCommsStatusLevel_Warning);
//transmissionMissingPackets
} }
} }
...@@ -598,6 +598,8 @@ void UASParameterCommsMgr::sendPendingParameters() ...@@ -598,6 +598,8 @@ void UASParameterCommsMgr::sendPendingParameters()
} }
// Enable guard // Enable guard
setRetransmissionGuardEnabled(true); setRetransmissionGuardEnabled(true);
qDebug() << "Pending parameters now:" << paramDataModel->countPendingParams();
} }
} }
......
...@@ -92,7 +92,7 @@ protected: ...@@ -92,7 +92,7 @@ protected:
// Communications management // Communications management
QVector<bool> receivedParamsList; ///< Successfully received parameters QVector<bool> receivedParamsList; ///< Successfully received parameters
QMap<int, QList<int>* > transmissionMissingPackets; ///< Missing packets QMap<int, QList<int>* > missingReadPackets; ///< Missing packets
QMap<int, QMap<QString, QVariant>* > missingWriteAckPackets; ///< Missing write ACK packets QMap<int, QMap<QString, QVariant>* > missingWriteAckPackets; ///< Missing write ACK packets
bool transmissionListMode; ///< Currently requesting list bool transmissionListMode; ///< Currently requesting list
QMap<int, bool> transmissionListSizeKnown; ///< List size initialized? QMap<int, bool> transmissionListSizeKnown; ///< List size initialized?
......
...@@ -31,27 +31,6 @@ int UASParameterDataModel::countPendingParams() ...@@ -31,27 +31,6 @@ int UASParameterDataModel::countPendingParams()
return totalPending; return totalPending;
} }
void UASParameterDataModel::commitAllPendingParams()
{
qDebug() << "commitAllPendingParams:" << countPendingParams();
QList<int> allCompIds = pendingParameters.keys();
foreach (int compId, allCompIds) {
// Iterate through the parameters of the component
QMap<QString, QVariant>* compParams = pendingParameters.value(compId);
QList<QString> paramNames = compParams->keys();
qDebug() << paramNames.count() << "committed params for component" << compId;
foreach (QString paramName, paramNames) {
QVariant value = compParams->value(paramName);
setOnboardParamWithType( compId, paramName, value);//update the onboard value to match pending value
emit pendingParamUpdate(compId,paramName,value,false); //no longer pending
emit parameterUpdated(compId,paramName,value);//ensure the new onboard value is broadcast
}
}
}
bool UASParameterDataModel::updatePendingParamWithValue(int compId, QString& key, const QVariant& value) bool UASParameterDataModel::updatePendingParamWithValue(int compId, QString& key, const QVariant& value)
{ {
...@@ -163,26 +142,27 @@ void UASParameterDataModel::addComponent(int compId) ...@@ -163,26 +142,27 @@ void UASParameterDataModel::addComponent(int compId)
} }
void UASParameterDataModel::handleParamUpdate(int compId, QString& key, QVariant& value) void UASParameterDataModel::handleParamUpdate(int compId, QString& paramName, 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!
if (pendingParameters.contains(compId)) { if (pendingParameters.contains(compId)) {
QMap<QString , QVariant> *pendingParams = pendingParameters.value(compId); QMap<QString , QVariant> *pendingParams = pendingParameters.value(compId);
if ((NULL != pendingParams) && pendingParams->contains(key)) { if ((NULL != pendingParams) && pendingParams->contains(paramName)) {
QVariant reqVal = pendingParams->value(key); QVariant reqVal = pendingParams->value(paramName);
if (reqVal == value) { if (reqVal == value) {
pendingParams->remove(key); //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);
} }
else { else {
qDebug() << "Pending commit for " << key << " want: " << reqVal << " got: " << value; qDebug() << "Pending commit for " << paramName << " want: " << reqVal << " got: " << value;
} }
} }
} }
setOnboardParam(compId,key,value); emit parameterUpdated(compId,paramName,value);
setOnboardParam(compId,paramName,value);
emit parameterUpdated(compId,key,value);
} }
......
...@@ -35,8 +35,6 @@ public: ...@@ -35,8 +35,6 @@ public:
virtual void addComponent(int compId); virtual void addComponent(int compId);
virtual void removePendingParam(int compId, QString& key);
virtual void commitAllPendingParams();///< Called by eg params comms mgr when all pending params have been sent & acked
/** @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 setOnboardParamWithType(int componentId, QString& key, QVariant& value); virtual void setOnboardParamWithType(int componentId, QString& key, QVariant& value);
...@@ -70,6 +68,9 @@ public: ...@@ -70,6 +68,9 @@ public:
return &onboardParameters; return &onboardParameters;
} }
/** @brief return a count of all pending parameters */
int countPendingParams();
virtual void writeOnboardParamsToStream(QTextStream &stream, const QString& uasName); virtual void writeOnboardParamsToStream(QTextStream &stream, const QString& uasName);
virtual void readUpdateParamsFromStream(QTextStream &stream); virtual void readUpdateParamsFromStream(QTextStream &stream);
...@@ -79,11 +80,14 @@ public: ...@@ -79,11 +80,14 @@ public:
void setUASID(int anId) { this->uasId = anId; } void setUASID(int anId) { this->uasId = anId; }
protected: protected:
/** @brief set the confirmed value of a parameter in the onboard params list */
virtual void setOnboardParam(int componentId, QString& key, const QVariant& value); virtual void setOnboardParam(int componentId, QString& key, const QVariant& value);
/** @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 setPendingParam(int componentId, QString& key, const QVariant& value); virtual void setPendingParam(int componentId, QString& key, const QVariant& value);
/** @brief remove a parameter from the pending list */
virtual void removePendingParam(int compId, QString& key);
int countPendingParams();
signals: signals:
......
...@@ -509,16 +509,7 @@ void QGCParamWidget::requestAllParamsUpdate() ...@@ -509,16 +509,7 @@ void QGCParamWidget::requestAllParamsUpdate()
*/ */
void QGCParamWidget::writeParameters() void QGCParamWidget::writeParameters()
{ {
int changedParamCount = 0; int changedParamCount = paramDataModel->countPendingParams();
QMap<int, QMap<QString, QVariant>*>::iterator i;
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
QMap<QString, QVariant>* compPending = i.value();
changedParamCount += compPending->count();
}
if (changedParamCount > 0) { if (changedParamCount > 0) {
QMessageBox msgBox; QMessageBox msgBox;
...@@ -534,7 +525,7 @@ void QGCParamWidget::writeParameters() ...@@ -534,7 +525,7 @@ void QGCParamWidget::writeParameters()
void QGCParamWidget::readParameters() void QGCParamWidget::readParameters()
{ {
if (!mav) return; if (!mav) return;
mav->readParametersFromStorage(); mav->readParametersFromStorage(); //TODO use data model / mgr instead?
} }
/** /**
......
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