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:
parent
9895b403c7
commit
b5608ed2ac
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user