mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-21 11:54:15 +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"));
|
field->setValue(QString("FALSE"));
|
||||||
obj->updated();
|
obj->updated();
|
||||||
if (m_ahrs->ahrsSettingsSaveSD->isChecked())
|
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
|
// 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)
|
void ConfigTaskWidget::updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj)
|
||||||
{
|
{
|
||||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
ObjectPersistence* objper = dynamic_cast<ObjectPersistence*>( getObjectManager()->getObject(ObjectPersistence::NAME) );
|
||||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
|
||||||
ObjectPersistence* objper = dynamic_cast<ObjectPersistence*>( objManager->getObject(ObjectPersistence::NAME) );
|
|
||||||
if (obj != NULL)
|
if (obj != NULL)
|
||||||
{
|
{
|
||||||
ObjectPersistence::DataFields data;
|
ObjectPersistence::DataFields data;
|
||||||
|
@ -27,10 +27,12 @@
|
|||||||
#ifndef CONFIGTASKWIDGET_H
|
#ifndef CONFIGTASKWIDGET_H
|
||||||
#define CONFIGTASKWIDGET_H
|
#define CONFIGTASKWIDGET_H
|
||||||
|
|
||||||
|
|
||||||
#include "extensionsystem/pluginmanager.h"
|
#include "extensionsystem/pluginmanager.h"
|
||||||
#include "uavobjects/uavobjectmanager.h"
|
#include "uavobjects/uavobjectmanager.h"
|
||||||
#include "uavobjects/uavobject.h"
|
#include "uavobjects/uavobject.h"
|
||||||
#include "uavobjects/objectpersistence.h"
|
#include "uavobjects/objectpersistence.h"
|
||||||
|
#include <QQueue>
|
||||||
#include <QtGui/QWidget>
|
#include <QtGui/QWidget>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
@ -42,9 +44,19 @@ class ConfigTaskWidget: public QWidget
|
|||||||
public:
|
public:
|
||||||
ConfigTaskWidget(QWidget *parent = 0);
|
ConfigTaskWidget(QWidget *parent = 0);
|
||||||
~ConfigTaskWidget();
|
~ConfigTaskWidget();
|
||||||
|
void saveObjectToSD(UAVObject *obj);
|
||||||
void updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj);
|
void updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj);
|
||||||
UAVObjectManager* getObjectManager();
|
UAVObjectManager* getObjectManager();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void transactionCompleted(UAVObject* obj, bool success);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QQueue<UAVObject*> queue;
|
||||||
|
void saveNextObject();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONFIGTASKWIDGET_H
|
#endif // CONFIGTASKWIDGET_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user