Skip to content
Snippets Groups Projects
QGCCameraControl.h 11.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*!
     * @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
    
        friend class QGCCameraParamIO;
    
    public:
        QGCCameraControl(const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = NULL);
    
    Gus Grubba's avatar
    Gus Grubba committed
        virtual ~QGCCameraControl();
    
    
        //-- cam_mode
        enum CameraMode {
    
            CAM_MODE_UNDEFINED = -1,
            CAM_MODE_PHOTO = 0,
            CAM_MODE_VIDEO = 1,
    
    Gus Grubba's avatar
    Gus Grubba committed
        //-- Video Capture Status
        enum VideoStatus {
            VIDEO_CAPTURE_STATUS_STOPPED = 0,
            VIDEO_CAPTURE_STATUS_RUNNING,
    
            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
        };
    
    
        Q_ENUMS(CameraMode)
    
    Gus Grubba's avatar
    Gus Grubba committed
        Q_ENUMS(VideoStatus)
    
        Q_ENUMS(PhotoStatus)
    
    
        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
        Q_PROPERTY(quint32      storageFree         READ storageFree        NOTIFY storageFreeChanged)
        Q_PROPERTY(QString      storageFreeStr      READ storageFreeStr     NOTIFY storageFreeChanged)
        Q_PROPERTY(quint32      storageTotal        READ storageTotal       NOTIFY storageTotalChanged)
    
    
        Q_PROPERTY(QStringList  activeSettings      READ activeSettings                             NOTIFY activeSettingsChanged)
    
    Gus Grubba's avatar
    Gus Grubba committed
        Q_PROPERTY(VideoStatus  videoStatus         READ videoStatus                                NOTIFY videoStatusChanged)
    
        Q_PROPERTY(PhotoStatus  photoStatus         READ photoStatus                                NOTIFY photoStatusChanged)
    
        Q_PROPERTY(CameraMode   cameraMode          READ cameraMode         WRITE   setCameraMode   NOTIFY cameraModeChanged)
    
    
    Gus Grubba's avatar
    Gus Grubba committed
        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 PhotoStatus photoStatus         ();
    
    Gus Grubba's avatar
    Gus Grubba committed
        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);
    
    
        //-- Notify controller a parameter has changed
    
    Gus Grubba's avatar
    Gus Grubba committed
        virtual void        factChanged         (Fact* pFact);
    
        //-- Allow controller to modify or invalidate incoming parameter
        virtual bool        incomingParameter   (Fact* pFact, QVariant& newValue);
    
    
    signals:
        void    infoChanged                     ();
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    videoStatusChanged              ();
    
        void    photoStatusChanged              ();
    
        void    cameraModeChanged               ();
        void    activeSettingsChanged           ();
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    storageFreeChanged              ();
        void    storageTotalChanged             ();
        void    dataReady                       (QByteArray data);
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    parametersReady                 ();
    
    Gus Grubba's avatar
    Gus Grubba committed
    
    protected:
        virtual void    _setVideoStatus         (VideoStatus status);
    
        virtual void    _setPhotoStatus         (PhotoStatus status);
    
    Gus Grubba's avatar
    Gus Grubba committed
        virtual void    _setCameraMode          (CameraMode mode);
    
    protected slots:
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    _initWhenReady                  ();
    
        void    _requestCameraSettings          ();
        void    _requestAllParameters           ();
    
        void    _requestParamUpdates            ();
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    _requestCaptureStatus           ();
        void    _requestStorageInfo             ();
        void    _downloadFinished               ();
        void    _mavCommandResult               (int vehicleId, int component, int command, int result, bool noReponseFromVehicle);
        void    _dataReady                      (QByteArray data);
    
        void    _paramDone                      ();
    
    
    private:
        bool    _handleLocalization             (QByteArray& bytes);
        bool    _replaceLocaleStrings           (const QDomNode node, QByteArray& bytes);
    
    Gus Grubba's avatar
    Gus Grubba committed
        bool    _loadCameraDefinitionFile       (QByteArray& bytes);
    
        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
        void    _httpRequest                    (const QString& url);
    
    Gus Grubba's avatar
    Gus Grubba committed
        void    _handleDefinitionFile           (const QString& url);
    
    
        QStringList     _loadExclusions         (QDomNode option);
    
        QStringList     _loadUpdates            (QDomNode option);
    
        QString         _getParamName           (const char* param_id);
    
    
    Gus Grubba's avatar
    Gus Grubba committed
    protected:
    
        Vehicle*                            _vehicle;
        int                                 _compID;
        mavlink_camera_information_t        _info;
        int                                 _version;
    
    Gus Grubba's avatar
    Gus Grubba committed
        bool                                _cached;
    
    Gus Grubba's avatar
    Gus Grubba committed
        uint32_t                            _storageFree;
        uint32_t                            _storageTotal;
        QNetworkAccessManager*              _netManager;
    
        QString                             _modelName;
        QString                             _vendor;
    
        QString                             _cacheFile;
    
        CameraMode                          _cameraMode;
    
    Gus Grubba's avatar
    Gus Grubba committed
        VideoStatus                         _video_status;
    
        PhotoStatus                         _photo_status;
    
        QStringList                         _activeSettings;
        QStringList                         _settings;
    
    Gus Grubba's avatar
    Gus Grubba committed
        QTimer                              _captureStatusTimer;
    
        QList<QGCCameraOptionExclusion*>    _valueExclusions;
        QList<QGCCameraOptionRange*>        _optionRanges;
        QMap<QString, QStringList>          _originalOptNames;
        QMap<QString, QVariantList>         _originalOptValues;
        QMap<QString, QGCCameraParamIO*>    _paramIO;
    
        int                                 _storageInfoRetries;
        int                                 _captureInfoRetries;
    
        //-- Parameters that require a full update
    
        QMap<QString, QStringList>          _requestUpdates;
    
        QStringList                         _updatesToRequest;