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/QFileInfo>
4#include <QtCore/QObject>
5#include <QtCore/QLoggingCategory>
6#include <QtQmlIntegration/QtQmlIntegration>
7
8#include "MissionController.h"
11
12Q_DECLARE_LOGGING_CATEGORY(PlanMasterControllerLog)
13
17class Vehicle;
18#ifdef QGC_UNITTEST_BUILD
19class PlanMasterControllerTest;
20#endif
21
23class PlanMasterController : public QObject
24{
25 Q_OBJECT
26 QML_ELEMENT
27 Q_MOC_INCLUDE("QmlObjectListModel.h")
28 Q_MOC_INCLUDE("Vehicle.h")
29
30#ifdef QGC_UNITTEST_BUILD
31 friend class PlanMasterControllerTest;
32#endif
33
34public:
35 PlanMasterController(QObject* parent = nullptr);
36#ifdef QT_DEBUG
37 // Used by test code to create master controller with specific firmware/vehicle type
38 PlanMasterController(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* parent = nullptr);
39#endif
40
42
43 Q_PROPERTY(bool flyView MEMBER _flyView)
44 Q_PROPERTY(Vehicle* controllerVehicle READ controllerVehicle CONSTANT)
49 Q_PROPERTY(bool offline READ offline NOTIFY offlineChanged)
50 Q_PROPERTY(bool containsItems READ containsItems NOTIFY containsItemsChanged)
51 Q_PROPERTY(bool syncInProgress READ syncInProgress NOTIFY syncInProgressChanged)
52 Q_PROPERTY(bool dirtyForSave READ dirtyForSave NOTIFY dirtyForSaveChanged)
53 Q_PROPERTY(bool dirtyForUpload READ dirtyForUpload NOTIFY dirtyForUploadChanged)
54 Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
55 Q_PROPERTY(QString kmlFileExtension READ kmlFileExtension CONSTANT)
56 Q_PROPERTY(QString currentPlanFile READ currentPlanFile NOTIFY currentPlanFileChanged)
59 Q_PROPERTY(bool planFileRenamed READ planFileRenamed NOTIFY planFileRenamedChanged)
60 Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT)
61 Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
62 Q_PROPERTY(QmlObjectListModel* planCreators MEMBER _planCreators NOTIFY planCreatorsChanged)
64
65
66 Q_INVOKABLE void start(void);
67
70 Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);
71
75 Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }
76
78 Q_INVOKABLE void showPlanFromManagerVehicle(void);
79
83 static void sendPlanToVehicle(Vehicle* vehicle, const QString& filename);
84
85 Q_INVOKABLE void loadFromVehicle(void);
86 Q_INVOKABLE void sendToVehicle(void);
87 Q_INVOKABLE void loadFromFile(const QString& filename);
88
92 Q_INVOKABLE void loadFromArchive(const QString& archivePath);
93
94 Q_INVOKABLE bool saveToCurrent();
95 Q_INVOKABLE bool saveToFile(const QString& filename);
96 Q_INVOKABLE void saveToKml(const QString& filename);
97
98 Q_INVOKABLE bool saveWithCurrentName();
99 Q_INVOKABLE bool resolvedPlanFileExists() const;
100 Q_INVOKABLE void removeAll(void);
101 Q_INVOKABLE void removeAllFromVehicle(void);
102
103 MissionController* missionController(void) { return &_missionController; }
104 GeoFenceController* geoFenceController(void) { return &_geoFenceController; }
105 RallyPointController* rallyPointController(void) { return &_rallyPointController; }
106
107 bool offline (void) const { return _offline; }
108 bool containsItems (void) const;
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 manualCreation (void) const { return _manualCreation; }
123
124 void setFlyView(bool flyView) { _flyView = flyView; }
126
127 QJsonDocument saveToJson ();
128
129 Vehicle* controllerVehicle(void) { return _controllerVehicle; }
130 Vehicle* managerVehicle(void) { return _managerVehicle; }
131
132 static constexpr int kPlanFileVersion = 1;
133 static constexpr const char* kPlanFileType = "Plan";
134 static constexpr const char* kJsonMissionObjectKey = "mission";
135 static constexpr const char* kJsonGeoFenceObjectKey = "geoFence";
136 static constexpr const char* kJsonRallyPointsObjectKey = "rallyPoints";
137
138signals:
143 void offlineChanged (bool offlineEditing);
152
153private slots:
154 void _activeVehicleChanged (Vehicle* activeVehicle);
155 void _loadMissionComplete (void);
156 void _loadGeoFenceComplete (void);
157 void _loadRallyPointsComplete (void);
158 void _sendMissionComplete (void);
159 void _sendGeoFenceComplete (void);
160 void _sendRallyPointsComplete (void);
161 void _updateOverallDirty (void);
162 void _updatePlanCreatorsList (void);
163 void _handleExtractionFinished (bool success);
164
165private:
166 void _commonInit (void);
167 void _showPlanFromManagerVehicle(void);
168 void _setDirtyForSave(bool dirtyForSave);
169 void _setDirtyForUpload(bool dirtyForUpload);
170 void _setDirtyStates(bool dirtyForSave, bool dirtyForUpload);
171 QString _resolvedPlanFilePath() const;
172 void _clearFileNames();
173
174#ifdef QGC_UNITTEST_BUILD
175 // Used by unit tests to set dirty flags for initial state
176 void _setDirtyForSaveUnitTest(bool dirtyForSave) { _dirtyForSave = dirtyForSave; }
177 void _setDirtyForUploadUnitTest(bool dirtyForUpload) { _dirtyForUpload = dirtyForUpload; }
178#endif
179
180 MultiVehicleManager* _multiVehicleMgr = nullptr;
181 Vehicle* _controllerVehicle = nullptr;
182 Vehicle* _managerVehicle = nullptr;
183 bool _flyView = true;
184 bool _offline = true;
185 MissionController _missionController;
186 GeoFenceController _geoFenceController;
187 RallyPointController _rallyPointController;
188 bool _loadGeoFence = false;
189 bool _loadRallyPoints = false;
190 bool _sendGeoFence = false;
191 bool _sendRallyPoints = false;
192 QString _currentPlanFile;
193 // NOTE: _currentPlanFileName and _originalPlanFileName must be kept in sync
194 // with _currentPlanFile across all code paths that modify any of them:
195 // loadFromFile, saveToFile, removeAll, removeAllFromVehicle, _clearFileNames.
196 QString _currentPlanFileName;
197 QString _originalPlanFileName;
198 bool _deleteWhenSendCompleted = false;
199 bool _dirtyForSave = false;
200 bool _dirtyForUpload = false;
201 bool _suppressOverallDirtyUpdate = false;
202 QmlObjectListModel* _planCreators = nullptr;
203 bool _manualCreation = false;
204 QGCCompressionJob* _extractionJob = nullptr;
205 QString _extractionOutputDir;
206};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
int readyForSaveState(void) const
Master controller for mission, fence, rally.
void removeAll(void)
Removes all from controller only, synce required to remove from vehicle.
void planFileRenamedChanged(void)
bool saveWithCurrentName()
Save using the (possibly renamed) currentPlanFileName.
void setCurrentPlanFileName(const QString &name)
void originalPlanFileNameChanged(void)
Vehicle * controllerVehicle(void)
QStringList saveNameFilters(void) const
void currentPlanFileNameChanged(void)
void setManualCreation(bool manualCreation)
void promptForPlanUsageOnVehicleChange(void)
void saveToKml(const QString &filename)
void showPlanFromManagerVehicle(void)
Replaces any current plan with the plan from the manager vehicle even if offline.
static constexpr int kPlanFileVersion
QStringList loadNameFilters(void) const
void planCreatorsChanged(QmlObjectListModel *planCreators)
QString originalPlanFileName(void) const
void managerVehicleChanged(Vehicle *managerVehicle)
QString kmlFileExtension(void) const
void syncInProgressChanged(void)
void loadFromFile(const QString &filename)
RallyPointController * rallyPointController(void)
void startStaticActiveVehicle(Vehicle *vehicle, bool deleteWhenSendCompleted=false)
bool dirtyForUpload(void) const
QString currentPlanFile(void) const
static constexpr const char * kJsonGeoFenceObjectKey
void loadFromArchive(const QString &archivePath)
GeoFenceController * geoFenceController(void)
void dirtyForSaveChanged(bool dirtyForSave)
QString currentPlanFileName(void) const
bool manualCreation(void) const
bool syncInProgress(void) const
void currentPlanFileChanged(void)
bool dirtyForSave(void) const
QString fileExtension(void) const
void setFlyView(bool flyView)
bool saveToFile(const QString &filename)
bool planFileRenamed(void) const
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
void removeAllFromVehicle(void)
Removes all from vehicle and controller.
static void sendPlanToVehicle(Vehicle *vehicle, const QString &filename)
int readyForSaveState(void) const
MissionController * missionController(void)
void offlineChanged(bool offlineEditing)
static constexpr const char * kJsonRallyPointsObjectKey