1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

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
This commit is contained in:
edouard 2010-09-07 19:31:19 +00:00 committed by edouard
parent 9895b403c7
commit b5608ed2ac
3 changed files with 55 additions and 4 deletions

View File

@ -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);
}
/**

View File

@ -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<ObjectPersistence*>( 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<UAVObjectManager>();
ObjectPersistence* objper = dynamic_cast<ObjectPersistence*>( objManager->getObject(ObjectPersistence::NAME) );
ObjectPersistence* objper = dynamic_cast<ObjectPersistence*>( getObjectManager()->getObject(ObjectPersistence::NAME) );
if (obj != NULL)
{
ObjectPersistence::DataFields data;

View File

@ -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 <QQueue>
#include <QtGui/QWidget>
#include <QList>
@ -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<UAVObject*> queue;
void saveNextObject();
};
#endif // CONFIGTASKWIDGET_H