diff --git a/ground/openpilotgcs/src/plugins/flightlog/FlightLogDialog.qml b/ground/openpilotgcs/src/plugins/flightlog/FlightLogDialog.qml index c328223b1..1553bb998 100644 --- a/ground/openpilotgcs/src/plugins/flightlog/FlightLogDialog.qml +++ b/ground/openpilotgcs/src/plugins/flightlog/FlightLogDialog.qml @@ -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") diff --git a/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.cpp b/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.cpp index 3f8970f57..ea04eaafd 100644 --- a/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.cpp +++ b/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.cpp @@ -50,10 +50,10 @@ FlightLogManager::FlightLogManager(QObject *parent) : Q_ASSERT(pluginManager); - m_objectManager = pluginManager->getObject(); + m_objectManager = pluginManager->getObject(); Q_ASSERT(m_objectManager); - m_telemtryManager = pluginManager->getObject(); + m_telemtryManager = pluginManager->getObject(); 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 objectList, m_objectManager->getObjects()) { UAVObject *object = objectList.at(0); if (!object->isMetaDataObject() && !object->isSettingsObject()) { - UAVOLogSettingsWrapper *wrapper = new UAVOLogSettingsWrapper(qobject_cast(object)); + UAVOLogSettingsWrapper *wrapper = new UAVOLogSettingsWrapper(qobject_cast(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; + } +} diff --git a/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.h b/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.h index 19f7b5e12..099ea7843 100644 --- a/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.h +++ b/ground/openpilotgcs/src/plugins/flightlog/flightlogmanager.h @@ -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) diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro b/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro index dc54fb9b7..9c6dc8d67 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro @@ -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 diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.cpp similarity index 95% rename from ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.cpp rename to ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.cpp index 25ff5f805..ddd683a98 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.cpp @@ -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(); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.h b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.h similarity index 95% rename from ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.h rename to ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.h index bf2739e09..7891de004 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecthelper.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjecthelper.h @@ -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(); diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutil.pro b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutil.pro index 2f8070820..dde6e81b5 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutil.pro +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutil.pro @@ -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