QGCCameraControl.h 9.87 KB
Newer Older
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
/*!
 * @file
 *   @brief Camera Controller
 *   @author Gus Grubba <mavlink@grubba.com>
 *
 */

#pragma once

#include "QGCApplication.h"
#include <QLoggingCategory>

class QDomNode;
class QDomNodeList;
class QGCCameraParamIO;

Q_DECLARE_LOGGING_CATEGORY(CameraControlLog)
Q_DECLARE_LOGGING_CATEGORY(CameraControlLogVerbose)

//-----------------------------------------------------------------------------
class QGCCameraOptionExclusion : public QObject
{
public:
    QGCCameraOptionExclusion(QObject* parent, QString param_, QString value_, QStringList exclusions_)
        : QObject(parent)
        , param(param_)
        , value(value_)
        , exclusions(exclusions_)
    {
    }
    QString param;
    QString value;
    QStringList exclusions;
};

//-----------------------------------------------------------------------------
class QGCCameraOptionRange : public QObject
{
public:
    QGCCameraOptionRange(QObject* parent, QString param_, QString value_, QString targetParam_, QString condition_, QStringList optNames_, QStringList optValues_)
        : QObject(parent)
        , param(param_)
        , value(value_)
        , targetParam(targetParam_)
        , condition(condition_)
        , optNames(optNames_)
        , optValues(optValues_)
    {
    }
    QString param;
    QString value;
    QString targetParam;
    QString condition;
    QStringList  optNames;
    QStringList  optValues;
    QVariantList optVariants;
};

//-----------------------------------------------------------------------------
class QGCCameraControl : public FactGroup
{
    Q_OBJECT
63
    friend class QGCCameraParamIO;
64 65
public:
    QGCCameraControl(const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = NULL);
Gus Grubba's avatar
Gus Grubba committed
66
    virtual ~QGCCameraControl();
67 68 69

    //-- cam_mode
    enum CameraMode {
70 71 72
        CAM_MODE_UNDEFINED = -1,
        CAM_MODE_PHOTO = 0,
        CAM_MODE_VIDEO = 1,
73 74
    };

Gus Grubba's avatar
Gus Grubba committed
75 76 77 78 79 80 81
    //-- Video Capture Status
    enum VideoStatus {
        VIDEO_CAPTURE_STATUS_STOPPED = 0,
        VIDEO_CAPTURE_STATUS_RUNNING,
        VIDEO_CAPTURE_STATUS_UNDEFINED
    };

82
    Q_ENUMS(CameraMode)
Gus Grubba's avatar
Gus Grubba committed
83
    Q_ENUMS(VideoStatus)
84 85 86 87 88 89 90 91 92 93 94 95 96 97

    Q_PROPERTY(int          version             READ version            NOTIFY infoChanged)
    Q_PROPERTY(QString      modelName           READ modelName          NOTIFY infoChanged)
    Q_PROPERTY(QString      vendor              READ vendor             NOTIFY infoChanged)
    Q_PROPERTY(QString      firmwareVersion     READ firmwareVersion    NOTIFY infoChanged)
    Q_PROPERTY(qreal        focalLength         READ focalLength        NOTIFY infoChanged)
    Q_PROPERTY(QSizeF       sensorSize          READ sensorSize         NOTIFY infoChanged)
    Q_PROPERTY(QSize        resolution          READ resolution         NOTIFY infoChanged)
    Q_PROPERTY(bool         capturesVideo       READ capturesVideo      NOTIFY infoChanged)
    Q_PROPERTY(bool         capturesPhotos      READ capturesPhotos     NOTIFY infoChanged)
    Q_PROPERTY(bool         hasModes            READ hasModes           NOTIFY infoChanged)
    Q_PROPERTY(bool         photosInVideoMode   READ photosInVideoMode  NOTIFY infoChanged)
    Q_PROPERTY(bool         videoInPhotoMode    READ videoInPhotoMode   NOTIFY infoChanged)
    Q_PROPERTY(bool         isBasic             READ isBasic            NOTIFY infoChanged)
Gus Grubba's avatar
Gus Grubba committed
98 99 100
    Q_PROPERTY(quint32      storageFree         READ storageFree        NOTIFY storageFreeChanged)
    Q_PROPERTY(QString      storageFreeStr      READ storageFreeStr     NOTIFY storageFreeChanged)
    Q_PROPERTY(quint32      storageTotal        READ storageTotal       NOTIFY storageTotalChanged)
101 102

    Q_PROPERTY(QStringList  activeSettings      READ activeSettings                             NOTIFY activeSettingsChanged)
Gus Grubba's avatar
Gus Grubba committed
103
    Q_PROPERTY(VideoStatus  videoStatus         READ videoStatus                                NOTIFY videoStatusChanged)
104 105
    Q_PROPERTY(CameraMode   cameraMode          READ cameraMode         WRITE   setCameraMode   NOTIFY cameraModeChanged)

Gus Grubba's avatar
Gus Grubba committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    Q_INVOKABLE virtual void setVideoMode   ();
    Q_INVOKABLE virtual void setPhotoMode   ();
    Q_INVOKABLE virtual void toggleMode     ();
    Q_INVOKABLE virtual bool takePhoto      ();
    Q_INVOKABLE virtual bool startVideo     ();
    Q_INVOKABLE virtual bool stopVideo      ();
    Q_INVOKABLE virtual bool toggleVideo    ();
    Q_INVOKABLE virtual void resetSettings  ();
    Q_INVOKABLE virtual void formatCard     (int id = 1);

    virtual int         version             () { return _version; }
    virtual QString     modelName           () { return _modelName; }
    virtual QString     vendor              () { return _vendor; }
    virtual QString     firmwareVersion     ();
    virtual qreal       focalLength         () { return (qreal)_info.focal_length; }
    virtual QSizeF      sensorSize          () { return QSizeF(_info.sensor_size_h, _info.sensor_size_v); }
    virtual QSize       resolution          () { return QSize(_info.resolution_h, _info.resolution_v); }
    virtual bool        capturesVideo       () { return _info.flags & CAMERA_CAP_FLAGS_CAPTURE_VIDEO; }
    virtual bool        capturesPhotos      () { return _info.flags & CAMERA_CAP_FLAGS_CAPTURE_IMAGE; }
    virtual bool        hasModes            () { return _info.flags & CAMERA_CAP_FLAGS_HAS_MODES; }
    virtual bool        photosInVideoMode   () { return _info.flags & CAMERA_CAP_FLAGS_CAN_CAPTURE_IMAGE_IN_VIDEO_MODE; }
    virtual bool        videoInPhotoMode    () { return _info.flags & CAMERA_CAP_FLAGS_CAN_CAPTURE_VIDEO_IN_IMAGE_MODE; }

    virtual int         compID              () { return _compID; }
    virtual bool        isBasic             () { return _settings.size() == 0; }
    virtual VideoStatus videoStatus         ();
    virtual CameraMode  cameraMode          () { return _cameraMode; }
    virtual QStringList activeSettings      () { return _activeSettings; }
    virtual quint32     storageFree         () { return _storageFree;  }
    virtual QString     storageFreeStr      ();
    virtual quint32     storageTotal        () { return _storageTotal; }

    virtual void        setCameraMode       (CameraMode mode);

    virtual void        handleSettings      (const mavlink_camera_settings_t& settings);
    virtual void        handleCaptureStatus (const mavlink_camera_capture_status_t& capStatus);
    virtual void        handleParamAck      (const mavlink_param_ext_ack_t& ack);
    virtual void        handleParamValue    (const mavlink_param_ext_value_t& value);
    virtual void        handleStorageInfo   (const mavlink_storage_information_t& st);
    virtual void        factChanged         (Fact* pFact);
146 147 148

signals:
    void    infoChanged                     ();
Gus Grubba's avatar
Gus Grubba committed
149
    void    videoStatusChanged              ();
150 151
    void    cameraModeChanged               ();
    void    activeSettingsChanged           ();
Gus Grubba's avatar
Gus Grubba committed
152 153 154
    void    storageFreeChanged              ();
    void    storageTotalChanged             ();
    void    dataReady                       (QByteArray data);
Gus Grubba's avatar
Gus Grubba committed
155
    void    parametersReady                 ();
Gus Grubba's avatar
Gus Grubba committed
156 157 158 159

protected:
    virtual void    _setVideoStatus         (VideoStatus status);
    virtual void    _setCameraMode          (CameraMode mode);
160 161

private slots:
Gus Grubba's avatar
Gus Grubba committed
162
    void    _initWhenReady                  ();
163 164
    void    _requestCameraSettings          ();
    void    _requestAllParameters           ();
Gus Grubba's avatar
Gus Grubba committed
165 166 167 168 169
    void    _requestCaptureStatus           ();
    void    _requestStorageInfo             ();
    void    _downloadFinished               ();
    void    _mavCommandResult               (int vehicleId, int component, int command, int result, bool noReponseFromVehicle);
    void    _dataReady                      (QByteArray data);
170
    void    _paramDone                      ();
171 172 173 174

private:
    bool    _handleLocalization             (QByteArray& bytes);
    bool    _replaceLocaleStrings           (const QDomNode node, QByteArray& bytes);
Gus Grubba's avatar
Gus Grubba committed
175
    bool    _loadCameraDefinitionFile       (QByteArray& bytes);
176 177 178 179 180 181 182 183 184
    bool    _loadConstants                  (const QDomNodeList nodeList);
    bool    _loadSettings                   (const QDomNodeList nodeList);
    void    _processRanges                  ();
    bool    _processCondition               (const QString condition);
    bool    _processConditionTest           (const QString conditionTest);
    bool    _loadNameValue                  (QDomNode option, const QString factName, FactMetaData* metaData, QString& optName, QString& optValue, QVariant& optVariant);
    bool    _loadRanges                     (QDomNode option, const QString factName, QString paramValue);
    void    _updateActiveList               ();
    void    _updateRanges                   (Fact* pFact);
Gus Grubba's avatar
Gus Grubba committed
185
    void    _httpRequest                    (const QString& url);
Gus Grubba's avatar
Gus Grubba committed
186
    void    _handleDefinitionFile           (const QString& url);
187 188 189 190

    QStringList     _loadExclusions         (QDomNode option);
    QString         _getParamName           (const char* param_id);

Gus Grubba's avatar
Gus Grubba committed
191
protected:
192 193 194 195
    Vehicle*                            _vehicle;
    int                                 _compID;
    mavlink_camera_information_t        _info;
    int                                 _version;
Gus Grubba's avatar
Gus Grubba committed
196
    bool                                _cached;
Gus Grubba's avatar
Gus Grubba committed
197 198 199
    uint32_t                            _storageFree;
    uint32_t                            _storageTotal;
    QNetworkAccessManager*              _netManager;
200 201
    QString                             _modelName;
    QString                             _vendor;
202
    QString                             _cacheFile;
203
    CameraMode                          _cameraMode;
Gus Grubba's avatar
Gus Grubba committed
204
    VideoStatus                         _video_status;
205 206
    QStringList                         _activeSettings;
    QStringList                         _settings;
Gus Grubba's avatar
Gus Grubba committed
207
    QTimer                              _captureStatusTimer;
208 209 210 211 212 213
    QList<QGCCameraOptionExclusion*>    _valueExclusions;
    QList<QGCCameraOptionRange*>        _optionRanges;
    QMap<QString, QStringList>          _originalOptNames;
    QMap<QString, QVariantList>         _originalOptValues;
    QMap<QString, QGCCameraParamIO*>    _paramIO;
};