From 62550909181d5ece6bfb247af86230c8b966f62e Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Wed, 26 Nov 2014 09:26:15 -0800 Subject: [PATCH] Commit --- qgroundcontrol.pro | 3 +- src/AutoPilotPlugins/AutoPilotPlugin.h | 6 +- ...lotPlugin.cc => AutoPilotPluginManager.cc} | 31 +++++---- src/AutoPilotPlugins/AutoPilotPluginManager.h | 63 +++++++++++++++++++ .../Generic/GenericAutoPilotPlugin.cc | 3 +- .../Generic/GenericAutoPilotPlugin.h | 2 +- .../PX4/PX4AutoPilotPlugin.cc | 6 +- src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h | 2 +- 8 files changed, 88 insertions(+), 28 deletions(-) rename src/AutoPilotPlugins/{AutoPilotPlugin.cc => AutoPilotPluginManager.cc} (60%) create mode 100644 src/AutoPilotPlugins/AutoPilotPluginManager.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 57c765c64..75b92da2c 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -702,6 +702,7 @@ HEADERS+= \ src/VehicleSetup/VehicleSetupButton.h \ src/VehicleSetup/VehicleComponentButton.h \ src/VehicleSetup/VehicleComponent.h \ + src/AutoPilotPlugins/AutoPilotPluginManager.h \ src/AutoPilotPlugins/AutoPilotPlugin.h \ src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h \ src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h \ @@ -716,7 +717,7 @@ SOURCES += \ src/VehicleSetup/SummaryPage.cc \ src/VehicleSetup/ParameterEditor.cc \ src/VehicleSetup/VehicleComponent.cc \ - src/AutoPilotPlugins/AutoPilotPlugin.cc \ + src/AutoPilotPlugins/AutoPilotPluginManager.cc \ src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc \ src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc \ src/AutoPilotPlugins/PX4/PX4Component.cc \ diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.h b/src/AutoPilotPlugins/AutoPilotPlugin.h index 9e25a058b..1c7532ff5 100644 --- a/src/AutoPilotPlugins/AutoPilotPlugin.h +++ b/src/AutoPilotPlugins/AutoPilotPlugin.h @@ -43,10 +43,6 @@ class AutoPilotPlugin : public QObject Q_OBJECT public: - /// @brief Returns the singleton AutoPilot instance for the specified auto pilot type. - /// @param autopilotType Specified using the MAV_AUTOPILOT_* values. - static AutoPilotPlugin* getInstanceForAutoPilotPlugin(int autopilotType); - /// @brief Returns the list of VehicleComponent objects associated with the AutoPilot. virtual QList getVehicleComponents(UASInterface* uas) const = 0; @@ -63,7 +59,7 @@ public: protected: // All access to AutoPilotPugin objects is through getInstanceForAutoPilotPlugin - AutoPilotPlugin(void); + AutoPilotPlugin(QObject* parent = NULL) : QObject(parent) { } }; #endif diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.cc b/src/AutoPilotPlugins/AutoPilotPluginManager.cc similarity index 60% rename from src/AutoPilotPlugins/AutoPilotPlugin.cc rename to src/AutoPilotPlugins/AutoPilotPluginManager.cc index 3ff4efd52..3b4397475 100644 --- a/src/AutoPilotPlugins/AutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/AutoPilotPluginManager.cc @@ -24,33 +24,30 @@ /// @file /// @author Don Gagne -#include "AutoPilotPlugin.h" +#include "AutoPilotPluginManager.h" #include "PX4/PX4AutoPilotPlugin.h" #include "Generic/GenericAutoPilotPlugin.h" -static AutoPilotPlugin* PX4_AutoPilot = NULL; ///< Singleton plugin for MAV_AUTOPILOT_PX4 -static AutoPilotPlugin* Generic_AutoPilot = NULL; ///< Singleton plugin for AutoPilots which do not have a specifically implemented plugin - -AutoPilotPlugin::AutoPilotPlugin(void) +AutoPilotPluginManager::AutoPilotPluginManager(QObject* parent) : + QObject(parent) { - + // All plugins are constructed here so that they end up on the correct thread + _pluginMap[MAV_AUTOPILOT_PX4] = new PX4AutoPilotPlugin(this); + Q_ASSERT(_pluginMap.contains(MAV_AUTOPILOT_PX4)); + + _pluginMap[MAV_AUTOPILOT_GENERIC] = new GenericAutoPilotPlugin(this); + Q_ASSERT(_pluginMap.contains(MAV_AUTOPILOT_GENERIC)); } -AutoPilotPlugin* AutoPilotPlugin::getInstanceForAutoPilotPlugin(int autopilotType) +AutoPilotPlugin* AutoPilotPluginManager::getInstanceForAutoPilotPlugin(int autopilotType) { switch (autopilotType) { case MAV_AUTOPILOT_PX4: - if (PX4_AutoPilot == NULL) { - PX4_AutoPilot = new PX4AutoPilotPlugin; - } - Q_ASSERT(PX4_AutoPilot); - return PX4_AutoPilot; + Q_ASSERT(_pluginMap.contains(MAV_AUTOPILOT_PX4)); + return _pluginMap[MAV_AUTOPILOT_PX4]; default: - if (Generic_AutoPilot == NULL) { - Generic_AutoPilot = new GenericAutoPilotPlugin; - } - Q_ASSERT(Generic_AutoPilot); - return Generic_AutoPilot; + Q_ASSERT(_pluginMap.contains(MAV_AUTOPILOT_GENERIC)); + return _pluginMap[MAV_AUTOPILOT_GENERIC]; } } diff --git a/src/AutoPilotPlugins/AutoPilotPluginManager.h b/src/AutoPilotPlugins/AutoPilotPluginManager.h new file mode 100644 index 000000000..d27960137 --- /dev/null +++ b/src/AutoPilotPlugins/AutoPilotPluginManager.h @@ -0,0 +1,63 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#ifndef AUTOPILOTPLUGINMANAGER_H +#define AUTOPILOTPLUGINMANAGER_H + +#include +#include +#include + +#include "UASInterface.h" +#include "VehicleComponent.h" +#include "QGCApplication.h" +#include "AutoPilotPlugin.h" + +/// @file +/// @brief The AutoPilotPlugin manager is a singleton which maintains the list of AutoPilotPlugin objects. +/// +/// @author Don Gagne + +class AutoPilotPluginManager : public QObject +{ + Q_OBJECT + +public: + + /// @brief Returns the singleton AutoPilot instance for the specified auto pilot type. + /// @param autopilotType Specified using the MAV_AUTOPILOT_* values. + AutoPilotPlugin* getInstanceForAutoPilotPlugin(int autopilotType); + +private: + /// @brief Only QGCQpplication is allowed to call constructor. All access to singleton is through + /// QGCApplication::singletonAutoPilotPluginManager. + AutoPilotPluginManager(QObject* parent = NULL); + + /// @brief Only QGCQpplication is allowed to call constructor. All access to singleton is through + /// QGCApplication::singletonAutoPilotPluginManager. + friend class QGCApplication; + + QMap _pluginMap; +}; + +#endif diff --git a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc index b01a3094d..65f2ada55 100644 --- a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.cc @@ -26,7 +26,8 @@ #include "GenericAutoPilotPlugin.h" -GenericAutoPilotPlugin::GenericAutoPilotPlugin(void) +GenericAutoPilotPlugin::GenericAutoPilotPlugin(QObject* parent) : + AutoPilotPlugin(parent) { } diff --git a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h index 394570ce4..1e16d0b8c 100644 --- a/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h +++ b/src/AutoPilotPlugins/Generic/GenericAutoPilotPlugin.h @@ -36,7 +36,7 @@ class GenericAutoPilotPlugin : public AutoPilotPlugin Q_OBJECT public: - GenericAutoPilotPlugin(void); + GenericAutoPilotPlugin(QObject* parent = NULL); virtual QList getVehicleComponents(UASInterface* uas) const ; virtual QList getModes(void) const; diff --git a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc index 566455a42..14885b036 100644 --- a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc @@ -26,6 +26,7 @@ #include "RadioComponent.h" #include "SensorsComponent.h" #include "FlightModesComponent.h" +#include "AutoPilotPluginManager.h" /// @file /// @brief This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_PX4 type. @@ -61,7 +62,8 @@ union px4_custom_mode { float data_float; }; -PX4AutoPilotPlugin::PX4AutoPilotPlugin(void) +PX4AutoPilotPlugin::PX4AutoPilotPlugin(QObject* parent) : + AutoPilotPlugin(parent) { } @@ -165,7 +167,7 @@ QString PX4AutoPilotPlugin::getShortModeText(uint8_t baseMode, uint32_t customMo mode = "|OFFBOARD"; } } else { - mode = AutoPilotPlugin::getInstanceForAutoPilotPlugin(MAV_AUTOPILOT_GENERIC)->getShortModeText(baseMode, customMode); + mode = qgcApp()->singletonAutoPilotPluginManager()->getInstanceForAutoPilotPlugin(MAV_AUTOPILOT_GENERIC)->getShortModeText(baseMode, customMode); } return mode; diff --git a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h index 2940c9aa1..df7ae18be 100644 --- a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h +++ b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h @@ -35,7 +35,7 @@ class PX4AutoPilotPlugin : public AutoPilotPlugin Q_OBJECT public: - PX4AutoPilotPlugin(void); + PX4AutoPilotPlugin(QObject* parent); virtual QList getVehicleComponents(UASInterface* uas) const ; virtual QList getModes(void) const; -- 2.22.0