APMFirmwarePlugin.h 5.45 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 This file is part of the QGROUNDCONTROL project
 
 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 
 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
 
 ======================================================================*/

/// @file
///     @author Don Gagne <don@thegagnes.com>

#ifndef APMFirmwarePlugin_H
#define APMFirmwarePlugin_H

#include "FirmwarePlugin.h"
31
#include "QGCLoggingCategory.h"
32
#include "APMParameterMetaData.h"
Don Gagne's avatar
Don Gagne committed
33

Don Gagne's avatar
Don Gagne committed
34 35
#include <QAbstractSocket>

36
Q_DECLARE_LOGGING_CATEGORY(APMFirmwarePluginLog)
Pritam Ghanghas's avatar
Pritam Ghanghas committed
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
class APMFirmwareVersion
{
public:
    APMFirmwareVersion(const QString &versionText = "");
    bool isValid() const;
    bool isBeta() const;
    bool isDev() const;
    bool operator<(const APMFirmwareVersion& other) const;
    QString versionString() const { return _versionString; }
    QString vehicleType() const { return _vehicleType; }
    int majorNumber() const { return _major; }
    int minorNumber() const { return _minor; }
    int patchNumber() const { return _patch; }

private:
    void _parseVersion(const QString &versionText);
    QString _versionString;
    QString _vehicleType;
    int     _major;
    int     _minor;
    int     _patch;
};

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
class APMCustomMode
{
public:
    APMCustomMode(uint32_t mode, bool settable);
    uint32_t modeAsInt() const { return _mode; }
    bool canBeSet() const { return _settable; }
    QString modeString() const;

protected:
    void setEnumToStringMapping(const QMap<uint32_t,QString>& enumToString);

private:
    uint32_t               _mode;
    bool                   _settable;
    QMap<uint32_t,QString> _enumToString;
};

78
/// This is the base class for all stack specific APM firmware plugins
Don Gagne's avatar
Don Gagne committed
79 80 81 82 83 84
class APMFirmwarePlugin : public FirmwarePlugin
{
    Q_OBJECT
    
public:
    // Overrides from FirmwarePlugin
85 86 87 88

    QList<VehicleComponent*> componentsForVehicle(AutoPilotPlugin* vehicle) final;
    QList<MAV_CMD> supportedMissionCommands(void) final;

Don Gagne's avatar
Don Gagne committed
89
    bool        isCapable(FirmwareCapabilities capabilities);
90
    QStringList flightModes(void) final;
Don Gagne's avatar
Don Gagne committed
91
    QString     flightMode(uint8_t base_mode, uint32_t custom_mode) const final;
92
    bool        setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) final;
Don Gagne's avatar
Don Gagne committed
93 94
    bool        isGuidedMode(const Vehicle* vehicle) const final;
    void        pauseVehicle(Vehicle* vehicle);
95
    int         manualControlReservedButtonCount(void) final;
96
    bool        adjustIncomingMavlinkMessage(Vehicle* vehicle, mavlink_message_t* message) final;
Don Gagne's avatar
Don Gagne committed
97
    void        adjustOutgoingMavlinkMessage(Vehicle* vehicle, mavlink_message_t* message) final;
98 99 100 101 102 103 104 105 106
    void        initializeVehicle(Vehicle* vehicle) final;
    bool        sendHomePositionToVehicle(void) final;
    void        addMetaDataToFact(QObject* parameterMetaData, Fact* fact, MAV_TYPE vehicleType) final;
    QString     getDefaultComponentIdParam(void) const final { return QString("SYSID_SW_TYPE"); }
    void        missionCommandOverrides(QString& commonJsonFilename, QString& fixedWingJsonFilename, QString& multiRotorJsonFilename) const final;
    QString     getVersionParam(void) final { return QStringLiteral("SYSID_SW_MREV"); }
    QString     internalParameterMetaDataFile   (void) final { return QString(":/FirmwarePlugin/APM/APMParameterFactMetaData.xml"); }
    void        getParameterMetaDataVersionInfo (const QString& metaDataFile, int& majorVersion, int& minorVersion) final { APMParameterMetaData::getParameterMetaDataVersionInfo(metaDataFile, majorVersion, minorVersion); }
    QObject*    loadParameterMetaData           (const QString& metaDataFile);
107

108 109
protected:
    /// All access to singleton is through stack specific implementation
110
    APMFirmwarePlugin(void);
111
    void setSupportedModes(QList<APMCustomMode> supportedModes);
Don Gagne's avatar
Don Gagne committed
112 113 114

private slots:
    void _artooSocketError(QAbstractSocket::SocketError socketError);
115 116
    
private:
117
    void _adjustSeverity(mavlink_message_t* message) const;
Don Gagne's avatar
Don Gagne committed
118
    void _adjustCalibrationMessageSeverity(mavlink_message_t* message) const;
Pritam Ghanghas's avatar
Pritam Ghanghas committed
119
    static bool _isTextSeverityAdjustmentNeeded(const APMFirmwareVersion& firmwareVersion);
120 121
    void _setInfoSeverity(mavlink_message_t* message) const;
    QString _getMessageText(mavlink_message_t* message) const;
Don Gagne's avatar
Don Gagne committed
122 123
    void _handleParamValue(Vehicle* vehicle, mavlink_message_t* message);
    void _handleParamSet(Vehicle* vehicle, mavlink_message_t* message);
124
    bool _handleStatusText(Vehicle* vehicle, mavlink_message_t* message);
Don Gagne's avatar
Don Gagne committed
125
    void _handleHeartbeat(Vehicle* vehicle, mavlink_message_t* message);
Don Gagne's avatar
Don Gagne committed
126
    void _soloVideoHandshake(Vehicle* vehicle);
127

128 129 130
    APMFirmwareVersion      _firmwareVersion;
    bool                    _textSeverityAdjustmentNeeded;
    QList<APMCustomMode>    _supportedModes;
131
    QMap<QString, QTime>    _noisyPrearmMap;
Don Gagne's avatar
Don Gagne committed
132 133 134 135

    static const char*  _artooIP;
    static const int    _artooVideoHandshakePort;

Don Gagne's avatar
Don Gagne committed
136 137 138
};

#endif