From b5608ed2ac025c457c134881eb89e3057ed6339e Mon Sep 17 00:00:00 2001 From: edouard Date: Tue, 7 Sep 2010 19:31:19 +0000 Subject: [PATCH] OP-38 Ground/Config gadget: implementation of a queue to manage successive ObjectPersistence updates, will solve several issues (two updates one after another will fail if we don't wait for the transaction completed signal). git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1557 ebee16cc-31ac-478f-84a7-5cbb03baadba --- .../src/plugins/config/configahrswidget.cpp | 3 +- .../src/plugins/config/configtaskwidget.cpp | 44 +++++++++++++++++-- ground/src/plugins/config/configtaskwidget.h | 12 +++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/ground/src/plugins/config/configahrswidget.cpp b/ground/src/plugins/config/configahrswidget.cpp index 4e3a5dcb1..194c90d4f 100644 --- a/ground/src/plugins/config/configahrswidget.cpp +++ b/ground/src/plugins/config/configahrswidget.cpp @@ -701,7 +701,8 @@ void ConfigAHRSWidget::homeLocationSave() field->setValue(QString("FALSE")); obj->updated(); if (m_ahrs->ahrsSettingsSaveSD->isChecked()) - updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj); + saveObjectToSD(obj); +// updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj); } /** diff --git a/ground/src/plugins/config/configtaskwidget.cpp b/ground/src/plugins/config/configtaskwidget.cpp index f4a05d7d6..44dbf68f4 100644 --- a/ground/src/plugins/config/configtaskwidget.cpp +++ b/ground/src/plugins/config/configtaskwidget.cpp @@ -39,12 +39,50 @@ ConfigTaskWidget::~ConfigTaskWidget() // Do nothing } +void ConfigTaskWidget::saveObjectToSD(UAVObject *obj) +{ + // Add to queue + queue.enqueue(obj); + // If queue length is one, then start sending (call sendNextObject) + // Otherwise, do nothing, it's sending anyway + if (queue.length()==1) + saveNextObject(); + +} + +void ConfigTaskWidget::saveNextObject() +{ + if ( queue.isEmpty() ) + { + return; + } + // Get next object from the queue + UAVObject* obj = queue.dequeue(); + ObjectPersistence* objper = dynamic_cast( getObjectManager()->getObject(ObjectPersistence::NAME) ); + connect(objper, SIGNAL(transactionCompleted(UAVObject*,bool)), this, SLOT(transactionCompleted(UAVObject*,bool))); + if (obj != NULL) + { + ObjectPersistence::DataFields data; + data.Operation = ObjectPersistence::OPERATION_SAVE; + data.Selection = ObjectPersistence::SELECTION_SINGLEOBJECT; + data.ObjectID = obj->getObjID(); + data.InstanceID = obj->getInstID(); + objper->setData(data); + objper->updated(); + } +} + +void ConfigTaskWidget::transactionCompleted(UAVObject* obj, bool success) +{ + Q_UNUSED(success); + // Disconnect from sending object + obj->disconnect(this); + saveNextObject(); +} void ConfigTaskWidget::updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj) { - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - ObjectPersistence* objper = dynamic_cast( objManager->getObject(ObjectPersistence::NAME) ); + ObjectPersistence* objper = dynamic_cast( getObjectManager()->getObject(ObjectPersistence::NAME) ); if (obj != NULL) { ObjectPersistence::DataFields data; diff --git a/ground/src/plugins/config/configtaskwidget.h b/ground/src/plugins/config/configtaskwidget.h index c131f1931..703cbf862 100644 --- a/ground/src/plugins/config/configtaskwidget.h +++ b/ground/src/plugins/config/configtaskwidget.h @@ -27,10 +27,12 @@ #ifndef CONFIGTASKWIDGET_H #define CONFIGTASKWIDGET_H + #include "extensionsystem/pluginmanager.h" #include "uavobjects/uavobjectmanager.h" #include "uavobjects/uavobject.h" #include "uavobjects/objectpersistence.h" +#include #include #include @@ -42,9 +44,19 @@ class ConfigTaskWidget: public QWidget public: ConfigTaskWidget(QWidget *parent = 0); ~ConfigTaskWidget(); + void saveObjectToSD(UAVObject *obj); void updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj); UAVObjectManager* getObjectManager(); +public slots: + void transactionCompleted(UAVObject* obj, bool success); + +private: + QQueue queue; + void saveNextObject(); + + + }; #endif // CONFIGTASKWIDGET_H