From 1c2efe0868146348d8ab6cd7d70cfe1b6283d17f Mon Sep 17 00:00:00 2001 From: m_thread Date: Mon, 15 Sep 2014 22:46:28 +0200 Subject: [PATCH] OP-1222 Added JSon serialization code. --- .../plugins/setupwizard/setupwizardplugin.cpp | 39 ++++++++++++++- .../plugins/setupwizard/setupwizardplugin.h | 1 + .../src/plugins/uavobjects/uavobject.cpp | 47 ++++++++++++++++--- .../src/plugins/uavobjects/uavobject.h | 4 +- .../src/plugins/uavobjects/uavobjectfield.cpp | 40 ++++++++++++++-- .../src/plugins/uavobjects/uavobjectfield.h | 4 +- 6 files changed, 118 insertions(+), 17 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp index 6e8903cd1..544932e9b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp @@ -36,6 +36,8 @@ #include #include #include +#include +#include "stabilizationsettings.h" SetupWizardPlugin::SetupWizardPlugin() : wizardRunning(false) {} @@ -58,14 +60,26 @@ bool SetupWizardPlugin::initialize(const QStringList & args, QString *errMsg) Core::Constants::C_GLOBAL_ID); cmd->setDefaultKeySequence(QKeySequence("Ctrl+V")); cmd->action()->setText(tr("Vehicle Setup Wizard")); + connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(showSetupWizard())); Core::ModeManager::instance()->addAction(cmd, 1); - ac->menu()->addSeparator(); ac->appendGroup("Wizard"); ac->addAction(cmd, "Wizard"); - connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(showSetupWizard())); + cmd = am->registerAction(new QAction(this), + "SetupWizardPlugin.ExportJSon", + QList() << + Core::Constants::C_GLOBAL_ID); + cmd->action()->setText(tr("Export Stabilization Settings")); + connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(exportSettings())); + + Core::ModeManager::instance()->addAction(cmd, 1); + ac->menu()->addSeparator(); + ac->appendGroup("Wizard"); + ac->addAction(cmd, "Wizard"); + + return true; } @@ -87,6 +101,27 @@ void SetupWizardPlugin::showSetupWizard() } } +void SetupWizardPlugin::exportSettings() +{ + QFile saveFile(QStringLiteral("/home/fredrik/export.json")); + + if (!saveFile.open(QIODevice::WriteOnly)) { + qWarning("Couldn't open save file."); + return; + } + + QJsonObject exportObject; + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *uavoManager = pm->getObject(); + StabilizationSettings* settings = StabilizationSettings::GetInstance(uavoManager); + settings->toJson(exportObject); + + QJsonDocument saveDoc(exportObject); + saveFile.write(saveDoc.toJson()); + +} + void SetupWizardPlugin::wizardTerminated() { wizardRunning = false; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.h index 1880a2bf2..0c68e600b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.h @@ -45,6 +45,7 @@ public: private slots: void showSetupWizard(); + void exportSettings(); void wizardTerminated(); private: diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.cpp index 4e32ae91b..dbf303c88 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.cpp @@ -31,6 +31,7 @@ #include #include +#include using namespace Utils; @@ -523,7 +524,8 @@ void UAVObject::toXML(QXmlStreamWriter *xmlWriter) { xmlWriter->writeStartElement("object"); xmlWriter->writeAttribute("name", getName()); - xmlWriter->writeAttribute("id", QString("%1-%2").arg(getObjID(), 1, 16).toUpper().arg(getInstID())); + xmlWriter->writeAttribute("id", QString("%1").arg(getObjID(), 1, 16).toUpper()); + xmlWriter->writeAttribute("instance", QString("%1").arg(getInstID())); xmlWriter->writeStartElement("fields"); foreach(UAVObjectField * field, fields) { field->toXML(xmlWriter); @@ -534,17 +536,50 @@ void UAVObject::toXML(QXmlStreamWriter *xmlWriter) void UAVObject::fromXML(QXmlStreamReader *xmlReader) { - + // Check that we are the correct object by name, and that we are the same instance id + // but dont check id since we want to be able to be forward compatible. + Q_ASSERT(xmlReader->name() == "object"); + Q_ASSERT(xmlReader->attributes().value("name") == getName()); + Q_ASSERT(xmlReader->attributes().value("instance") == QString("%1").arg(getInstID())); + QXmlStreamReader::TokenType token = xmlReader->readNext(); + if(token == QXmlStreamReader::StartElement && xmlReader->name() == "fields") { + while (xmlReader->readNextStartElement()) { + if (xmlReader->name() == "field") { + QStringRef fieldName = xmlReader->attributes().value("name"); + if (fieldName != "") { + getField(*fieldName.string())->fromXML(xmlReader); + } + } + } + } } -void UAVObject::toJson(QJsonObject *jsonObject) +void UAVObject::toJson(QJsonObject &jsonObject) { - + jsonObject["name"] = getName(); + jsonObject["id"] = QString("%1").arg(getObjID(), 1, 16).toUpper(); + jsonObject["instance"] = (int)getInstID(); + QJsonArray jSonFields; + foreach(UAVObjectField * field, fields) { + QJsonObject jSonField; + field->toJson(jSonField); + jSonFields.append(jSonField); + } + jsonObject["fields"] = jSonFields; } -void UAVObject::fromJson(const QJsonObject *jsonObject) +void UAVObject::fromJson(const QJsonObject &jsonObject) { - + Q_ASSERT(jsonObject["name"].toString() == getName()); + Q_ASSERT(jsonObject["instance"].toInt() == (int)getInstID()); + QJsonArray jsonFields = jsonObject["fields"].toArray(); + for (int i = 0; i < jsonFields.size(); i++) { + QJsonObject jsonField = jsonFields.at(i).toObject(); + UAVObjectField *field = getField(jsonField["name"].toString()); + if (field) { + field->fromJson(jsonField); + } + } } /** diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h index 4929386e4..0bd0081a8 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h @@ -136,8 +136,8 @@ public: void toXML(QXmlStreamWriter *xmlWriter); void fromXML(QXmlStreamReader *xmlReader); - void toJson(QJsonObject *jsonObject); - void fromJson(const QJsonObject *jsonObject); + void toJson(QJsonObject &jsonObject); + void fromJson(const QJsonObject &jsonObject); void emitTransactionCompleted(bool success); void emitNewInstance(UAVObject *); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp index 20d8bf57e..a9eecb5c9 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp @@ -28,6 +28,7 @@ #include "uavobjectfield.h" #include #include +#include UAVObjectField::UAVObjectField(const QString & name, const QString & units, FieldType type, quint32 numElements, const QStringList & options, const QString &limits) { @@ -675,17 +676,46 @@ void UAVObjectField::toXML(QXmlStreamWriter *xmlWriter) void UAVObjectField::fromXML(QXmlStreamReader *xmlReader) { - + // Assert we have the correct field by name + Q_ASSERT(xmlReader->name() == "field"); + Q_ASSERT(xmlReader->attributes().value("name") == getName()); + // Read values, skip overflowing ones if any + while (xmlReader->readNextStartElement()) { + if (xmlReader->name() == "value") { + int index = getElementNames().indexOf(xmlReader->attributes().value("name").toString()); + if (index >= 0) { + setValue(xmlReader->readElementText(), index); + } + } + } } -void UAVObjectField::toJson(QJsonObject *jsonObject) +void UAVObjectField::toJson(QJsonObject &jsonObject) { - + jsonObject["name"] = getName(); + jsonObject["type"] = getTypeAsString(); + jsonObject["unit"] = getUnits(); + QJsonArray values; + for (unsigned int n = 0; n < numElements; ++n) { + QJsonObject value; + value["name"] = getElementNames().at(n); + value["value"] = QJsonValue::fromVariant(getValue(n)); + values.append(value); + } + jsonObject["values"] = values; } -void UAVObjectField::fromJson(const QJsonObject *jsonObject) +void UAVObjectField::fromJson(const QJsonObject &jsonObject) { - + Q_ASSERT(jsonObject["name"].toString() == getName()); + QJsonArray jsonValues = jsonObject["values"].toArray(); + for (int i = 0; i < jsonValues.size(); i++) { + QJsonObject jsonValue = jsonValues.at(i).toObject(); + int index = getElementNames().indexOf(jsonValue["name"].toString()); + if (index >= 0) { + setValue(((QJsonValue)jsonValue["value"]).toVariant(), index); + } + } } qint32 UAVObjectField::pack(quint8 *dataOut) diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h index 3044c497d..6142bc923 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h @@ -80,8 +80,8 @@ public: void toXML(QXmlStreamWriter *xmlWriter); void fromXML(QXmlStreamReader *xmlReader); - void toJson(QJsonObject *jsonObject); - void fromJson(const QJsonObject *jsonObject); + void toJson(QJsonObject &jsonObject); + void fromJson(const QJsonObject &jsonObject); bool isWithinLimits(QVariant var, quint32 index, int board = 0); QVariant getMaxLimit(quint32 index, int board = 0);