QGCCameraControl.h 11.3 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
    //-- Video Capture Status
    enum VideoStatus {
        VIDEO_CAPTURE_STATUS_STOPPED = 0,
        VIDEO_CAPTURE_STATUS_RUNNING,
79 80 81 82 83 84 85 86 87 88 89 90
        VIDEO_CAPTURE_STATUS_LAST,
        VIDEO_CAPTURE_STATUS_UNDEFINED = 255
    };

    //-- Photo Capture Status
    enum PhotoStatus {
        PHOTO_CAPTURE_IDLE = 0,
        PHOTO_CAPTURE_IN_PROGRESS,
        PHOTO_CAPTURE_INTERVAL_IDLE,
        PHOTO_CAPTURE_INTERVAL_IN_PROGRESS,
        PHOTO_CAPTURE_LAST,
        PHOTO_CAPTURE_STATUS_UNDEFINED = 255
Gus Grubba's avatar
Gus Grubba committed
91 92
    };

93
    Q_ENUMS(CameraMode)
Gus Grubba's avatar
Gus Grubba committed
94
    Q_ENUMS(VideoStatus)
95
    Q_ENUMS(PhotoStatus)
96 97 98 99 100 101 102 103 104 105 106 107 108 109

    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
110 111 112
    Q_PROPERTY(quint32      storageFree         READ storageFree        NOTIFY storageFreeChanged)
    Q_PROPERTY(QString      storageFreeStr      READ storageFreeStr     NOTIFY storageFreeChanged)
    Q_PROPERTY(quint32      storageTotal        READ storageTotal       NOTIFY storageTotalChanged)
113 114

    Q_PROPERTY(QStringList  activeSettings      READ activeSettings                             NOTIFY activeSettingsChanged)
Gus Grubba's avatar
Gus Grubba committed
115
    Q_PROPERTY(VideoStatus  videoStatus         READ videoStatus                                NOTIFY videoStatusChanged)
116
    Q_PROPERTY(PhotoStatus  photoStatus         READ photoStatus                                NOTIFY photoStatusChanged)
117 118
    Q_PROPERTY(CameraMode   cameraMode          READ cameraMode         WRITE   setCameraMode   NOTIFY cameraModeChanged)

Gus Grubba's avatar
Gus Grubba committed
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
    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         ();
145
    virtual PhotoStatus photoStatus         ();
Gus Grubba's avatar
Gus Grubba committed
146 147 148 149 150 151 152 153 154 155 156 157 158
    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);
159 160

    //-- Notify controller a parameter has changed
Gus Grubba's avatar
Gus Grubba committed
161
    virtual void        factChanged         (Fact* pFact);
162 163
    //-- Allow controller to modify or invalidate incoming parameter
    virtual bool        incomingParameter   (Fact* pFact, QVariant& newValue);
164 165
    //-- Allow controller to modify or invalidate parameter change
    virtual bool        validateParameter   (Fact* pFact, QVariant& newValue);
166 167 168

signals:
    void    infoChanged                     ();
Gus Grubba's avatar
Gus Grubba committed
169
    void    videoStatusChanged              ();
170
    void    photoStatusChanged              ();
171 172
    void    cameraModeChanged               ();
    void    activeSettingsChanged           ();
Gus Grubba's avatar
Gus Grubba committed
173 174 175
    void    storageFreeChanged              ();
    void    storageTotalChanged             ();
    void    dataReady                       (QByteArray data);
Gus Grubba's avatar
Gus Grubba committed
176
    void    parametersReady                 ();
Gus Grubba's avatar
Gus Grubba committed
177 178 179

protected:
    virtual void    _setVideoStatus         (VideoStatus status);
180
    virtual void    _setPhotoStatus         (PhotoStatus status);
Gus Grubba's avatar
Gus Grubba committed
181
    virtual void    _setCameraMode          (CameraMode mode);
182

183
protected slots:
Gus Grubba's avatar
Gus Grubba committed
184
    void    _initWhenReady                  ();
185 186
    void    _requestCameraSettings          ();
    void    _requestAllParameters           ();
187
    void    _requestParamUpdates            ();
Gus Grubba's avatar
Gus Grubba committed
188 189 190 191 192
    void    _requestCaptureStatus           ();
    void    _requestStorageInfo             ();
    void    _downloadFinished               ();
    void    _mavCommandResult               (int vehicleId, int component, int command, int result, bool noReponseFromVehicle);
    void    _dataReady                      (QByteArray data);
193
    void    _paramDone                      ();
194 195 196 197

private:
    bool    _handleLocalization             (QByteArray& bytes);
    bool    _replaceLocaleStrings           (const QDomNode node, QByteArray& bytes);
Gus Grubba's avatar
Gus Grubba committed
198
    bool    _loadCameraDefinitionFile       (QByteArray& bytes);
199 200 201 202 203 204 205 206 207
    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
208
    void    _httpRequest                    (const QString& url);
Gus Grubba's avatar
Gus Grubba committed
209
    void    _handleDefinitionFile           (const QString& url);
210 211

    QStringList     _loadExclusions         (QDomNode option);
212
    QStringList     _loadUpdates            (QDomNode option);
213 214
    QString         _getParamName           (const char* param_id);

Gus Grubba's avatar
Gus Grubba committed
215
protected:
216 217 218 219
    Vehicle*                            _vehicle;
    int                                 _compID;
    mavlink_camera_information_t        _info;
    int                                 _version;
Gus Grubba's avatar
Gus Grubba committed
220
    bool                                _cached;
Gus Grubba's avatar
Gus Grubba committed
221 222 223
    uint32_t                            _storageFree;
    uint32_t                            _storageTotal;
    QNetworkAccessManager*              _netManager;
224 225
    QString                             _modelName;
    QString                             _vendor;
226
    QString                             _cacheFile;
227
    CameraMode                          _cameraMode;
Gus Grubba's avatar
Gus Grubba committed
228
    VideoStatus                         _video_status;
229
    PhotoStatus                         _photo_status;
230 231
    QStringList                         _activeSettings;
    QStringList                         _settings;
Gus Grubba's avatar
Gus Grubba committed
232
    QTimer                              _captureStatusTimer;
233 234 235 236 237
    QList<QGCCameraOptionExclusion*>    _valueExclusions;
    QList<QGCCameraOptionRange*>        _optionRanges;
    QMap<QString, QStringList>          _originalOptNames;
    QMap<QString, QVariantList>         _originalOptValues;
    QMap<QString, QGCCameraParamIO*>    _paramIO;
238 239
    int                                 _storageInfoRetries;
    int                                 _captureInfoRetries;
240
    //-- Parameters that require a full update
241
    QMap<QString, QStringList>          _requestUpdates;
242
    QStringList                         _updatesToRequest;
243
};