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
13class Vehicle;
14#ifdef QGC_UNITTEST_BUILD
15class PlanMasterControllerTest;
16#endif
17
20class PlanMasterController : public QObject
21{
22 Q_OBJECT
23 QML_ELEMENT
24 Q_MOC_INCLUDE("QmlObjectListModel.h")
25 Q_MOC_INCLUDE("Vehicle.h")
26
27#ifdef QGC_UNITTEST_BUILD
28 friend class PlanMasterControllerTest;
29#endif
30
31public:
32 PlanMasterController(QObject* parent = nullptr);
33#ifdef QGC_UNITTEST_BUILD
34 // Used by test code to create master controller with specific firmware/vehicle type
35 PlanMasterController(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* parent = nullptr);
36#endif
37
39
40 Q_PROPERTY(bool flyView MEMBER _flyView)
41 Q_PROPERTY(Vehicle* controllerVehicle READ controllerVehicle CONSTANT)
46 Q_PROPERTY(bool offline READ offline NOTIFY offlineChanged)
47 Q_PROPERTY(bool containsItems READ containsItems NOTIFY containsItemsChanged)
49 Q_PROPERTY(bool syncInProgress READ syncInProgress NOTIFY syncInProgressChanged)
50 Q_PROPERTY(bool dirtyForSave READ dirtyForSave NOTIFY dirtyForSaveChanged)
51 Q_PROPERTY(bool dirtyForUpload READ dirtyForUpload NOTIFY dirtyForUploadChanged)
52 Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
53 Q_PROPERTY(QString kmlFileExtension READ kmlFileExtension CONSTANT)
54 Q_PROPERTY(QString currentPlanFile READ currentPlanFile NOTIFY currentPlanFileChanged)
56 Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT)
57 Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
60
61
62 Q_INVOKABLE void start(void);
63
66 Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted = false);
67
71 Q_INVOKABLE int readyForSaveState(void) const { return _missionController.readyForSaveState(); }
72
74 Q_INVOKABLE void showPlanFromManagerVehicle(void);
75
79 static void sendPlanToVehicle(Vehicle* vehicle, const QString& filename);
80
81 Q_INVOKABLE void loadFromVehicle(void);
82 Q_INVOKABLE void sendToVehicle(void);
83 Q_INVOKABLE void loadFromFile(const QString& filename);
84 Q_INVOKABLE bool saveToCurrent();
85 Q_INVOKABLE bool saveToFile(const QString& filename);
86 Q_INVOKABLE void saveToKml(const QString& filename);
87
88 Q_INVOKABLE void removeAll(void);
89 Q_INVOKABLE void removeAllFromVehicle(void);
90
91 MissionController* missionController(void) { return &_missionController; }
92 GeoFenceController* geoFenceController(void) { return &_geoFenceController; }
93 RallyPointController* rallyPointController(void) { return &_rallyPointController; }
94
95 bool offline(void) const { return _offline; }
96 bool containsItems(void) const;
97 bool showCreateFromTemplate(void) const { return !containsItems() && !_userSelectedManualCreation; }
98 bool syncInProgress(void) const;
99 bool dirtyForSave(void) const { return _dirtyForSave; }
100 bool dirtyForUpload(void) const { return _dirtyForUpload; }
101 QString fileExtension(void) const;
102 QString kmlFileExtension(void) const;
103 QString currentPlanFile(void) const { return _currentPlanFile; }
104 QString currentPlanFileName(void) const;
105 QStringList loadNameFilters(void) const;
106 QStringList saveNameFilters(void) const;
107 bool isEmpty(void) const;
108 bool userSelectedManualCreation(void) const { return _userSelectedManualCreation; }
109 QmlObjectListModel* planCreators(void) const { return _planCreators; }
110
111 void setFlyView(bool flyView) { _flyView = flyView; }
113
114 QJsonDocument saveToJson();
115
116 Vehicle* controllerVehicle(void) { return _controllerVehicle; }
117 Vehicle* managerVehicle(void) { return _managerVehicle; }
118
119 static constexpr int kPlanFileVersion = 1;
120 static constexpr const char* kPlanFileType = "Plan";
121 static constexpr const char* kJsonMissionObjectKey = "mission";
122 static constexpr const char* kJsonGeoFenceObjectKey = "geoFence";
123 static constexpr const char* kJsonRallyPointsObjectKey = "rallyPoints";
124
125signals:
131 void offlineChanged(bool offlineEditing);
137
138private slots:
139 void _activeVehicleChanged(Vehicle* activeVehicle);
140 void _loadMissionComplete(void);
141 void _loadGeoFenceComplete(void);
142 void _loadRallyPointsComplete(void);
143 void _sendMissionComplete(void);
144 void _sendGeoFenceComplete(void);
145 void _sendRallyPointsComplete(void);
146 void _updateOverallDirty(void);
147 void _updateShowCreateFromTemplate(void);
148 void _updatePlanCreatorsList(void);
149
150private:
156 enum class SyncSequence {
157 Idle,
158 Mission,
159 GeoFence,
160 RallyPoints,
161 InitialPlanLoad,
162 };
163
164 void _commonInit(void);
165 void _showPlanFromManagerVehicle(void);
166 void _initialPlanRequestCompleteChanged(bool initialPlanRequestComplete);
167 void _setDirtyForSave(bool dirtyForSave);
168 void _setDirtyForUpload(bool dirtyForUpload);
169 void _setDirtyStates(bool dirtyForSave, bool dirtyForUpload);
170 void _clearElementDirtyStates();
171 void _clearCurrentPlanFile();
172 bool _loadPlanJson(const QByteArray& bytes, QString& errorString);
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 SyncSequence _loadSequence = SyncSequence::Idle;
189 SyncSequence _sendSequence = SyncSequence::Idle;
190 QString _currentPlanFile;
191 bool _deleteWhenSendCompleted = false;
192 bool _dirtyForSave = false;
193 bool _dirtyForUpload = false;
194 bool _showCreateFromTemplate = true;
195 bool _suppressOverallDirtyUpdate = false;
196 QmlObjectListModel* _planCreators = nullptr;
197 QGCMAVLinkTypes::VehicleClass_t _planCreatorsVehicleClass = -1;
198 bool _userSelectedManualCreation = false;
199};
QString errorString
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.
Q_INVOKABLE bool saveToCurrent()
Vehicle * controllerVehicle(void)
QStringList saveNameFilters(void) const
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)
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
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)
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