QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FirmwarePlugin.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QList>
4#include <QtCore/QMap>
5#include <QtCore/QString>
6#include <QtCore/QVariantList>
7#include <QtPositioning/QGeoCoordinate>
8
9#include "MAVLinkEnums.h"
10#include "QGCMAVLinkTypes.h"
11#include "FollowMe.h"
12#include "VehicleTypes.h"
13
14class Vehicle;
15
17class AutoPilotPlugin;
18class FactMetaData;
21class Autotune;
22class LinkInterface;
23class FactGroup;
25
27{
28 FirmwareFlightMode(const QString &mName, uint32_t cMode, bool cbs = false, bool adv = false)
29 : mode_name(mName)
30 , custom_mode(cMode)
31 , canBeSet(cbs)
32 , advanced(adv)
33 {
34
35 }
36
37 FirmwareFlightMode(const QString &mName, uint8_t sMode, uint32_t cMode,
38 bool cbs = false, bool adv = false,
39 bool fWing = false, bool mRotor = true
40 )
41 : mode_name(mName)
42 , standard_mode(sMode)
43 , custom_mode(cMode)
44 , canBeSet(cbs)
45 , advanced(adv)
46 , fixedWing(fWing)
47 , multiRotor(mRotor)
48 {
49
50 }
51
52 QString mode_name = "Unknown";
53 uint8_t standard_mode = 0;
54 uint32_t custom_mode = UINT32_MAX;
55 bool canBeSet = false;
56 bool advanced = false;
57 bool fixedWing = false;
58 bool multiRotor = true;
59};
60
61/*===========================================================================*/
62
63typedef QList<FirmwareFlightMode> FlightModeList;
64typedef QMap<uint32_t,QString> FlightModeCustomModeMap;
65
72class FirmwarePlugin : public QObject
73{
74 Q_OBJECT
75
76public:
77 explicit FirmwarePlugin(QObject *parent = nullptr);
78 virtual ~FirmwarePlugin();
79
92
105
109 typedef QMap<QString, QString> remapParamNameMap_t;
110
114 typedef QMap<int, remapParamNameMap_t> remapParamNameMinorVersionRemapMap_t;
115
119 typedef QMap<int, remapParamNameMinorVersionRemapMap_t> remapParamNameMajorVersionMap_t;
120
122 virtual AutoPilotPlugin *autopilotPlugin(Vehicle *vehicle) const;
123
125 virtual void initializeVehicle(Vehicle* /*vehicle*/) {}
126
128 virtual bool isCapable(const Vehicle* /*vehicle*/, FirmwareCapabilities /*capabilities*/) const { return false; }
129
132 virtual QStringList flightModes(Vehicle* /*vehicle*/) const { return QStringList(); }
133
137 virtual QString flightMode(uint8_t base_mode, uint32_t custom_mode) const;
138
142 virtual bool setFlightMode(const QString &flightMode, uint8_t *base_mode, uint32_t *custom_mode) const;
143
145 virtual bool MAV_CMD_DO_SET_MODE_is_supported() const { return false; }
146
148 virtual QString pauseFlightMode() const { return QString(); }
149
151 virtual QString missionFlightMode() const { return QString(); }
152
154 virtual QString rtlFlightMode() const { return QString(); }
155
157 virtual QString smartRTLFlightMode() const { return QString(); }
158
159 virtual bool supportsSmartRTL() const { return false; }
160
162 virtual QString landFlightMode() const { return QString(); }
163
165 virtual QString takeOffFlightMode() const { return QString(); }
166
168 virtual QString motorDetectionFlightMode() const { return QString(); }
169
171 virtual QString stabilizedFlightMode() const { return QString(); }
172
174 virtual QString takeControlFlightMode() const { return QString(); }
175
177 virtual bool isGuidedMode(const Vehicle * /*vehicle*/) const { return false; }
178
180 virtual QString gotoFlightMode() const { return QString(); }
181
183 virtual QString followFlightMode() const { return QString(); }
184
186 virtual void setGuidedMode(Vehicle *vehicle, bool guidedMode) const;
187
190 virtual void pauseVehicle(Vehicle *vehicle) const;
191
193 virtual void guidedModeRTL(Vehicle *vehicle, bool smartRTL) const;
194
196 virtual void guidedModeLand(Vehicle *vehicle) const;
197
199 virtual void guidedModeTakeoff(Vehicle *vehicle, double takeoffAltRel) const;
200
202 virtual void guidedModeChangeHeading(Vehicle *vehicle, const QGeoCoordinate &headingCoord) const;
203
208 virtual bool guidedModeROI(Vehicle *vehicle, const QGeoCoordinate &roiCenterCoord, double relativeAltitudeMeters) const;
209
211 virtual double minimumTakeoffAltitudeMeters(Vehicle* /*vehicle*/) const { return 3.048; }
212
214 virtual double maximumHorizontalSpeedMultirotorMetersSecond(Vehicle* /*vehicle*/) const { return NAN; }
215
217 virtual double maximumEquivalentAirspeed(Vehicle* /*vehicle*/) const { return NAN; }
218
220 virtual double minimumEquivalentAirspeed(Vehicle* /*vehicle*/) const { return NAN; }
221
223 virtual bool hasGripper(const Vehicle* /*vehicle*/) const { return false; }
224
226 virtual bool mulirotorSpeedLimitsAvailable(Vehicle* /*vehicle*/) const { return false; }
227
229 virtual bool fixedWingAirSpeedLimitsAvailable(Vehicle* /*vehicle*/) const { return false; }
230
232 virtual void startTakeoff(Vehicle *vehicle) const;
233
235 virtual void startMission(Vehicle *vehicle) const;
236
239 virtual bool guidedModeGotoLocation(Vehicle *vehicle, const QGeoCoordinate &gotoCoord, double forwardFlightLoiterRadius = 0.0) const;
240
244 virtual void guidedModeChangeAltitude(Vehicle *vehicle, double altitudeChange, bool pauseVehicle);
245
248 virtual void guidedModeChangeGroundSpeedMetersSecond(Vehicle *vehicle, double groundspeed) const;
249
252 virtual void guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle *vehicle, double airspeed_equiv) const;
253
256 virtual int defaultJoystickTXMode() const { return 2; }
257
261 virtual bool supportsThrottleModeCenterZero() const { return true; }
262
265 virtual bool supportsNegativeThrust(Vehicle* /*vehicle*/) const { return false; }
266
269 virtual bool supportsRadio() const { return true; }
270
273 virtual bool supportsJSButton() const { return false; }
274
277 virtual bool supportsMotorInterference() const { return true; }
278
285 virtual bool adjustIncomingMavlinkMessage(Vehicle* /*vehicle*/, mavlink_message_t* /*message*/) { return true; }
286
296 virtual void adjustOutgoingMavlinkMessageThreadSafe(Vehicle* /*vehicle*/, LinkInterface* /*outgoingLink*/, mavlink_message_t* /*message*/) {}
297
306 virtual bool sendHomePositionToVehicle() const { return false; }
307
309 virtual QList<MAV_CMD> supportedMissionCommands(QGCMAVLinkTypes::VehicleClass_t /*vehicleClass*/) const { return QList<MAV_CMD>(); }
310
313 virtual QString missionCommandOverrides(QGCMAVLinkTypes::VehicleClass_t vehicleClass) const;
314
318
322 virtual int remapParamNameHigestMinorVersionNumber(int /*majorVersionNumber*/) const { return VehicleTypes::versionNotSetValue; }
323
325 virtual bool multiRotorCoaxialMotors(Vehicle* /*vehicle*/) const { return false; }
326
328 virtual bool multiRotorXConfig(Vehicle* /*vehicle*/) const { return false; }
329
331 virtual QString offlineEditingParamFile(Vehicle* /*vehicle*/) const { return QString(); }
332
334 virtual QString vehicleImageOpaque(const Vehicle* /*vehicle*/) const { return QStringLiteral("/qmlimages/vehicleArrowOpaque.svg"); }
335
337 virtual QString vehicleImageOutline(const Vehicle* /*vehicle*/) const { return QStringLiteral("/qmlimages/vehicleArrowOutline.svg"); }
338
339 virtual QVariant expandedToolbarIndicatorSource(const Vehicle* /*vehicle*/, const QString& /*indicatorName*/) const { return QVariant(); }
340
344 virtual const QVariantList &toolIndicators(const Vehicle *vehicle);
345
347 virtual QGCCameraManager *createCameraManager(Vehicle *vehicle) const;
348
350 virtual MavlinkCameraControlInterface *createCameraControl(const mavlink_camera_information_t *info, Vehicle *vehicle, int compID, QObject *parent = nullptr) const;
351
353 virtual QMap<QString, FactGroup*> *factGroups() { return nullptr; }
354
359 virtual void batteryConsumptionData(Vehicle *vehicle, int &mAhBattery, double &hoverAmps, double &cruiseAmps) const;
360
361 // Returns the parameter which control auto-disarm. Assume == 0 means no auto disarm
362 virtual QString autoDisarmParameter(Vehicle* /*vehicle*/) const { return QString(); }
363
369 virtual bool hasGimbal(Vehicle *vehicle, bool &rollSupported, bool &pitchSupported, bool &yawSupported) const;
370
372 virtual uint32_t highLatencyCustomModeTo32Bits(uint16_t hlCustomMode) const { return hlCustomMode; }
373
375 virtual void checkIfIsLatestStable(Vehicle *vehicle) const;
376
378 static QString stableFirmwareSettingsKey(const Vehicle* vehicle);
379
381 static bool isStableFirmwareVersionUnseen(const QString& latestVersion, const QString& seenVersion);
382
385 int versionCompare(const Vehicle *vehicle, const QString &compare) const;
386 int versionCompare(const Vehicle *vehicle, int major, int minor, int patch) const;
387
391 virtual void adjustMetaData(MAV_TYPE /*vehicleType*/, FactMetaData* /*metaData*/) {}
392
394 virtual void sendGCSMotionReport(Vehicle *vehicle, const FollowMe::GCSMotionReport &motionReport, uint8_t estimationCapabilities) const;
395
397 virtual QString getHobbsMeter(Vehicle *vehicle) const { Q_UNUSED(vehicle); return QStringLiteral("Not Supported"); }
398
400 virtual Autotune *createAutotune(Vehicle *vehicle) const;
401
403 virtual void updateAvailableFlightModes(FlightModeList &flightModeList) { _updateFlightModeList(flightModeList); }
404
406 void cacheParameterMetaDataFile(const QString &metaDataFile);
407
408signals:
410
411protected:
414 bool _armVehicleAndValidate(Vehicle *vehicle) const;
415
417 void _sendROICommand(Vehicle *vehicle, const QGeoCoordinate &coord, MAV_FRAME frame, float altitude) const;
418
421 bool _setFlightModeAndValidate(Vehicle *vehicle, const QString &flightMode) const;
422
423 virtual QString _internalParameterMetaDataFile(const Vehicle* /*vehicle*/) const { return QString(); }
424 virtual MAV_AUTOPILOT _autopilotType() const { return MAV_AUTOPILOT_GENERIC; }
425 virtual ParameterMetaData *_createParameterMetaData() { return nullptr; }
426 QString _cachedParameterMetaDataFile(const Vehicle *vehicle) const;
427
429 virtual QString _getLatestVersionFileUrl(Vehicle* /*vehicle*/) const { return QString(); }
430
432 virtual void _versionFileDownloadFinished(const QString& remoteFile, const QString& localFile,
433 Vehicle* vehicle) const;
434
436 virtual QString _versionRegex() const { return QString(); }
437
438 // Set Custom Mode mapping to Flight Mode String
440
441 // Convert Base enum to Derived class Enums
442 virtual uint32_t _convertToCustomFlightModeEnum(uint32_t val) const { return val; }
443
444 // Update internal mappings for a list of flight modes
445 void _updateFlightModeList(FlightModeList &flightModeList);
447
450
451 QVariantList _toolIndicatorList;
452 QVariantList _modeIndicatorList;
453};
454
455/*===========================================================================*/
456
457class FirmwarePluginInstanceData : public QObject
458{
459 Q_OBJECT
460
461public:
462 using QObject::QObject;
463
464 // support for detecting whether the firmware a vehicle is running
465 // supports a given MAV_CMD:
466 enum class CommandSupportedResult : uint8_t {
467 SUPPORTED = 23,
468 UNSUPPORTED = 24,
469 UNKNOWN = 25,
470 };
471 // anyVersionSupportsCommand returns true if any version of the
472 // firmware has supported cmd. Used so that extra round-trips to
473 // the autopilot to probe for command support are not required.
475
476 // support for detecting whether the firmware a vehicle is running
477 // supports a given MAV_CMD:
478 void setCommandSupported(MAV_CMD cmd, CommandSupportedResult status) { MAV_CMD_supported[cmd] = status; }
479
481
482private:
483 QMap<MAV_CMD, CommandSupportedResult> MAV_CMD_supported;
484};
QMap< uint32_t, QString > FlightModeCustomModeMap
QList< FirmwareFlightMode > FlightModeList
struct __mavlink_message mavlink_message_t
struct __mavlink_camera_information_t mavlink_camera_information_t
The AutoPilotPlugin class is an abstract base class which represents the methods and objects which ar...
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:16
Holds the meta data associated with a Fact.
virtual CommandSupportedResult anyVersionSupportsCommand(MAV_CMD) const
CommandSupportedResult getCommandSupported(MAV_CMD cmd) const
void setCommandSupported(MAV_CMD cmd, CommandSupportedResult status)
The FirmwarePlugin class represents the methods and objects which are specific to a certain Firmware ...
virtual bool supportsNegativeThrust(Vehicle *) const
void _setModeEnumToModeStringMapping(FlightModeCustomModeMap enumToString)
virtual QString motorDetectionFlightMode() const
Returns the flight mode for Motor Detection.
virtual QString pauseFlightMode() const
Returns The flight mode which indicates the vehicle is paused.
virtual void guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle *vehicle, double airspeed_equiv) const
virtual void guidedModeChangeAltitude(Vehicle *vehicle, double altitudeChange, bool pauseVehicle)
virtual bool supportsThrottleModeCenterZero() const
virtual void startMission(Vehicle *vehicle) const
Command the vehicle to start the mission.
virtual void checkIfIsLatestStable(Vehicle *vehicle) const
Used to check if running firmware is latest stable version.
FlightModeList _flightModeList
virtual bool multiRotorCoaxialMotors(Vehicle *) const
virtual double minimumEquivalentAirspeed(Vehicle *) const
virtual const QVariantList & toolIndicators(const Vehicle *vehicle)
virtual void guidedModeChangeGroundSpeedMetersSecond(Vehicle *vehicle, double groundspeed) const
virtual bool supportsMotorInterference() const
virtual bool setFlightMode(const QString &flightMode, uint8_t *base_mode, uint32_t *custom_mode) const
virtual ~FirmwarePlugin()
virtual bool supportsJSButton() const
FirmwareCapabilities
Set of optional capabilites which firmware may support.
@ ChangeHeadingCapability
Vehicle supports changing heading at current location.
@ GuidedTakeoffCapability
Vehicle supports guided takeoff.
@ TakeoffVehicleCapability
Vehicle supports taking off.
@ GuidedModeCapability
Vehicle supports guided mode commands.
@ OrbitModeCapability
Vehicle supports orbit mode.
@ SetFlightModeCapability
FirmwarePlugin::setFlightMode method is supported.
@ VTOLMulticopterTakeoffCapability
VTOL supports MAV_CMD_NAV_TAKEOFF while remaining in multicopter mode.
@ ROIModeCapability
Vehicle supports ROI (both in Fly guided mode and from Plan creation)
@ PauseVehicleCapability
Vehicle supports pausing at current location.
virtual QString vehicleImageOutline(const Vehicle *) const
Return the resource file which contains the vehicle icon used in the flight view when the view is lig...
virtual void _versionFileDownloadFinished(const QString &remoteFile, const QString &localFile, Vehicle *vehicle) const
Callback to process file with latest release information.
virtual void guidedModeTakeoff(Vehicle *vehicle, double takeoffAltRel) const
Command vehicle to takeoff from current location to the specified height.
void _sendROICommand(Vehicle *vehicle, const QGeoCoordinate &coord, MAV_FRAME frame, float altitude) const
Build + send MAV_CMD_DO_SET_ROI_LOCATION (COMMAND_INT when the vehicle supports it).
virtual bool isCapable(const Vehicle *, FirmwareCapabilities) const
void cacheParameterMetaDataFile(const QString &metaDataFile)
virtual double maximumEquivalentAirspeed(Vehicle *) const
virtual QString missionFlightMode() const
Returns the flight mode for running missions.
virtual QString missionCommandOverrides(QGCMAVLinkTypes::VehicleClass_t vehicleClass) const
bool _setFlightModeAndValidate(Vehicle *vehicle, const QString &flightMode) const
virtual QString _internalParameterMetaDataFile(const Vehicle *) const
virtual uint32_t _convertToCustomFlightModeEnum(uint32_t val) const
QMap< int, remapParamNameMap_t > remapParamNameMinorVersionRemapMap_t
virtual QString _getLatestVersionFileUrl(Vehicle *) const
returns url with latest firmware release information.
void _updateFlightModeList(FlightModeList &flightModeList)
virtual void adjustMetaData(MAV_TYPE, FactMetaData *)
virtual bool adjustIncomingMavlinkMessage(Vehicle *, mavlink_message_t *)
virtual bool fixedWingAirSpeedLimitsAvailable(Vehicle *) const
virtual void guidedModeChangeHeading(Vehicle *vehicle, const QGeoCoordinate &headingCoord) const
Command vehicle to rotate towards specified location.
virtual QString smartRTLFlightMode() const
Returns the flight mode for Smart RTL.
virtual bool guidedModeGotoLocation(Vehicle *vehicle, const QGeoCoordinate &gotoCoord, double forwardFlightLoiterRadius=0.0) const
virtual bool multiRotorXConfig(Vehicle *) const
static QString stableFirmwareSettingsKey(const Vehicle *vehicle)
Settings key identifying the stable firmware stream (firmware + vehicle class) for this vehicle.
virtual QString takeControlFlightMode() const
Returns the flight mode to use when the operator wants to take back control from autonomouse flight.
virtual int remapParamNameHigestMinorVersionNumber(int) const
virtual QString flightMode(uint8_t base_mode, uint32_t custom_mode) const
virtual QString vehicleImageOpaque(const Vehicle *) const
Return the resource file which contains the vehicle icon used in the flight view when the view is dar...
virtual void startTakeoff(Vehicle *vehicle) const
Command the vehicle to start a takeoff.
void _addNewFlightMode(FirmwareFlightMode &flightMode)
virtual void pauseVehicle(Vehicle *vehicle) const
virtual QVariant expandedToolbarIndicatorSource(const Vehicle *, const QString &) const
virtual MAV_AUTOPILOT _autopilotType() const
virtual bool mulirotorSpeedLimitsAvailable(Vehicle *) const
int versionCompare(const Vehicle *vehicle, const QString &compare) const
virtual bool hasGripper(const Vehicle *) const
virtual QString landFlightMode() const
Returns the flight mode for Land.
virtual QString gotoFlightMode() const
Returns the flight mode which the vehicle will be in if it is performing a goto location.
virtual Autotune * createAutotune(Vehicle *vehicle) const
Creates Autotune object.
static bool isStableFirmwareVersionUnseen(const QString &latestVersion, const QString &seenVersion)
virtual QStringList flightModes(Vehicle *) const
ParameterMetaData * loadParameterMetaData(const Vehicle *vehicle)
virtual AutoPilotPlugin * autopilotPlugin(Vehicle *vehicle) const
virtual void guidedModeRTL(Vehicle *vehicle, bool smartRTL) const
Command vehicle to return to launch.
virtual ParameterMetaData * _createParameterMetaData()
QVariantList _modeIndicatorList
virtual QString _versionRegex() const
Returns regex QString to extract version information from text.
virtual QList< MAV_CMD > supportedMissionCommands(QGCMAVLinkTypes::VehicleClass_t) const
List of supported mission commands. Empty list for all commands supported.
virtual QString autoDisarmParameter(Vehicle *) const
virtual QString stabilizedFlightMode() const
Returns the flight mode for Stabilized.
virtual void adjustOutgoingMavlinkMessageThreadSafe(Vehicle *, LinkInterface *, mavlink_message_t *)
bool _armVehicleAndValidate(Vehicle *vehicle) const
QVariantList _toolIndicatorList
void toolIndicatorsChanged()
virtual bool supportsRadio() const
virtual void updateAvailableFlightModes(FlightModeList &flightModeList)
Update Available flight modes received from vehicle.
QString _cachedParameterMetaDataFile(const Vehicle *vehicle) const
virtual void setGuidedMode(Vehicle *vehicle, bool guidedMode) const
Set guided flight mode.
QMap< QString, QString > remapParamNameMap_t
virtual QString takeOffFlightMode() const
Returns the flight mode for TakeOff.
FlightModeCustomModeMap _modeEnumToString
virtual bool guidedModeROI(Vehicle *vehicle, const QGeoCoordinate &roiCenterCoord, double relativeAltitudeMeters) const
virtual QString followFlightMode() const
Returns the flight mode which the vehicle will be for follow me.
virtual uint32_t highLatencyCustomModeTo32Bits(uint16_t hlCustomMode) const
Convert from HIGH_LATENCY2.custom_mode value to correct 32 bit value.
virtual int defaultJoystickTXMode() const
virtual void batteryConsumptionData(Vehicle *vehicle, int &mAhBattery, double &hoverAmps, double &cruiseAmps) const
virtual QGCCameraManager * createCameraManager(Vehicle *vehicle) const
Creates vehicle camera manager.
virtual QString offlineEditingParamFile(Vehicle *) const
Return the resource file which contains the set of params loaded for offline editing.
virtual void sendGCSMotionReport(Vehicle *vehicle, const FollowMe::GCSMotionReport &motionReport, uint8_t estimationCapabilities) const
Sends the appropriate mavlink message for follow me support.
QMap< int, remapParamNameMinorVersionRemapMap_t > remapParamNameMajorVersionMap_t
virtual QMap< QString, FactGroup * > * factGroups()
Returns a pointer to a dictionary of firmware-specific FactGroups.
virtual void initializeVehicle(Vehicle *)
Called when Vehicle is first created to perform any firmware specific setup.
virtual bool MAV_CMD_DO_SET_MODE_is_supported() const
returns true if this flight stack supports MAV_CMD_DO_SET_MODE
virtual QString rtlFlightMode() const
Returns the flight mode for RTL.
virtual double maximumHorizontalSpeedMultirotorMetersSecond(Vehicle *) const
virtual const remapParamNameMajorVersionMap_t & paramNameRemapMajorVersionMap() const
virtual bool supportsSmartRTL() const
virtual void guidedModeLand(Vehicle *vehicle) const
Command vehicle to land at current location.
virtual bool sendHomePositionToVehicle() const
virtual MavlinkCameraControlInterface * createCameraControl(const mavlink_camera_information_t *info, Vehicle *vehicle, int compID, QObject *parent=nullptr) const
Camera control.
virtual bool isGuidedMode(const Vehicle *) const
Returns whether the vehicle is in guided mode or not.
virtual bool hasGimbal(Vehicle *vehicle, bool &rollSupported, bool &pitchSupported, bool &yawSupported) const
virtual double minimumTakeoffAltitudeMeters(Vehicle *) const
virtual QString getHobbsMeter(Vehicle *vehicle) const
gets hobbs meter from autopilot. This should be reimplmeented for each firmware
The link interface defines the interface for all links used to communicate with the ground station ap...
Abstract base class for all camera controls: real and simulated.
Camera Manager.
A vehicle component is an object which abstracts the physical portion of a vehicle into a set of conf...
FirmwareFlightMode(const QString &mName, uint8_t sMode, uint32_t cMode, bool cbs=false, bool adv=false, bool fWing=false, bool mRotor=true)
FirmwareFlightMode(const QString &mName, uint32_t cMode, bool cbs=false, bool adv=false)
static const int versionNotSetValue