QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
PlanMasterController.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QObject>
4#include <QtQmlIntegration/QtQmlIntegration>
5
6#include "MissionController.h"
9#include "QGCMAVLinkTypes.h"
10
14class Vehicle;
15#ifdef QGC_UNITTEST_BUILD
16class PlanMasterControllerTest;
17#endif
18
21class PlanMasterController : public QObject
22{
23 Q_OBJECT
24 QML_ELEMENT
25 Q_MOC_INCLUDE("QmlObjectListModel.h")
26 Q_MOC_INCLUDE("Vehicle.h")
27
28#ifdef QGC_UNITTEST_BUILD
29 friend class PlanMasterControllerTest;
30#endif
31
32public:
33 PlanMasterController(QObject* parent = nullptr);
34#ifdef QGC_UNITTEST_BUILD
35 // Used by test code to create master controller with specific firmware/vehicle type
36 PlanMasterController(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* parent = nullptr);
37#endif
38
40
41 Q_PROPERTY(bool flyView MEMBER _flyView)
42 Q_PROPERTY(Vehicle* controllerVehicle READ controllerVehicle CONSTANT)
47 Q_PROPERTY(bool offline READ offline NOTIFY offlineChanged)
48 Q_PROPERTY(bool containsItems READ containsItems NOTIFY containsItemsChanged)
50 Q_PROPERTY(bool syncInProgress READ syncInProgress NOTIFY syncInProgressChanged)
51 Q_PROPERTY(bool dirtyForSave READ dirtyForSave NOTIFY dirtyForSaveChanged)
52 Q_PROPERTY(bool dirtyForUpload READ dirtyForUpload NOTIFY dirtyForUploadChanged)
53 Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
54 Q_PROPERTY(QString kmlFileExtension READ kmlFileExtension CONSTANT)
55 Q_PROPERTY(QString currentPlanFile READ currentPlanFile NOTIFY currentPlanFileChanged)
58 Q_PROPERTY(bool planFileRenamed READ planFileRenamed NOTIFY planFileRenamedChanged)
59 Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT)
60 Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
63
64
65 Q_INVOKABLE void start(void);
66
69 Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);
70
74 Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }
75
77 Q_INVOKABLE void showPlanFromManagerVehicle(void);
78
82 static void sendPlanToVehicle(Vehicle* vehicle, const QString& filename);
83
84 Q_INVOKABLE void loadFromVehicle(void);
85 Q_INVOKABLE void sendToVehicle(void);
86 Q_INVOKABLE void loadFromFile(const QString& filename);
87
91 Q_INVOKABLE void loadFromArchive(const QString& archivePath);
92
93 Q_INVOKABLE bool saveToCurrent();
94 Q_INVOKABLE bool saveToFile(const QString& filename);
95 Q_INVOKABLE void saveToKml(const QString& filename);
96
97 Q_INVOKABLE bool saveWithCurrentName();
98 Q_INVOKABLE bool resolvedPlanFileExists() const;
99 Q_INVOKABLE void removeAll(void);
100 Q_INVOKABLE void removeAllFromVehicle(void);
101
102 MissionController* missionController(void) { return &_missionController; }
103 GeoFenceController* geoFenceController(void) { return &_geoFenceController; }
104 RallyPointController* rallyPointController(void) { return &_rallyPointController; }
105
106 bool offline(void) const { return _offline; }
107 bool containsItems(void) const;
108 bool showCreateFromTemplate(void) const { return !containsItems() && !_userSelectedManualCreation; }
109 bool syncInProgress(void) const;
110 bool dirtyForSave(void) const { return _dirtyForSave; }
111 bool dirtyForUpload(void) const { return _dirtyForUpload; }
112 QString fileExtension(void) const;
113 QString kmlFileExtension(void) const;
114 QString currentPlanFile(void) const { return _currentPlanFile; }
115 QString currentPlanFileName(void) const { return _currentPlanFileName; }
116 void setCurrentPlanFileName(const QString& name);
117 QString originalPlanFileName(void) const { return _originalPlanFileName; }
118 bool planFileRenamed(void) const;
119 QStringList loadNameFilters(void) const;
120 QStringList saveNameFilters(void) const;
121 bool isEmpty(void) const;
122 bool userSelectedManualCreation(void) const { return _userSelectedManualCreation; }
123 QmlObjectListModel* planCreators(void) const { return _planCreators; }
124
125 void setFlyView(bool flyView) { _flyView = flyView; }
127
128 QJsonDocument saveToJson();
129
130 Vehicle* controllerVehicle(void) { return _controllerVehicle; }
131 Vehicle* managerVehicle(void) { return _managerVehicle; }
132
133 static constexpr int kPlanFileVersion = 1;
134 static constexpr const char* kPlanFileType = "Plan";
135 static constexpr const char* kJsonMissionObjectKey = "mission";
136 static constexpr const char* kJsonGeoFenceObjectKey = "geoFence";
137 static constexpr const char* kJsonRallyPointsObjectKey = "rallyPoints";
138
139signals:
145 void offlineChanged(bool offlineEditing);
154
155private slots:
156 void _activeVehicleChanged(Vehicle* activeVehicle);
157 void _loadMissionComplete(void);
158 void _loadGeoFenceComplete(void);
159 void _loadRallyPointsComplete(void);
160 void _sendMissionComplete(void);
161 void _sendGeoFenceComplete(void);
162 void _sendRallyPointsComplete(void);
163 void _updateOverallDirty(void);
164 void _updateShowCreateFromTemplate(void);
165 void _updatePlanCreatorsList(void);
166 void _handleExtractionFinished(bool success);
167
168private:
169 void _commonInit(void);
170 void _showPlanFromManagerVehicle(void);
171 void _setDirtyForSave(bool dirtyForSave);
172 void _setDirtyForUpload(bool dirtyForUpload);
173 void _setDirtyStates(bool dirtyForSave, bool dirtyForUpload);
174 QString _resolvedPlanFilePath() const;
175 void _clearFileNames();
176
177#ifdef QGC_UNITTEST_BUILD
178 // Used by unit tests to set dirty flags for initial state
179 void _setDirtyForSaveUnitTest(bool dirtyForSave) { _dirtyForSave = dirtyForSave; }
180 void _setDirtyForUploadUnitTest(bool dirtyForUpload) { _dirtyForUpload = dirtyForUpload; }
181#endif
182
183 MultiVehicleManager* _multiVehicleMgr = nullptr;
184 Vehicle* _controllerVehicle = nullptr;
185 Vehicle* _managerVehicle = nullptr;
186 bool _flyView = true;
187 bool _offline = true;
188 MissionController _missionController;
189 GeoFenceController _geoFenceController;
190 RallyPointController _rallyPointController;
191 bool _loadGeoFence = false;
192 bool _loadRallyPoints = false;
193 bool _sendGeoFence = false;
194 bool _sendRallyPoints = false;
195 QString _currentPlanFile;
196
197 // NOTE: _currentPlanFileName and _originalPlanFileName must be kept in sync
198 // with _currentPlanFile across all code paths that modify any of them:
199 // loadFromFile, saveToFile, removeAll, removeAllFromVehicle, _clearFileNames.
200 QString _currentPlanFileName;
201 QString _originalPlanFileName;
202
203 bool _deleteWhenSendCompleted = false;
204 bool _dirtyForSave = false;
205 bool _dirtyForUpload = false;
206 bool _showCreateFromTemplate = true;
207 bool _suppressOverallDirtyUpdate = false;
208 QmlObjectListModel* _planCreators = nullptr;
209 QGCMAVLinkTypes::VehicleClass_t _planCreatorsVehicleClass = -1;
210 bool _userSelectedManualCreation = false;
211 QGCCompressionJob* _extractionJob = nullptr;
212 QString _extractionOutputDir;
213};
int readyForSaveState(void) const
Master controller for mission, fence, rally.
Q_INVOKABLE void removeAll(void)
Removes all from controller only, sync required to remove from vehicle.
void planFileRenamedChanged(void)
Q_INVOKABLE bool saveWithCurrentName()
Save using the (possibly renamed) currentPlanFileName.
void setCurrentPlanFileName(const QString &name)
Q_INVOKABLE bool saveToCurrent()
void originalPlanFileNameChanged(void)
Vehicle * controllerVehicle(void)
QStringList saveNameFilters(void) const
void currentPlanFileNameChanged(void)
Q_INVOKABLE int readyForSaveState(void) const
void promptForPlanUsageOnVehicleChange(void)
void showCreateFromTemplateChanged()
Q_INVOKABLE void saveToKml(const QString &filename)
QmlObjectListModel * planCreators(void) const
void setUserSelectedManualCreation(bool userSelectedManualCreation)
Q_INVOKABLE void showPlanFromManagerVehicle(void)
Replaces any current plan with the plan from the manager vehicle even if offline.
static constexpr int kPlanFileVersion
Q_INVOKABLE void start(void)
Should be called immediately upon Component.onCompleted.
QStringList loadNameFilters(void) const
void planCreatorsChanged(QmlObjectListModel *planCreators)
QString originalPlanFileName(void) const
Q_INVOKABLE void loadFromVehicle(void)
void managerVehicleChanged(Vehicle *managerVehicle)
QString kmlFileExtension(void) const
void syncInProgressChanged(void)
Q_INVOKABLE void loadFromFile(const QString &filename)
RallyPointController * rallyPointController(void)
Q_INVOKABLE void startStaticActiveVehicle(Vehicle *vehicle, bool deleteWhenSendCompleted=false)
bool dirtyForUpload(void) const
QString currentPlanFile(void) const
static constexpr const char * kJsonGeoFenceObjectKey
Q_INVOKABLE void loadFromArchive(const QString &archivePath)
GeoFenceController * geoFenceController(void)
void dirtyForSaveChanged(bool dirtyForSave)
QString currentPlanFileName(void) const
void userSelectedManualCreationChanged()
bool syncInProgress(void) const
void currentPlanFileChanged(void)
bool showCreateFromTemplate(void) const
bool dirtyForSave(void) const
QString fileExtension(void) const
~PlanMasterController()
Either active vehicle or _controllerVehicle if no active vehicle.
void setFlyView(bool flyView)
Q_INVOKABLE bool saveToFile(const QString &filename)
bool planFileRenamed(void) const
Q_INVOKABLE bool resolvedPlanFileExists() const
true if a file at the renamed path already exists on disk
void dirtyForUploadChanged(bool dirtyForUpload)
static constexpr const char * kPlanFileType
static constexpr const char * kJsonMissionObjectKey
Q_INVOKABLE void removeAllFromVehicle(void)
Removes all from vehicle and controller.
static void sendPlanToVehicle(Vehicle *vehicle, const QString &filename)
MissionController * missionController(void)
void offlineChanged(bool offlineEditing)
Q_INVOKABLE void sendToVehicle(void)
bool userSelectedManualCreation(void) const
static constexpr const char * kJsonRallyPointsObjectKey
QObject wrapper for compression operations with progress signals.