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 return supportedFirmwareClasses().contains(firmwareClass);
44}
45
50
52{
53 const QList<QGCMAVLink::FirmwareClass_t> firmwareClasses = supportedFirmwareClasses();
54 return (firmwareClasses.count() == 1) && (supportedVehicleClasses(firmwareClasses[0]).count() == 1);
55}
56
58{
59 QList<QGCMAVLink::VehicleClass_t> vehicleClasses;
60 const FirmwarePluginFactory *const factory = _findPluginFactory(firmwareClass);
61
62 if (factory) {
63 vehicleClasses = factory->supportedVehicleClasses();
64 } else if (firmwareClass == QGCMAVLink::FirmwareClassGeneric) {
65 // Generic supports all specific vehicle class
66 vehicleClasses = QGCMAVLink::allVehicleClasses();
67 (void) vehicleClasses.removeOne(QGCMAVLink::VehicleClassGeneric);
68 } else {
69 qCWarning(FirmwarePluginManagerLog) << "Request for unknown firmware plugin factory" << firmwareClass;
70 }
71
72 return vehicleClasses;
73}
74
75FirmwarePlugin *FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType)
76{
77 FirmwarePluginFactory *const factory = _findPluginFactory(firmwareType);
78 FirmwarePlugin *plugin = nullptr;
79
80 if (factory) {
81 plugin = factory->firmwarePluginForAutopilot(firmwareType, vehicleType);
82 }
83
84 if (!plugin) {
85 if (!_genericFirmwarePlugin) {
86 _genericFirmwarePlugin = new FirmwarePlugin(this);
87 }
88 plugin = _genericFirmwarePlugin;
89 }
90
91 return plugin;
92}
93
94FirmwarePluginFactory *FirmwarePluginManager::_findPluginFactory(QGCMAVLink::FirmwareClass_t firmwareClass)
95{
96 const QList<FirmwarePluginFactory*> factoryList = FirmwarePluginFactoryRegister::instance()->pluginFactories();
97
98 for (FirmwarePluginFactory *factory: factoryList) {
99 if (factory->supportedFirmwareClasses().contains(firmwareClass)) {
100 return factory;
101 }
102 }
103
104 return nullptr;
105}
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...
bool firmwareClassSupported(QGCMAVLink::FirmwareClass_t firmwareClass)
Returns true if the specified firmware class is supported by the system.
~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.
bool singleFirmwareSupport()
Returns true if the system supports only a single firmware class.
bool singleVehicleSupport()
Returns true if the system supports only a single firmware class with a single vehicle type.
static FirmwarePluginManager * instance()
The FirmwarePlugin class represents the methods and objects which are specific to a certain Firmware ...
static constexpr VehicleClass_t VehicleClassGeneric