From e4e71de7488922021037a8302759896d97e90bbd Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 30 Oct 2015 15:38:21 -0700 Subject: [PATCH] Remove remaining singletons --- QGCApplication.pro | 2 - .../APM/ArduCopterFirmwarePlugin.cc | 5 +- .../APM/ArduCopterFirmwarePlugin.h | 7 - .../APM/ArduPlaneFirmwarePlugin.cc | 5 +- .../APM/ArduPlaneFirmwarePlugin.h | 7 - .../APM/ArduRoverFirmwarePlugin.cc | 5 +- .../APM/ArduRoverFirmwarePlugin.h | 7 - src/FirmwarePlugin/FirmwarePlugin.h | 6 +- src/FirmwarePlugin/FirmwarePluginManager.cc | 100 +++++++----- src/FirmwarePlugin/FirmwarePluginManager.h | 15 +- .../Generic/GenericFirmwarePlugin.cc | 7 - .../Generic/GenericFirmwarePlugin.h | 5 - src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc | 7 - src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h | 6 - src/QGCApplication.cc | 40 +---- src/QGCApplication.h | 2 - src/QGCSingleton.cc | 31 ---- src/QGCSingleton.h | 152 ------------------ src/qgcunittest/UnitTest.cc | 6 - 19 files changed, 84 insertions(+), 331 deletions(-) delete mode 100644 src/QGCSingleton.cc delete mode 100644 src/QGCSingleton.h diff --git a/QGCApplication.pro b/QGCApplication.pro index 1479ff4ea..3ec9e9cab 100644 --- a/QGCApplication.pro +++ b/QGCApplication.pro @@ -239,7 +239,6 @@ HEADERS += \ src/QGCPalette.h \ src/QGCQmlWidgetHolder.h \ src/QGCQuickWidget.h \ - src/QGCSingleton.h \ src/QGCTemporaryFile.h \ src/QGCToolbox.h \ src/QmlControls/CoordinateVector.h \ @@ -353,7 +352,6 @@ SOURCES += \ src/QGCPalette.cc \ src/QGCQmlWidgetHolder.cpp \ src/QGCQuickWidget.cc \ - src/QGCSingleton.cc \ src/QGCTemporaryFile.cc \ src/QGCToolbox.cc \ src/QGCGeo.cc \ diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc index 1cb1cdc77..d57d0a00c 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc @@ -27,9 +27,8 @@ #include "ArduCopterFirmwarePlugin.h" #include "Generic/GenericFirmwarePlugin.h" -IMPLEMENT_QGC_SINGLETON(ArduCopterFirmwarePlugin, ArduCopterFirmwarePlugin) - -APMCopterMode::APMCopterMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) +APMCopterMode::APMCopterMode(uint32_t mode, bool settable) : + APMCustomMode(mode, settable) { QMap enumToString; enumToString.insert(STABILIZE, "Stabilize"); diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h index 62a70c542..4f8cfa1b4 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h @@ -61,16 +61,9 @@ public: class ArduCopterFirmwarePlugin : public APMFirmwarePlugin { Q_OBJECT - - DECLARE_QGC_SINGLETON(ArduCopterFirmwarePlugin, ArduCopterFirmwarePlugin) public: - -protected: - /// All access to singleton is through instance() ArduCopterFirmwarePlugin(void); - -private: }; #endif diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc index ea6eaed67..340326288 100644 --- a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc @@ -27,9 +27,8 @@ #include "ArduPlaneFirmwarePlugin.h" #include "Generic/GenericFirmwarePlugin.h" -IMPLEMENT_QGC_SINGLETON(ArduPlaneFirmwarePlugin, ArduPlaneFirmwarePlugin) - -APMPlaneMode::APMPlaneMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) +APMPlaneMode::APMPlaneMode(uint32_t mode, bool settable) + : APMCustomMode(mode, settable) { QMap enumToString; enumToString.insert(MANUAL, "Manual"); diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h index 84913452e..ace48a0f9 100644 --- a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h @@ -59,16 +59,9 @@ public: class ArduPlaneFirmwarePlugin : public APMFirmwarePlugin { Q_OBJECT - - DECLARE_QGC_SINGLETON(ArduPlaneFirmwarePlugin, ArduPlaneFirmwarePlugin) public: - -protected: - /// All access to singleton is through instance() ArduPlaneFirmwarePlugin(void); - -private: }; #endif diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc index d620714d7..7fcd85946 100644 --- a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc @@ -27,9 +27,8 @@ #include "ArduRoverFirmwarePlugin.h" #include "Generic/GenericFirmwarePlugin.h" -IMPLEMENT_QGC_SINGLETON(ArduRoverFirmwarePlugin, ArduRoverFirmwarePlugin) - -APMRoverMode::APMRoverMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) +APMRoverMode::APMRoverMode(uint32_t mode, bool settable) + : APMCustomMode(mode, settable) { QMap enumToString; enumToString.insert(MANUAL, "Manual"); diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h index b50971cb8..58a1a288c 100644 --- a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h @@ -59,16 +59,9 @@ public: class ArduRoverFirmwarePlugin : public APMFirmwarePlugin { Q_OBJECT - - DECLARE_QGC_SINGLETON(ArduRoverFirmwarePlugin, ArduRoverFirmwarePlugin) public: - -protected: - /// All access to singleton is through instance() ArduRoverFirmwarePlugin(void); - -private: }; #endif diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index df226d9f4..d1d27199f 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -27,7 +27,6 @@ #ifndef FirmwarePlugin_H #define FirmwarePlugin_H -#include "QGCSingleton.h" #include "QGCMAVLink.h" #include "VehicleComponent.h" #include "AutoPilotPlugin.h" @@ -46,7 +45,7 @@ class Vehicle; /// in the base class supports mavlink generic firmware. Override the base clase virtuals /// to create you firmware specific plugin. -class FirmwarePlugin : public QGCSingleton +class FirmwarePlugin : public QObject { Q_OBJECT @@ -110,9 +109,6 @@ public: /// Adds the parameter meta data to the Fact virtual void addMetaDataToFact(Fact* fact) = 0; - -protected: - FirmwarePlugin(void) { }; }; #endif diff --git a/src/FirmwarePlugin/FirmwarePluginManager.cc b/src/FirmwarePlugin/FirmwarePluginManager.cc index aec991eaa..3cd337323 100644 --- a/src/FirmwarePlugin/FirmwarePluginManager.cc +++ b/src/FirmwarePlugin/FirmwarePluginManager.cc @@ -1,5 +1,5 @@ /*===================================================================== - + QGroundControl Open Source Ground Control Station (c) 2009 - 2014 QGROUNDCONTROL PROJECT @@ -31,51 +31,67 @@ #include "APM/ArduRoverFirmwarePlugin.h" #include "PX4/PX4FirmwarePlugin.h" +FirmwarePluginManager::FirmwarePluginManager(QGCApplication* app) + : QGCTool(app) + , _arduCopterFirmwarePlugin(NULL) + , _arduPlaneFirmwarePlugin(NULL) + , _arduRoverFirmwarePlugin(NULL) + , _genericFirmwarePlugin(NULL) + , _px4FirmwarePlugin(NULL) +{ + +} + +FirmwarePluginManager::~FirmwarePluginManager() +{ + delete _arduCopterFirmwarePlugin; + delete _arduPlaneFirmwarePlugin; + delete _arduRoverFirmwarePlugin; + delete _genericFirmwarePlugin; + delete _px4FirmwarePlugin; +} + FirmwarePlugin* FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) { switch (autopilotType) { - case MAV_AUTOPILOT_ARDUPILOTMEGA: - switch (vehicleType) { - case MAV_TYPE_QUADROTOR: - case MAV_TYPE_HEXAROTOR: - case MAV_TYPE_OCTOROTOR: - case MAV_TYPE_TRICOPTER: - case MAV_TYPE_COAXIAL: - case MAV_TYPE_HELICOPTER: - return ArduCopterFirmwarePlugin::instance(); - break; - case MAV_TYPE_FIXED_WING: - return ArduPlaneFirmwarePlugin::instance(); - break; - case MAV_TYPE_GROUND_ROVER: - case MAV_TYPE_SURFACE_BOAT: - case MAV_TYPE_SUBMARINE: - return ArduRoverFirmwarePlugin::instance(); - break; - case MAV_TYPE_GENERIC: - case MAV_TYPE_ANTENNA_TRACKER: - case MAV_TYPE_GCS: - case MAV_TYPE_AIRSHIP: - case MAV_TYPE_FREE_BALLOON: - case MAV_TYPE_ROCKET: - case MAV_TYPE_FLAPPING_WING: - case MAV_TYPE_KITE: - case MAV_TYPE_ONBOARD_CONTROLLER: - case MAV_TYPE_VTOL_DUOROTOR: - case MAV_TYPE_VTOL_QUADROTOR: - case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_RESERVED2: - case MAV_TYPE_VTOL_RESERVED3: - case MAV_TYPE_VTOL_RESERVED4: - case MAV_TYPE_VTOL_RESERVED5: - case MAV_TYPE_GIMBAL: - default: - return GenericFirmwarePlugin::instance(); - break; + case MAV_AUTOPILOT_ARDUPILOTMEGA: + switch (vehicleType) { + case MAV_TYPE_QUADROTOR: + case MAV_TYPE_HEXAROTOR: + case MAV_TYPE_OCTOROTOR: + case MAV_TYPE_TRICOPTER: + case MAV_TYPE_COAXIAL: + case MAV_TYPE_HELICOPTER: + if (!_arduCopterFirmwarePlugin) { + _arduCopterFirmwarePlugin = new ArduCopterFirmwarePlugin; + } + return _arduCopterFirmwarePlugin; + case MAV_TYPE_FIXED_WING: + if (!_arduPlaneFirmwarePlugin) { + _arduPlaneFirmwarePlugin = new ArduPlaneFirmwarePlugin; } - case MAV_AUTOPILOT_PX4: - return PX4FirmwarePlugin::instance(); + return _arduPlaneFirmwarePlugin; + case MAV_TYPE_GROUND_ROVER: + case MAV_TYPE_SURFACE_BOAT: + case MAV_TYPE_SUBMARINE: + if (!_arduRoverFirmwarePlugin) { + _arduRoverFirmwarePlugin = new ArduRoverFirmwarePlugin; + } + return _arduRoverFirmwarePlugin; default: - return GenericFirmwarePlugin::instance(); + break; + } + case MAV_AUTOPILOT_PX4: + if (!_px4FirmwarePlugin) { + _px4FirmwarePlugin = new PX4FirmwarePlugin; + } + return _px4FirmwarePlugin; + default: + break; + } + + if (!_genericFirmwarePlugin) { + _genericFirmwarePlugin = new GenericFirmwarePlugin; } + return _genericFirmwarePlugin; } diff --git a/src/FirmwarePlugin/FirmwarePluginManager.h b/src/FirmwarePlugin/FirmwarePluginManager.h index 84f32ca95..6a6550177 100644 --- a/src/FirmwarePlugin/FirmwarePluginManager.h +++ b/src/FirmwarePlugin/FirmwarePluginManager.h @@ -34,6 +34,11 @@ #include "QGCToolbox.h" class QGCApplication; +class ArduCopterFirmwarePlugin; +class ArduPlaneFirmwarePlugin; +class ArduRoverFirmwarePlugin; +class PX4FirmwarePlugin; +class GenericFirmwarePlugin; /// FirmwarePluginManager is a singleton which is used to return the correct FirmwarePlugin for a MAV_AUTOPILOT type. @@ -42,13 +47,21 @@ class FirmwarePluginManager : public QGCTool Q_OBJECT public: - FirmwarePluginManager(QGCApplication* app) : QGCTool(app) { } + FirmwarePluginManager(QGCApplication* app); + ~FirmwarePluginManager(); /// Returns appropriate plugin for autopilot type. /// @param autopilotType Type of autopilot to return plugin for. /// @param vehicleType Vehicle type of autopilot to return plugin for. /// @return Singleton FirmwarePlugin instance for the specified MAV_AUTOPILOT. FirmwarePlugin* firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType); + +private: + ArduCopterFirmwarePlugin* _arduCopterFirmwarePlugin; + ArduPlaneFirmwarePlugin* _arduPlaneFirmwarePlugin; + ArduRoverFirmwarePlugin* _arduRoverFirmwarePlugin; + GenericFirmwarePlugin* _genericFirmwarePlugin; + PX4FirmwarePlugin* _px4FirmwarePlugin; }; #endif diff --git a/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.cc b/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.cc index a14c949c5..6e748b911 100644 --- a/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.cc +++ b/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.cc @@ -29,13 +29,6 @@ #include -IMPLEMENT_QGC_SINGLETON(GenericFirmwarePlugin, FirmwarePlugin) - -GenericFirmwarePlugin::GenericFirmwarePlugin(void) -{ - -} - QList GenericFirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle) { Q_UNUSED(vehicle); diff --git a/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.h b/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.h index 6d6f21041..5eaa175c7 100644 --- a/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.h +++ b/src/FirmwarePlugin/Generic/GenericFirmwarePlugin.h @@ -32,8 +32,6 @@ class GenericFirmwarePlugin : public FirmwarePlugin { Q_OBJECT - - DECLARE_QGC_SINGLETON(GenericFirmwarePlugin, FirmwarePlugin) public: // Overrides from FirmwarePlugin @@ -49,9 +47,6 @@ public: virtual bool sendHomePositionToVehicle(void); virtual void addMetaDataToFact(Fact* fact); virtual QString getDefaultComponentIdParam(void) const { return QString(); } - -private: - GenericFirmwarePlugin(void); }; #endif diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index 44277c03c..43b714cd3 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -29,8 +29,6 @@ #include -IMPLEMENT_QGC_SINGLETON(PX4FirmwarePlugin, FirmwarePlugin) - enum PX4_CUSTOM_MAIN_MODE { PX4_CUSTOM_MAIN_MODE_MANUAL = 1, PX4_CUSTOM_MAIN_MODE_ALTCTL, @@ -88,11 +86,6 @@ static const struct Modes2Name rgModes2Name[] = { }; -PX4FirmwarePlugin::PX4FirmwarePlugin(void) -{ - -} - QList PX4FirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle) { Q_UNUSED(vehicle); diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h index 0c67ef459..216d53657 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h @@ -34,11 +34,8 @@ class PX4FirmwarePlugin : public FirmwarePlugin { Q_OBJECT - DECLARE_QGC_SINGLETON(PX4FirmwarePlugin, FirmwarePlugin) - public: // Overrides from FirmwarePlugin - virtual bool isCapable(FirmwareCapabilities capabilities); virtual QList componentsForVehicle(AutoPilotPlugin* vehicle); virtual QStringList flightModes(void); @@ -52,9 +49,6 @@ public: virtual QString getDefaultComponentIdParam(void) const { return QString("SYS_AUTOSTART"); } private: - /// All access to singleton is through AutoPilotPluginManager::instance - PX4FirmwarePlugin(void); - PX4ParameterMetaData _parameterMetaData; }; diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index beca8faab..899327f93 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -49,7 +49,6 @@ #include "QGCMessageBox.h" #include "MainWindow.h" #include "UDPLink.h" -#include "QGCSingleton.h" #include "LinkManager.h" #include "HomePositionManager.h" #include "UASMessageHandler.h" @@ -322,7 +321,11 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) QGCApplication::~QGCApplication() { - _destroySingletons(); + MainWindow* mainWindow = MainWindow::instance(); + if (mainWindow) { + delete mainWindow; + } + shutdownVideoStreaming(); delete _toolbox; } @@ -433,8 +436,6 @@ bool QGCApplication::_initForNormalAppBoot(void) { QSettings settings; - _createSingletons(); - #ifdef __mobile__ _styleIsDark = false; #else @@ -573,37 +574,6 @@ QGCApplication* qgcApp(void) return QGCApplication::_app; } -/// @brief We create all the non-ui based singletons here instead of allowing them to be created randomly -/// by calls to instance. The reason being that depending on boot sequence the singleton may end -/// up being creating on something other than the main thread. -void QGCApplication::_createSingletons(void) -{ - // No dependencies - FirmwarePlugin* firmwarePlugin = GenericFirmwarePlugin::_createSingleton(); - Q_UNUSED(firmwarePlugin); - Q_ASSERT(firmwarePlugin); - - // No dependencies - firmwarePlugin = PX4FirmwarePlugin::_createSingleton(); - firmwarePlugin = ArduCopterFirmwarePlugin::_createSingleton(); - firmwarePlugin = ArduPlaneFirmwarePlugin::_createSingleton(); - firmwarePlugin = ArduRoverFirmwarePlugin::_createSingleton(); -} - -void QGCApplication::_destroySingletons(void) -{ - MainWindow* mainWindow = MainWindow::instance(); - if (mainWindow) { - delete mainWindow; - } - - GenericFirmwarePlugin::_deleteSingleton(); - PX4FirmwarePlugin::_deleteSingleton(); - ArduCopterFirmwarePlugin::_deleteSingleton(); - ArduPlaneFirmwarePlugin::_deleteSingleton(); - ArduRoverFirmwarePlugin::_deleteSingleton(); -} - void QGCApplication::informationMessageBoxOnMainThread(const QString& title, const QString& msg) { QGCMessageBox::information(title, msg); diff --git a/src/QGCApplication.h b/src/QGCApplication.h index 08fb609cf..084950bb9 100644 --- a/src/QGCApplication.h +++ b/src/QGCApplication.h @@ -168,8 +168,6 @@ private slots: void _missingParamsDisplay(void); private: - void _createSingletons(void); - void _destroySingletons(void); void _loadCurrentStyle(void); static const char* _settingsVersionKey; ///< Settings key which hold settings version diff --git a/src/QGCSingleton.cc b/src/QGCSingleton.cc deleted file mode 100644 index 24da38cdf..000000000 --- a/src/QGCSingleton.cc +++ /dev/null @@ -1,31 +0,0 @@ -/*===================================================================== - - QGroundControl Open Source Ground Control Station - - (c) 2009 - 2015 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 . - - ======================================================================*/ - -/// @file -/// @brief Base class for global singletons -/// -/// @author Don Gagne - -#include "QGCSingleton.h" -#include "QGCApplication.h" - diff --git a/src/QGCSingleton.h b/src/QGCSingleton.h deleted file mode 100644 index 2f4ea01ff..000000000 --- a/src/QGCSingleton.h +++ /dev/null @@ -1,152 +0,0 @@ -/*===================================================================== - - QGroundControl Open Source Ground Control Station - - (c) 2009 - 2015 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 . - - ======================================================================*/ - -/// @file -/// @author Don Gagne - -#ifndef QGCSINGLETON_H -#define QGCSINGLETON_H - -#include -#include - -/// @def DECLARE_QGC_SINGLETON -/// Include this macro in your Derived Class definition -/// @param className Derived Class name -/// @param interfaceName If your class is accessed through an interface specify that, if not specify Derived class name. -#define DECLARE_QGC_SINGLETON(className, interfaceName) \ - public: \ - static interfaceName* instance(bool nullOk = false); \ - static void setMockInstance(interfaceName* mock); \ - static interfaceName* _createSingleton(void); \ - static void _deleteSingleton(void); \ - private: \ - static interfaceName* _instance; \ - static interfaceName* _mockInstance; \ - static interfaceName* _realInstance; \ - -/// @def IMPLEMENT_QGC_SINGLETON -/// Include this macro in your Derived Class implementation -/// @param className Derived Class name -/// @param interfaceName If your class is accessed through an interface specify that, if not specify Derived class name. -#define IMPLEMENT_QGC_SINGLETON(className, interfaceName) \ - interfaceName* className::_instance = NULL; \ - interfaceName* className::_mockInstance = NULL; \ - interfaceName* className::_realInstance = NULL; \ - \ - interfaceName* className::_createSingleton(void) \ - { \ - Q_ASSERT(_instance == NULL); \ - _instance = new className; \ - return _instance; \ - } \ - \ - void className::_deleteSingleton(void) \ - { \ - if (className::_instance) { \ - className* instance = qobject_cast(className::_instance); \ - Q_ASSERT_X(instance != NULL, "QGCSingleton", "If you hit this assert you may have forgotten to clear a Mock instance"); \ - className::_instance = NULL; \ - delete instance; \ - } \ - } \ - \ - interfaceName* className::instance(bool nullOk) \ - { \ - if (!nullOk) { \ - Q_ASSERT_X(_instance, "QGCSingleton", "Request for singleton that is NULL. If you hit this, then you have likely run into a startup or shutdown sequence bug (possibly intermittent)."); \ - } \ - return _instance; \ - } \ - \ - void className::setMockInstance(interfaceName* mock) \ - { \ - if (mock) { \ - Q_ASSERT(_instance); \ - Q_ASSERT(!_realInstance); \ - \ - _realInstance = _instance; \ - _instance = dynamic_cast(mock); \ - Q_ASSERT(_instance); \ - _mockInstance = mock; \ - } else { \ - Q_ASSERT(_instance); \ - Q_ASSERT(_realInstance); \ - \ - _instance = _realInstance; \ - _realInstance = NULL; \ - _mockInstance = NULL; \ - } \ - } - -class QGCApplication; -class UnitTest; - -/// This is the base class for all app global singletons -/// -/// All global singletons are created/destroyed at boot time by QGCApplication::_createSingletons and destroyed by QGC::Application::_destroySingletons. -/// This is done in order to make sure they are all created on the main thread. As such no other code other than Unit Test -/// code has access to the constructor/destructor. QGCSingleton supports replacing singletons with a mock implementation. -/// In this case your object must derive from an interface which in turn derives from QGCSingleton. Youu can then use -/// the setMock method to add and remove you mock implementation. See HomePositionManager example usage. In order to provide the -/// appropriate methods to make all this work you need to use the DECLARE_QGC_SINGLETON and IMPLEMENT_QGC_SINGLETON -/// macros as follows: -/// @code{.unparsed} -/// // Header file -/// -/// class MySingleton : public QGCSingleton { -/// Q_OBJECT -/// -/// DECLARE_QGC_SINGLETON(MySingleton, MySingleton) -/// -/// ... -/// -/// private: -/// // Constructor/Desctructor private since all access is through the singleton methods -/// MySingleton(QObject* parent == NULL); -/// ~MySingleton(); -/// -/// ... -/// } -/// -/// // Code file -/// -/// IMPLEMENT_QGC_SINGLETON(MySingleton, MySingleton) -/// -/// MySingleton::MySingleton(QObject* parent) : -/// QGCSigleton(parent) -/// { -/// } -/// -/// // Other class methods... -/// -/// @endcode -/// The example above does not use an inteface so the second parameter to the macro is the class name as well. - -class QGCSingleton : public QObject -{ - Q_OBJECT - -}; - -#endif diff --git a/src/qgcunittest/UnitTest.cc b/src/qgcunittest/UnitTest.cc index 8d749c5ca..eb93e7e7b 100644 --- a/src/qgcunittest/UnitTest.cc +++ b/src/qgcunittest/UnitTest.cc @@ -124,10 +124,6 @@ void UnitTest::init(void) _expectMissedFileDialog = false; _expectMissedMessageBox = false; - // Each test gets a clean global state - qgcApp()->_destroySingletons(); - qgcApp()->_createSingletons(); - MAVLinkProtocol::deleteTempLogFiles(); } @@ -152,8 +148,6 @@ void UnitTest::cleanup(void) QEXPECT_FAIL("", "Expecting failure due internal testing", Continue); } QCOMPARE(_missedFileDialogCount, 0); - - qgcApp()->_destroySingletons(); } void UnitTest::setExpectedMessageBox(QMessageBox::StandardButton response) -- 2.22.0