From ce6987ffabb73823105877f5fbb5e6c79607f215 Mon Sep 17 00:00:00 2001 From: elafargue Date: Tue, 26 Apr 2011 00:45:08 +0200 Subject: [PATCH] Added a menu entry in the Tools menu to erase all settings. Note: on CopterControl, this fails if all settings are at default value sometimes, due to something going on flight-side, not quite sure what. Please test & report how it is working on your board, be sure to save your settings somewhere first! --- .../src/plugins/config/configplugin.cpp | 101 +++++++++++++++++- .../src/plugins/config/configplugin.h | 20 ++++ .../src/plugins/uavtalk/uavtalkplugin.cpp | 21 ++-- 3 files changed, 133 insertions(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configplugin.cpp b/ground/openpilotgcs/src/plugins/config/configplugin.cpp index fa4c8977f..7caf5d994 100644 --- a/ground/openpilotgcs/src/plugins/config/configplugin.cpp +++ b/ground/openpilotgcs/src/plugins/config/configplugin.cpp @@ -28,8 +28,10 @@ #include "configgadgetfactory.h" #include #include +#include #include + ConfigPlugin::ConfigPlugin() { // Do nothing @@ -47,16 +49,113 @@ bool ConfigPlugin::initialize(const QStringList& args, QString *errMsg) cf = new ConfigGadgetFactory(this); addAutoReleasedObject(cf); + // Add Menu entry to erase all settings + Core::ActionManager* am = Core::ICore::instance()->actionManager(); + Core::ActionContainer* ac = am->actionContainer(Core::Constants::M_TOOLS); + + // Command to erase all settings from the board + cmd = am->registerAction(new QAction(this), + "ConfigPlugin.EraseAll", + QList() << + Core::Constants::C_GLOBAL_ID); + cmd->action()->setText("Erase all settings from board..."); + + ac->menu()->addSeparator(); + ac->appendGroup("Utilities"); + ac->addAction(cmd, "Utilities"); + + connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(eraseAllSettings())); + + // ********************* + // Listen to autopilot connection events + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + TelemetryManager* telMngr = pm->getObject(); + connect(telMngr, SIGNAL(connected()), this, SLOT(onAutopilotConnect())); + connect(telMngr, SIGNAL(disconnected()), this, SLOT(onAutopilotDisconnect())); + + // And check whether by any chance we are not already connected + if (telMngr->isConnected()) + onAutopilotConnect(); + return true; } void ConfigPlugin::extensionsInitialized() { - // Do nothing + cmd->action()->setEnabled(false); + } void ConfigPlugin::shutdown() { // Do nothing } + +/** + * Enable the menu entry when the autopilot connects + */ +void ConfigPlugin::onAutopilotConnect() +{ + cmd->action()->setEnabled(true); +} + +/** + * Enable the menu entry when the autopilot connects + */ +void ConfigPlugin::onAutopilotDisconnect() +{ + cmd->action()->setEnabled(false); +} + + +/** + * Erase all settings from the board + */ +void ConfigPlugin::eraseAllSettings() +{ + QMessageBox msgBox; + msgBox.setText(tr("Are you sure you want to erase all board settings?.")); + msgBox.setInformativeText(tr("All settings stored in your board flash will be deleted.")); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Ok); + if (msgBox.exec() != QMessageBox::Ok) + return; + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager * objMngr = pm->getObject(); + Q_ASSERT(objMngr); + ObjectPersistence* objper = dynamic_cast( objMngr->getObject(ObjectPersistence::NAME) ); + Q_ASSERT(objper); + connect(objper, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(eraseDone(UAVObject *))); + ObjectPersistence::DataFields data; + data.Operation = ObjectPersistence::OPERATION_DELETE; + data.Selection = ObjectPersistence::SELECTION_ALLSETTINGS; + objper->setData(data); + objper->updated(); + +} + +void ConfigPlugin::eraseDone(UAVObject * obj) +{ + QMessageBox msgBox; + ObjectPersistence* objper = dynamic_cast(sender()); + Q_ASSERT(obj->getName().compare("ObjectPersistence") == 0); + QString tmp = obj->getField("Operation")->getValue().toString(); + if (obj->getField("Operation")->getValue().toString().compare(QString("Delete")) == 0 ) { + return; + } + + disconnect(objper, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(eraseDone(UAVObject *))); + if (obj->getField("Operation")->getValue().toString().compare(QString("Completed")) == 0) { + msgBox.setText(tr("Settings erased.")); + msgBox.setInformativeText(tr("Please now power-cycle your board to complete reset.")); + } else { + msgBox.setText(tr("Error trying to erase settings.")); + msgBox.setInformativeText(tr("Power-cycle your board. Settings might be inconsistent.")); + } + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); +} + Q_EXPORT_PLUGIN(ConfigPlugin) diff --git a/ground/openpilotgcs/src/plugins/config/configplugin.h b/ground/openpilotgcs/src/plugins/config/configplugin.h index 2fc764dc7..6c074d57e 100644 --- a/ground/openpilotgcs/src/plugins/config/configplugin.h +++ b/ground/openpilotgcs/src/plugins/config/configplugin.h @@ -28,11 +28,22 @@ #define CONFIGPLUGIN_H #include +#include +#include +#include +#include "uavtalk/telemetrymanager.h" +#include "objectpersistence.h" + + +#include + class ConfigGadgetFactory; class ConfigPlugin : public ExtensionSystem::IPlugin { + Q_OBJECT + public: ConfigPlugin(); ~ConfigPlugin(); @@ -40,8 +51,17 @@ public: void extensionsInitialized(); bool initialize(const QStringList & arguments, QString * errorString); void shutdown(); + +private slots: + void eraseAllSettings(); + void onAutopilotConnect(); + void onAutopilotDisconnect(); + void eraseDone(UAVObject *); + private: ConfigGadgetFactory *cf; + Core::Command* cmd; + }; #endif // CONFIGPLUGIN_H diff --git a/ground/openpilotgcs/src/plugins/uavtalk/uavtalkplugin.cpp b/ground/openpilotgcs/src/plugins/uavtalk/uavtalkplugin.cpp index 35fc138b6..15d024f98 100644 --- a/ground/openpilotgcs/src/plugins/uavtalk/uavtalkplugin.cpp +++ b/ground/openpilotgcs/src/plugins/uavtalk/uavtalkplugin.cpp @@ -38,9 +38,21 @@ UAVTalkPlugin::~UAVTalkPlugin() { } - +/** + * Called once all the plugins which depend on us have been loaded + */ void UAVTalkPlugin::extensionsInitialized() { +} + +/** + * Called at startup, before any plugin which depends on us is initialized + */ +bool UAVTalkPlugin::initialize(const QStringList & arguments, QString * errorString) +{ + // Done + Q_UNUSED(arguments); + Q_UNUSED(errorString); // Get UAVObjectManager instance ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); objMngr = pm->getObject(); @@ -55,13 +67,6 @@ void UAVTalkPlugin::extensionsInitialized() this, SLOT(onDeviceConnect(QIODevice *))); QObject::connect(cm, SIGNAL(deviceAboutToDisconnect()), this, SLOT(onDeviceDisconnect())); -} - -bool UAVTalkPlugin::initialize(const QStringList & arguments, QString * errorString) -{ - // Done - Q_UNUSED(arguments); - Q_UNUSED(errorString); return true; }