1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-18 08:54:15 +01:00

OP-1245 Added code to update and store meta data on the board.

This commit is contained in:
m_thread 2014-03-20 14:10:16 +01:00
parent cfff73361b
commit 838d8dd15f
7 changed files with 103 additions and 40 deletions

View File

@ -188,7 +188,7 @@ Rectangle {
enabled: !logManager.disableControls && logManager.boardConnected
model: logManager.logStatuses
Layout.preferredWidth: 200
currentIndex: logSettings.loggingEnabled
currentIndex: logManager.loggingEnabled
onCurrentIndexChanged: {
logManager.setLoggingEnabled(currentIndex);
}
@ -346,12 +346,6 @@ Rectangle {
Rectangle {
Layout.fillWidth: true
}
Button {
enabled: !logManager.disableControls && logManager.boardConnected
text: qsTr("Apply to board")
activeFocusOnPress: true
onClicked: logManager.applySettingsToBoard()
}
Button {
enabled: !logManager.disableControls && logManager.boardConnected
text: qsTr("Save to board")

View File

@ -50,10 +50,10 @@ FlightLogManager::FlightLogManager(QObject *parent) :
Q_ASSERT(pluginManager);
m_objectManager = pluginManager->getObject<UAVObjectManager>();
m_objectManager = pluginManager->getObject<UAVObjectManager>();
Q_ASSERT(m_objectManager);
m_telemtryManager = pluginManager->getObject<TelemetryManager>();
m_telemtryManager = pluginManager->getObject<TelemetryManager>();
Q_ASSERT(m_telemtryManager);
m_flightLogControl = DebugLogControl::GetInstance(m_objectManager);
@ -77,6 +77,7 @@ FlightLogManager::FlightLogManager(QObject *parent) :
connect(m_telemtryManager, SIGNAL(connected()), this, SLOT(connectionStatusChanged()));
connect(m_telemtryManager, SIGNAL(disconnected()), this, SLOT(connectionStatusChanged()));
connectionStatusChanged();
}
FlightLogManager::~FlightLogManager()
@ -387,7 +388,8 @@ void FlightLogManager::cancelExportLogs()
void FlightLogManager::loadSettings()
{
QString xmlFilter = tr("XML file %1").arg("(*.xml)");
QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load Log Settings"), QDir::homePath(), QString("%1").arg(xmlFilter));
QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load Log Settings"), QDir::homePath(), QString("%1").arg(xmlFilter));
if (!fileName.isEmpty()) {
if (!fileName.endsWith(".xml")) {
fileName.append(".xml");
@ -414,11 +416,10 @@ void FlightLogManager::loadSettings()
while (xmlReader.readNextStartElement()) {
if (xmlReader.name() == "setting") {
QString name = xmlReader.attributes().value("name").toString();
int level = xmlReader.attributes().value("level").toInt(&ok);
int level = xmlReader.attributes().value("level").toInt(&ok);
if (ok) {
int period = xmlReader.attributes().value("period").toInt(&ok);
if (ok && updateLogWrapper(name, level, period)) {
} else {
if (ok && updateLogWrapper(name, level, period)) {} else {
errorString = tr("Could not parse period attribute, or object with name '%1' could not be found.").arg(name);
break;
}
@ -445,8 +446,9 @@ void FlightLogManager::loadSettings()
void FlightLogManager::saveSettings()
{
QString xmlFilter = tr("XML file %1").arg("(*.xml)");
QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save Log Settings"),
QDir::homePath(), QString("%1").arg(xmlFilter));
QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save Log Settings"),
QDir::homePath(), QString("%1").arg(xmlFilter));
if (!fileName.isEmpty()) {
if (!fileName.endsWith(".xml")) {
fileName.append(".xml");
@ -486,11 +488,12 @@ void FlightLogManager::resetSettings(bool clear)
}
}
void FlightLogManager::applySettingsToBoard()
{}
void FlightLogManager::saveSettingsToBoard()
{}
{
foreach(UAVOLogSettingsWrapper * wrapper, m_uavoEntries) {
wrapper->save();
}
}
void FlightLogManager::updateFlightEntries(quint16 currentFlight)
{
@ -511,14 +514,16 @@ void FlightLogManager::updateFlightEntries(quint16 currentFlight)
void FlightLogManager::setupUAVOWrappers()
{
ObjectPersistence *objectPersistance = ObjectPersistence::GetInstance(m_objectManager);
Q_ASSERT(objectPersistance);
foreach(QList<UAVObject *> objectList, m_objectManager->getObjects()) {
UAVObject *object = objectList.at(0);
if (!object->isMetaDataObject() && !object->isSettingsObject()) {
UAVOLogSettingsWrapper *wrapper = new UAVOLogSettingsWrapper(qobject_cast<UAVDataObject*>(object));
UAVOLogSettingsWrapper *wrapper = new UAVOLogSettingsWrapper(qobject_cast<UAVDataObject *>(object), objectPersistance);
m_uavoEntries.append(wrapper);
m_uavoEntriesHash[wrapper->name()] = wrapper;
qDebug() << objectList.at(0)->getName();
}
}
emit uavoEntriesChanged();
@ -527,12 +532,12 @@ void FlightLogManager::setupUAVOWrappers()
void FlightLogManager::setupLogSettings()
{
// Corresponds to:
// typedef enum {
// UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */
// UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */
// UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */
// UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */
// } UpdateMode;
// typedef enum {
// UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */
// UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */
// UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */
// UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */
// } UpdateMode;
m_logSettings << tr("Disabled") << tr("Periodically") << tr("When updated") << tr("Throttled");
}
@ -551,7 +556,7 @@ void FlightLogManager::connectionStatusChanged()
} else {
setBoardConnected(false);
}
if(boardConnected()) {
if (boardConnected()) {
resetSettings(false);
}
}
@ -559,6 +564,7 @@ void FlightLogManager::connectionStatusChanged()
bool FlightLogManager::updateLogWrapper(QString name, int level, int period)
{
UAVOLogSettingsWrapper *wrapper = m_uavoEntriesHash[name];
if (wrapper) {
wrapper->setSetting(level);
wrapper->setPeriod(period);
@ -635,8 +641,8 @@ void ExtendedDebugLogEntry::setData(const DebugLogEntry::DataFields &data, UAVOb
UAVOLogSettingsWrapper::UAVOLogSettingsWrapper() : QObject()
{}
UAVOLogSettingsWrapper::UAVOLogSettingsWrapper(UAVDataObject *object) : QObject(),
m_object(object), m_setting(DISABLED), m_period(0), m_dirty(0)
UAVOLogSettingsWrapper::UAVOLogSettingsWrapper(UAVDataObject *object, ObjectPersistence *persistence) : QObject(),
m_object(object), m_setting(DISABLED), m_period(0), m_dirty(0), m_objectPersistence(persistence)
{
reset(false);
}
@ -650,3 +656,47 @@ void UAVOLogSettingsWrapper::reset(bool clear)
setPeriod(clear ? 0 : m_object->getMetadata().loggingUpdatePeriod);
setDirty(false);
}
void UAVOLogSettingsWrapper::save()
{
if(m_dirty) {
UAVObject::Metadata meta = m_object->getMetadata();
m_object->SetLoggingUpdateMode(meta, settingAsUpdateMode());
meta.loggingUpdatePeriod = m_period;
m_object->setMetadata(meta);
UAVObjectUpdaterHelper helper;
if (helper.doObjectAndWait(m_object->getMetaObject(), 1000) == UAVObjectUpdaterHelper::SUCCESS) {
ObjectPersistence::DataFields data;
data.Operation = ObjectPersistence::OPERATION_SAVE;
data.Selection = ObjectPersistence::SELECTION_SINGLEOBJECT;
data.ObjectID = m_object->getMetaObject()->getObjID();
data.InstanceID = m_object->getMetaObject()->getInstID();
m_objectPersistence->setData(data);
if (helper.doObjectAndWait(m_objectPersistence, 1000) == UAVObjectUpdaterHelper::SUCCESS) {
setDirty(false);
} else {
qDebug() << "Storing failed!";
}
} else {
qDebug() << "Updating failed!";
}
}
}
UAVObject::UpdateMode UAVOLogSettingsWrapper::settingAsUpdateMode()
{
switch (m_setting) {
case 0:
return UAVObject::UPDATEMODE_MANUAL;
case 1:
return UAVObject::UPDATEMODE_PERIODIC;
case 2:
return UAVObject::UPDATEMODE_ONCHANGE;
case 3:
return UAVObject::UPDATEMODE_THROTTLED;
default:
return UAVObject::UPDATEMODE_MANUAL;
}
}

View File

@ -41,6 +41,7 @@
#include "debuglogstatus.h"
#include "debuglogsettings.h"
#include "debuglogcontrol.h"
#include "objectpersistence.h"
#include "uavtalk/telemetrymanager.h"
class UAVOLogSettingsWrapper : public QObject {
@ -55,7 +56,7 @@ public:
enum UAVLogSetting { DISABLED = 0, ON_CHANGE, THROTTLED, PERIODICALLY };
explicit UAVOLogSettingsWrapper();
explicit UAVOLogSettingsWrapper(UAVDataObject *object);
explicit UAVOLogSettingsWrapper(UAVDataObject *object, ObjectPersistence *persistence);
~UAVOLogSettingsWrapper();
QString name() const
@ -87,8 +88,11 @@ public slots:
void setSetting(int setting)
{
if (m_setting != setting) {
m_setting = setting;
m_setting = setting;
setDirty(true);
if (m_setting != 1 && m_setting != 3) {
setPeriod(0);
}
emit settingChanged(setting);
}
}
@ -111,6 +115,8 @@ public slots:
}
void reset(bool clear);
void save();
void apply();
signals:
void settingChanged(int setting);
@ -125,6 +131,9 @@ private:
int m_setting;
int m_period;
bool m_dirty;
ObjectPersistence *m_objectPersistence;
UAVObject::UpdateMode settingAsUpdateMode();
};
class ExtendedDebugLogEntry : public DebugLogEntry {
@ -256,7 +265,6 @@ public slots:
void loadSettings();
void saveSettings();
void resetSettings(bool clear);
void applySettingsToBoard();
void saveSettingsToBoard();
void setDisableControls(bool arg)

View File

@ -14,17 +14,14 @@ HEADERS += \
uavdataobject.h \
uavobjectfield.h \
uavobjectsinit.h \
uavobjectsplugin.h \
uavobjecthelper.h
uavobjectsplugin.h
SOURCES += \
uavobject.cpp \
uavmetaobject.cpp \
uavobjectmanager.cpp \
uavdataobject.cpp \
uavobjectfield.cpp \
uavobjectsplugin.cpp \
uavobjecthelper.cpp
uavobjectsplugin.cpp
OTHER_FILES += UAVObjects.pluginspec

View File

@ -32,6 +32,9 @@ AbstractUAVObjectHelper::AbstractUAVObjectHelper(QObject *parent) :
QObject(parent), m_transactionResult(false), m_transactionCompleted(false)
{}
AbstractUAVObjectHelper::~AbstractUAVObjectHelper()
{}
AbstractUAVObjectHelper::Result AbstractUAVObjectHelper::doObjectAndWait(UAVObject *object, int timeout)
{
// Lock, we can't call this twice from different threads
@ -86,6 +89,9 @@ void AbstractUAVObjectHelper::transactionCompleted(UAVObject *object, bool succe
UAVObjectUpdaterHelper::UAVObjectUpdaterHelper(QObject *parent) : AbstractUAVObjectHelper(parent)
{}
UAVObjectUpdaterHelper::~UAVObjectUpdaterHelper()
{}
void UAVObjectUpdaterHelper::doObjectAndWaitImpl()
{
m_object->updated();
@ -94,6 +100,9 @@ void UAVObjectUpdaterHelper::doObjectAndWaitImpl()
UAVObjectRequestHelper::UAVObjectRequestHelper(QObject *parent) : AbstractUAVObjectHelper(parent)
{}
UAVObjectRequestHelper::~UAVObjectRequestHelper()
{}
void UAVObjectRequestHelper::doObjectAndWaitImpl()
{
m_object->requestUpdate();

View File

@ -39,6 +39,7 @@ class UAVOBJECTS_EXPORT AbstractUAVObjectHelper : public QObject {
Q_OBJECT
public:
explicit AbstractUAVObjectHelper(QObject *parent = 0);
virtual ~AbstractUAVObjectHelper();
enum Result { SUCCESS, FAIL, TIMEOUT };
Result doObjectAndWait(UAVObject *object, int timeout);
@ -61,6 +62,7 @@ class UAVOBJECTS_EXPORT UAVObjectUpdaterHelper : public AbstractUAVObjectHelper
Q_OBJECT
public:
explicit UAVObjectUpdaterHelper(QObject *parent = 0);
virtual ~UAVObjectUpdaterHelper();
protected:
virtual void doObjectAndWaitImpl();
@ -70,6 +72,7 @@ class UAVOBJECTS_EXPORT UAVObjectRequestHelper : public AbstractUAVObjectHelper
Q_OBJECT
public:
explicit UAVObjectRequestHelper(QObject *parent = 0);
virtual ~UAVObjectRequestHelper();
protected:
virtual void doObjectAndWaitImpl();

View File

@ -7,9 +7,11 @@ include(uavobjectutil_dependencies.pri)
HEADERS += uavobjectutil_global.h \
uavobjectutilmanager.h \
uavobjectutilplugin.h \
devicedescriptorstruct.h
devicedescriptorstruct.h \
uavobjecthelper.h
SOURCES += uavobjectutilmanager.cpp \
uavobjectutilplugin.cpp
uavobjectutilplugin.cpp \
uavobjecthelper.cpp
OTHER_FILES += UAVObjectUtil.pluginspec