QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FirmwarePluginManager.cc
Go to the documentation of this file.
2#include "FirmwarePlugin.h"
5
6#include <QtCore/QGlobalStatic>
7
8QGC_LOGGING_CATEGORY(FirmwarePluginManagerLog, "FirmwarePlugin.FirmwarePluginManager");
9
10Q_GLOBAL_STATIC(FirmwarePluginManager, _firmwarePluginManagerInstance);
11
13 : QObject(parent)
14{
15 // qCDebug(FirmwarePluginManagerLog) << Q_FUNC_INFO << this;
16}
17
19{
20 // qCDebug(FirmwarePluginManagerLog) << Q_FUNC_INFO << this;
21}
22
24{
25 return _firmwarePluginManagerInstance();
26}
27
28QList<QGCMAVLink::FirmwareClass_t> FirmwarePluginManager::supportedFirmwareClasses()
29{
30 if (_supportedFirmwareClasses.isEmpty()) {
31 const QList<FirmwarePluginFactory*> factoryList = FirmwarePluginFactoryRegister::instance()->pluginFactories();
32 for (const FirmwarePluginFactory *factory: factoryList) {
33 _supportedFirmwareClasses.append(factory->supportedFirmwareClasses());
34 }
35 _supportedFirmwareClasses.append(QGCMAVLink::FirmwareClassGeneric);
36 }
37
38 return _supportedFirmwareClasses;
39}
40
42{
43 QList<QGCMAVLink::VehicleClass_t> vehicleClasses;
44 const FirmwarePluginFactory *const factory = _findPluginFactory(firmwareClass);
45
46 if (factory) {
47 vehicleClasses = factory->supportedVehicleClasses();
48 } else if (firmwareClass == QGCMAVLink::FirmwareClassGeneric) {
49 // Generic supports all specific vehicle class
50 vehicleClasses = QGCMAVLink::allVehicleClasses();
51 (void) vehicleClasses.removeOne(QGCMAVLink::VehicleClassGeneric);
52 } else {
53 qCWarning(FirmwarePluginManagerLog) << "Request for unknown firmware plugin factory" << firmwareClass;
54 }
55
56 return vehicleClasses;
57}
58
59FirmwarePlugin *FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType)
60{
61 FirmwarePluginFactory *const factory = _findPluginFactory(firmwareType);
62 FirmwarePlugin *plugin = nullptr;
63
64 if (factory) {
65 plugin = factory->firmwarePluginForAutopilot(firmwareType, vehicleType);
66 }
67
68 if (!plugin) {
69 if (!_genericFirmwarePlugin) {
70 _genericFirmwarePlugin = new FirmwarePlugin(this);
71 }
72 plugin = _genericFirmwarePlugin;
73 }
74
75 return plugin;
76}
77
78FirmwarePluginFactory *FirmwarePluginManager::_findPluginFactory(QGCMAVLink::FirmwareClass_t firmwareClass)
79{
80 const QList<FirmwarePluginFactory*> factoryList = FirmwarePluginFactoryRegister::instance()->pluginFactories();
81
82 for (FirmwarePluginFactory *factory: factoryList) {
83 if (factory->supportedFirmwareClasses().contains(firmwareClass)) {
84 return factory;
85 }
86 }
87
88 return nullptr;
89}
Q_GLOBAL_STATIC(FirmwarePluginManager, _firmwarePluginManagerInstance)
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static FirmwarePluginFactoryRegister * instance()
QList< FirmwarePluginFactory * > pluginFactories() const
virtual QList< QGCMAVLink::VehicleClass_t > supportedVehicleClasses() const
virtual FirmwarePlugin * firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType)=0
FirmwarePluginManager is a singleton which is used to return the correct FirmwarePlugin for a MAV_AUT...
~FirmwarePluginManager()
Destructor for the FirmwarePluginManager class.
FirmwarePlugin * firmwarePluginForAutopilot(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType)
FirmwarePluginManager(QObject *parent=nullptr)
QList< QGCMAVLink::FirmwareClass_t > supportedFirmwareClasses()
Returns list of firmwares which are supported by the system.
QList< QGCMAVLink::VehicleClass_t > supportedVehicleClasses(QGCMAVLink::FirmwareClass_t firmwareClass)
Returns the list of supported vehicle types for the specified firmware.
static FirmwarePluginManager * instance()