QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCCameraManager.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QElapsedTimer>
4#include <QtCore/QHash>
5#include <QtCore/QMap>
6#include <QtCore/QObject>
7#include <QtCore/QPointer>
8#include <QtCore/QTimer>
9#include <QtCore/QVariantList>
10#include <QtQmlIntegration/QtQmlIntegration>
11
12#include "MAVLinkMessageType.h"
13#include "QmlObjectListModel.h"
14
15class Vehicle;
16
17class CameraMetaData;
18class Joystick;
20class QGCCameraManagerTest;
23
26class QGCCameraManager : public QObject
27{
28 Q_OBJECT
29 QML_ELEMENT
30 QML_UNCREATABLE("")
31 Q_MOC_INCLUDE("Joystick.h")
32 Q_MOC_INCLUDE("MavlinkCameraControlInterface.h")
33
34 Q_PROPERTY(QmlObjectListModel* cameras READ cameras NOTIFY camerasChanged)
35 Q_PROPERTY(QStringList cameraLabels READ cameraLabels NOTIFY cameraLabelsChanged)
39
40#ifdef QGC_UNITTEST_BUILD
41 friend class QGCCameraManagerTest;
42#endif
43
44public:
47
48 struct CameraStruct {
49 CameraStruct(QGCCameraManager* manager_, uint8_t compID_, Vehicle* vehicle_);
51
52 bool infoReceived = false;
53 uint8_t compID = 0;
54 int retryCount = 0;
55 QElapsedTimer lastHeartbeat;
58 QPointer<QGCCameraManager> manager;
59
60 private:
61 Q_DISABLE_COPY_MOVE(CameraStruct)
62 };
63
69 QPointer<QGCCameraManager> manager;
70 uint8_t compID = 0;
71 };
72
75
76 QmlObjectListModel* cameras() { return &_cameras; }
77 const QmlObjectListModel* cameras() const { return &_cameras; }
78 QStringList cameraLabels() const { return _cameraLabels; }
79 int currentCamera() const { return _currentCameraIndex; }
81 void setCurrentCamera(int sel);
84
85 const QVariantList& cameraList() const;
86
87 Vehicle* vehicle() const { return _vehicle; }
88
89 CameraStruct* findCameraStruct(uint8_t compId) const { return _cameraInfoRequest.value(QString::number(compId), nullptr); }
90
91 int currentZoomLevel() const;
92 double aspectForComp(int compId) const;
93 double currentCameraAspect();
94 Q_INVOKABLE void requestCameraFovForComp(int compId);
95
96private:
97 int _zoomValueCurrent = 0;
98
99signals:
104
106
107protected slots:
108 void _vehicleReady(bool ready);
109 void _mavlinkMessageReceived(const mavlink_message_t& message);
110 void _activeJoystickChanged(Joystick* joystick);
111 void _stepZoom(int direction);
112 void _startZoom(int direction);
113 void _stopZoom();
114 void _stepFocus(int direction);
115 void _startFocus(int direction);
116 void _stopFocus();
117 void _stepCamera(int direction);
118 void _stepStream(int direction);
120 void _triggerCamera();
122 void _stopVideoRecording();
124
125private slots:
126 void _initialConnectCompleted();
127 void _setCurrentZoomLevel(int level);
128
129private:
130 MavlinkCameraControlInterface* _findCamera(int id);
131 void _requestCameraInfo(CameraStruct* cameraInfo);
132 void _handleHeartbeat(const mavlink_message_t& message);
133 void _handleCameraInfo(const mavlink_message_t& message);
134 void _handleStorageInformation(const mavlink_message_t& message);
135 void _handleCameraSettings(const mavlink_message_t& message);
136 void _handleParamExtAck(const mavlink_message_t& message);
137 void _handleParamExtValue(const mavlink_message_t& message);
138 void _handleCameraCaptureStatus(const mavlink_message_t& message);
139 void _handleVideoStreamInformation(const mavlink_message_t& message);
140 void _handleVideoStreamStatus(const mavlink_message_t& message);
141 void _handleBatteryStatus(const mavlink_message_t& message);
142 void _handleTrackingImageStatus(const mavlink_message_t& message);
143 void _addCameraControlToLists(MavlinkCameraControlInterface* cameraControl);
144 void _handleCameraFovStatus(const mavlink_message_t& message);
145
146 Vehicle* _vehicle;
147 QPointer<SimulatedCameraControl> _simulatedCameraControl;
148 QPointer<Joystick> _activeJoystick;
149 bool _vehicleReadyState = false;
150 int _currentTask = 0;
151 QmlObjectListModel _cameras;
152 QStringList _cameraLabels;
153 int _currentCameraIndex = 0;
154 QElapsedTimer _lastZoomChange;
155 QElapsedTimer _lastFocusChange;
156 QElapsedTimer _lastCameraChange;
157 QTimer _camerasLostHeartbeatTimer;
158 QMap<QString, CameraStruct*> _cameraInfoRequest;
159 QHash<uint8_t, CameraInfoRequestContext*> _cameraInfoContexts;
160 static QVariantList _cameraList;
161 bool _initialConnectComplete = false;
162
163 QHash<int, double> _aspectByCompId;
164};
struct __mavlink_message mavlink_message_t
Set of meta data which describes a camera available on the vehicle.
Abstract base class for all camera controls: real and simulated.
Camera Manager.
void currentZoomLevelChanged()
void setCurrentCamera(int sel)
void _vehicleReady(bool ready)
const QVariantList & cameraList() const
Q_INVOKABLE void requestCameraFovForComp(int compId)
QmlObjectListModel * cameras()
void cameraLabelsChanged()
MavlinkCameraControlInterface * currentCameraInstance()
QGCVideoStreamInfo * currentStreamInstance()
void _stepZoom(int direction)
void _startZoom(int direction)
double aspectForComp(int compId) const
QGCVideoStreamInfo * thermalStreamInstance()
Vehicle * vehicle() const
void _mavlinkMessageReceived(const mavlink_message_t &message)
void currentCameraChanged()
CameraInfoRequestContext * cameraInfoContext(uint8_t compId)
Returns the lazily created, manager-lifetime context for compId.
void _stepFocus(int direction)
CameraStruct * findCameraStruct(uint8_t compId) const
int currentZoomLevel() const
void _stepCamera(int direction)
void _activeJoystickChanged(Joystick *joystick)
const QmlObjectListModel * cameras() const
void _stepStream(int direction)
void _startFocus(int direction)
QStringList cameraLabels() const
int currentCamera() const
Encapsulates the contents of a VIDEO_STREAM_INFORMATION message.
Creates a simulated Camera Control which supports:
Vehicle * vehicle
Raw pointer is safe: CameraStruct is owned by QGCCameraManager which is a child of Vehicle.
QPointer< QGCCameraManager > manager