From 72cd5d1ca6b714c109e9e37bb4dec6b65e0d8de1 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 21 Feb 2017 12:48:56 -0800 Subject: [PATCH] Add support for FirmwarePluginFactory::supportedVehicleTypes --- .../APM/APMFirmwarePluginFactory.cc | 2 +- .../APM/APMFirmwarePluginFactory.h | 2 +- src/FirmwarePlugin/FirmwarePlugin.cc | 7 +++ src/FirmwarePlugin/FirmwarePlugin.h | 7 ++- src/FirmwarePlugin/FirmwarePluginManager.cc | 63 ++++++++++++++----- src/FirmwarePlugin/FirmwarePluginManager.h | 16 +++-- .../PX4/PX4FirmwarePluginFactory.cc | 2 +- .../PX4/PX4FirmwarePluginFactory.h | 2 +- src/MissionManager/MissionCommandTree.cc | 4 +- src/QmlControls/QGroundControlQmlGlobal.cc | 2 +- 10 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc index e82523e8d..8c78ea79d 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc @@ -24,7 +24,7 @@ APMFirmwarePluginFactory::APMFirmwarePluginFactory(void) } -QList APMFirmwarePluginFactory::knownFirmwareTypes(void) const +QList APMFirmwarePluginFactory::supportedFirmwareTypes(void) const { QList list; diff --git a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.h b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.h index 7ca1e0f03..3ef5b3615 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.h @@ -24,7 +24,7 @@ class APMFirmwarePluginFactory : public FirmwarePluginFactory public: APMFirmwarePluginFactory(void); - QList knownFirmwareTypes (void) const final; + QList supportedFirmwareTypes (void) const final; FirmwarePlugin* firmwarePluginForAutopilot (MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) final; private: diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index fb6d02816..33d7d1119 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -24,6 +24,13 @@ FirmwarePluginFactory::FirmwarePluginFactory(void) FirmwarePluginFactoryRegister::instance()->registerPluginFactory(this); } +QList FirmwarePluginFactory::supportedVehicleTypes(void) const +{ + QList vehicleTypes; + vehicleTypes << MAV_TYPE_FIXED_WING << MAV_TYPE_QUADROTOR << MAV_TYPE_VTOL_QUADROTOR << MAV_TYPE_GROUND_ROVER << MAV_TYPE_SUBMARINE; + return vehicleTypes; +} + FirmwarePluginFactoryRegister* FirmwarePluginFactoryRegister::instance(void) { if (!_instance) { diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index 81c7dd623..3e1c2e76d 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -265,8 +265,11 @@ public: /// @return Singleton FirmwarePlugin instance for the specified MAV_AUTOPILOT. virtual FirmwarePlugin* firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) = 0; - /// @return List of autopilot types this plugin supports. - virtual QList knownFirmwareTypes(void) const = 0; + /// @return List of firmware types this plugin supports. + virtual QList supportedFirmwareTypes(void) const = 0; + + /// @return List of vehicle types this plugin supports. + virtual QList supportedVehicleTypes(void) const; }; class FirmwarePluginFactoryRegister : public QObject diff --git a/src/FirmwarePlugin/FirmwarePluginManager.cc b/src/FirmwarePlugin/FirmwarePluginManager.cc index 4cbe2b34f..6dd4264dc 100644 --- a/src/FirmwarePlugin/FirmwarePluginManager.cc +++ b/src/FirmwarePlugin/FirmwarePluginManager.cc @@ -26,33 +26,68 @@ FirmwarePluginManager::~FirmwarePluginManager() delete _genericFirmwarePlugin; } -QList FirmwarePluginManager::knownFirmwareTypes(void) +QList FirmwarePluginManager::supportedFirmwareTypes(void) { - if (_knownFirmwareTypes.isEmpty()) { + if (_supportedFirmwareTypes.isEmpty()) { QList factoryList = FirmwarePluginFactoryRegister::instance()->pluginFactories(); for (int i = 0; i < factoryList.count(); i++) { - _knownFirmwareTypes.append(factoryList[i]->knownFirmwareTypes()); + _supportedFirmwareTypes.append(factoryList[i]->supportedFirmwareTypes()); } - _knownFirmwareTypes.append(MAV_AUTOPILOT_GENERIC); + _supportedFirmwareTypes.append(MAV_AUTOPILOT_GENERIC); } - return _knownFirmwareTypes; + return _supportedFirmwareTypes; } -FirmwarePlugin* FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) +QList FirmwarePluginManager::supportedVehicleTypes(MAV_AUTOPILOT firmwareType) +{ + QList vehicleTypes; + + FirmwarePluginFactory* factory = _findPluginFactory(firmwareType); + + if (factory) { + vehicleTypes = factory->supportedVehicleTypes(); + } else if (firmwareType == MAV_AUTOPILOT_GENERIC) { + vehicleTypes << MAV_TYPE_FIXED_WING << MAV_TYPE_QUADROTOR << MAV_TYPE_VTOL_QUADROTOR << MAV_TYPE_GROUND_ROVER << MAV_TYPE_SUBMARINE; + } else { + qWarning() << "Request for unknown firmware plugin factory" << firmwareType; + } + + return vehicleTypes; +} + +FirmwarePlugin* FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType) +{ + FirmwarePluginFactory* factory = _findPluginFactory(firmwareType); + FirmwarePlugin* plugin = NULL; + + if (factory) { + plugin = factory->firmwarePluginForAutopilot(firmwareType, vehicleType); + } else if (firmwareType != MAV_AUTOPILOT_GENERIC) { + qWarning() << "Request for unknown firmware plugin factory" << firmwareType; + } + + if (!plugin) { + // Default plugin fallback + if (!_genericFirmwarePlugin) { + _genericFirmwarePlugin = new FirmwarePlugin; + } + plugin = _genericFirmwarePlugin; + } + + return plugin; +} + +FirmwarePluginFactory* FirmwarePluginManager::_findPluginFactory(MAV_AUTOPILOT firmwareType) { - FirmwarePlugin* _plugin = NULL; QList factoryList = FirmwarePluginFactoryRegister::instance()->pluginFactories(); // Find the plugin which supports this vehicle for (int i=0; ifirmwarePluginForAutopilot(autopilotType, vehicleType))) { - return _plugin; + FirmwarePluginFactory* factory = factoryList[i]; + if (factory->supportedFirmwareTypes().contains(firmwareType)) { + return factory; } } - // Default plugin fallback - if (!_genericFirmwarePlugin) { - _genericFirmwarePlugin = new FirmwarePlugin; - } - return _genericFirmwarePlugin; + return NULL; } diff --git a/src/FirmwarePlugin/FirmwarePluginManager.h b/src/FirmwarePlugin/FirmwarePluginManager.h index 0e5f1a4f0..bc1607fe8 100644 --- a/src/FirmwarePlugin/FirmwarePluginManager.h +++ b/src/FirmwarePlugin/FirmwarePluginManager.h @@ -32,17 +32,23 @@ public: FirmwarePluginManager(QGCApplication* app); ~FirmwarePluginManager(); - QList knownFirmwareTypes(void); + /// Returns list of firmwares which are supported by the system + QList supportedFirmwareTypes(void); + + /// Returns the list of supported vehicle types for the specified firmware + QList supportedVehicleTypes(MAV_AUTOPILOT firmwareType); /// 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. + /// @param firmwareType Type of firmwware to return plugin for. + /// @param vehicleType Vehicle type to return plugin for. /// @return Singleton FirmwarePlugin instance for the specified MAV_AUTOPILOT. - FirmwarePlugin* firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType); + FirmwarePlugin* firmwarePluginForAutopilot(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType); private: + FirmwarePluginFactory* _findPluginFactory(MAV_AUTOPILOT firmwareType); + FirmwarePlugin* _genericFirmwarePlugin; - QList _knownFirmwareTypes; + QList _supportedFirmwareTypes; }; #endif diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.cc index 4b742f90b..9b667ee45 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.cc @@ -21,7 +21,7 @@ PX4FirmwarePluginFactory::PX4FirmwarePluginFactory(void) } -QList PX4FirmwarePluginFactory::knownFirmwareTypes(void) const +QList PX4FirmwarePluginFactory::supportedFirmwareTypes(void) const { QList list; diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.h b/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.h index 254cf7b64..4edbcef77 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePluginFactory.h @@ -21,7 +21,7 @@ class PX4FirmwarePluginFactory : public FirmwarePluginFactory public: PX4FirmwarePluginFactory(void); - QList knownFirmwareTypes (void) const final; + QList supportedFirmwareTypes (void) const final; FirmwarePlugin* firmwarePluginForAutopilot (MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) final; private: diff --git a/src/MissionManager/MissionCommandTree.cc b/src/MissionManager/MissionCommandTree.cc index f494826b6..cbb41630d 100644 --- a/src/MissionManager/MissionCommandTree.cc +++ b/src/MissionManager/MissionCommandTree.cc @@ -46,7 +46,7 @@ void MissionCommandTree::setToolbox(QGCToolbox* toolbox) } else { #endif // Load all levels of hierarchy - foreach (MAV_AUTOPILOT firmwareType, _toolbox->firmwarePluginManager()->knownFirmwareTypes()) { + foreach (MAV_AUTOPILOT firmwareType, _toolbox->firmwarePluginManager()->supportedFirmwareTypes()) { FirmwarePlugin* plugin = _toolbox->firmwarePluginManager()->firmwarePluginForAutopilot(firmwareType, MAV_TYPE_QUADROTOR); QList vehicleTypes; @@ -66,7 +66,7 @@ void MissionCommandTree::setToolbox(QGCToolbox* toolbox) MAV_AUTOPILOT MissionCommandTree::_baseFirmwareType(MAV_AUTOPILOT firmwareType) const { - if (qgcApp()->toolbox()->firmwarePluginManager()->knownFirmwareTypes().contains(firmwareType)) { + if (qgcApp()->toolbox()->firmwarePluginManager()->supportedFirmwareTypes().contains(firmwareType)) { return firmwareType; } else { return MAV_AUTOPILOT_GENERIC; diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 66e65e167..a3fb27497 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -197,7 +197,7 @@ void QGroundControlQmlGlobal::setBaseFontPointSize(qreal size) int QGroundControlQmlGlobal::supportedFirmwareCount() { - return _firmwarePluginManager->knownFirmwareTypes().count(); + return _firmwarePluginManager->supportedFirmwareTypes().count(); } -- 2.22.0