diff --git a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc index e82523e8d9c4e57da8a66c567a9629ff13a293f2..8c78ea79d2b59374e540aa1d45ff3a2683ac677f 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 7ca1e0f03178184715e80d9b8f983e8e59f4286e..3ef5b36156a31e108af1e2d1fa9f4bc23c7ecd6a 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 fb6d02816ff6e32b23d09814d2867872cea807c2..33d7d111992fca141bc8381f122c9d42919cb828 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 81c7dd6231015e7f7c8cf185efe9892916228610..3e1c2e76d94850f8c80281471adadfb5f224c933 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 4cbe2b34f8abf6bcb6fb61a58970a2470b85631a..6dd4264dc43a8632d71c49d71212471833b6e7fc 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 0e5f1a4f045d072ddb0c4d9bbd216af7cff60c90..bc1607fe8157f04a4e92e7ecd5a4d7205261b263 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 4b742f90bfc407b42248f5f5e72c56f1d1f3ea2f..9b667ee4536d5fde0630bc3ab15fd71a58985381 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 254cf7b6446a76629f886196da00da7057126329..4edbcef77dc7e761dd36dc565aa9a484679762fd 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 f494826b6c8112846d14706d8bd2a7ddc8e47635..cbb41630d3eaf0e7b13d7ea7e154e1ca679d02f2 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 66e65e167b5b7a6b2962d09def7e27673562976c..a3fb27497d1a16af723d8cd47ccfef1b6794d345 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(); }