5#include <QtCore/QLoggingCategory>
6#include <QtCore/QPersistentModelIndex>
7#include <QtPositioning/QGeoCoordinate>
8#include <QtQmlIntegration/QtQmlIntegration>
41 Q_MOC_INCLUDE(
"FlightPathSegment.h")
42 Q_MOC_INCLUDE(
"VisualMissionItem.h")
43 Q_MOC_INCLUDE(
"TakeoffMissionItem.h")
125 Q_INVOKABLE
void removeVisualItem(
int viIndex);
200 bool repositionTakeoffItems =
true,
201 bool repositionLandingItems =
true);
216 double upMeters = 0.0,
217 bool offsetTakeoffItems =
false,
218 bool offsetLandingItems =
false);
231 bool rotateTakeoffItems =
false,
232 bool rotateLandingItems =
false);
259 void start (
bool flyView)
final;
260 void save (QJsonObject& json)
final;
267 bool dirty (
void)
const final;
376 void _newMissionItemsAvailableFromVehicle (
bool removeAllRequested);
377 void _itemCommandChanged (
void);
378 void _inProgressChanged (
bool inProgress);
379 void _currentMissionIndexChanged (
int sequenceNumber);
380 void _recalcFlightPathSegments (
void);
381 void _recalcMissionFlightStatus (
void);
382 void _updateContainsItems (
void);
384 void _visualItemsDirtyChanged (
bool dirty);
385 void _managerSendComplete (
bool error);
386 void _managerRemoveAllComplete (
bool error);
387 void _updateTimeout (
void);
388 void _complexBoundingBoxChanged (
void);
389 void _recalcAll (
void);
390 void _managerVehicleChanged (
Vehicle* managerVehicle);
391 void _forceRecalcOfAllowedBits (
void);
393 void _onMissionItemsInserted (
const QModelIndex& parent,
int first,
int last);
394 void _onMissionItemsAboutToBeRemoved (
const QModelIndex& parent,
int first,
int last);
395 void _onMissionItemsReset (
void);
396 void _onRallyPointsInserted (
const QModelIndex& parent,
int first,
int last);
397 void _onRallyPointsAboutToBeRemoved (
const QModelIndex& parent,
int first,
int last);
398 void _onRallyPointsReset (
void);
401 void _setupTreeModel (
void);
402 void _recalcSequence (
void);
403 void _recalcChildItems (
void);
404 void _recalcAllWithCoordinate (
const QGeoCoordinate& coordinate);
405 void _recalcROISpecialVisuals (
void);
406 void _initAllVisualItems (
void);
407 void _deinitAllVisualItems (
void);
410 void _setupActiveVehicle (
Vehicle* activeVehicle,
bool forceLoadFromVehicle);
419 int _nextSequenceNumber (
void);
421 void _setPlannedHomePositionFromFirstCoordinate(
const QGeoCoordinate& clickCoordinate);
422 void _resetMissionFlightStatus (
void);
423 void _addHoverTime (
double hoverTime,
double hoverDistance,
int waypointIndex);
424 void _addCruiseTime (
double cruiseTime,
double cruiseDistance,
int wayPointIndex);
425 void _updateBatteryInfo (
int waypointIndex);
429 void _addTimeDistance (
bool vtolInHover,
double hoverTime,
double cruiseTime,
double extraTime,
double distance,
int seqNum);
430 VisualMissionItem* _insertSimpleMissionItemWorker (QGeoCoordinate coordinate, MAV_CMD command,
int visualItemIndex,
bool makeCurrentItem);
431 void _insertComplexMissionItemWorker (
const QGeoCoordinate& mapCenterCoordinate,
ComplexMissionItem* complexItem,
int visualItemIndex,
bool makeCurrentItem);
435 void _allItemsRemoved (
void);
436 void _firstItemAdded (
void);
439 static double _normalizeLat (
double lat);
440 static double _normalizeLon (
double lon);
441 static bool _convertToMissionItems (
QmlObjectListModel* visualMissionItems, QList<MissionItem*>& rgMissionItems, QObject* missionItemParent);
444 Vehicle* _controllerVehicle =
nullptr;
445 Vehicle* _managerVehicle =
nullptr;
447 int _missionItemCount = 0;
449 QPersistentModelIndex _planFileGroupIndex;
450 QPersistentModelIndex _defaultsGroupIndex;
451 QPersistentModelIndex _missionGroupIndex;
452 QPersistentModelIndex _fenceGroupIndex;
453 QPersistentModelIndex _rallyGroupIndex;
454 QObject _planFileGroupNode;
455 QObject _planFileInfoMarker;
456 QObject _defaultsGroupNode;
457 QObject _defaultsInfoMarker;
458 QObject _missionItemsGroupNode;
459 QObject _fenceGroupNode;
460 QObject _rallyGroupNode;
461 QObject _fenceEditorMarker;
462 QObject _rallyHeaderMarker;
469 bool _firstItemsFromVehicle =
false;
470 bool _itemsRequested =
false;
471 bool _inRecalcSequence =
false;
474 double _progressPct = 0;
475 int _currentPlanViewSeqNum = -1;
476 int _currentPlanViewVIIndex = -1;
481 QGeoCoordinate _takeoffCoordinate;
482 QGeoCoordinate _previousCoordinate;
484 bool _delayedSplitSegmentUpdate =
false;
485 bool _onlyInsertTakeoffValid =
true;
486 bool _isInsertTakeoffValid =
true;
487 bool _isInsertLandValid =
false;
488 bool _hasLandItem =
false;
489 bool _isROIActive =
false;
490 bool _flyThroughCommandsAllowed =
false;
491 bool _isROIBeginCurrentItem =
false;
492 double _minAMSLAltitude = 0;
493 double _maxAMSLAltitude = 0;
494 bool _missionContainsVTOLTakeoff =
false;
498 static constexpr const char* _settingsGroup =
"MissionController";
499 static constexpr const char* _jsonFileTypeValue =
"Mission";
500 static constexpr const char* _jsonItemsKey =
"items";
501 static constexpr const char* _jsonPlannedHomePositionKey =
"plannedHomePosition";
502 static constexpr const char* _jsonFirmwareTypeKey =
"firmwareType";
503 static constexpr const char* _jsonVehicleTypeKey =
"vehicleType";
504 static constexpr const char* _jsonCruiseSpeedKey =
"cruiseSpeed";
505 static constexpr const char* _jsonHoverSpeedKey =
"hoverSpeed";
506 static constexpr const char* _jsonParamsKey =
"params";
507 static constexpr const char* _jsonGlobalPlanAltitudeModeKey =
"globalPlanAltitudeMode";
510 static constexpr const char* _jsonComplexItemsKey =
"complexItems";
511 static constexpr const char* _jsonMavAutopilotKey =
"MAV_AUTOPILOT";
513 static constexpr int _missionFileVersion = 2;
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
QPair< VisualMissionItem *, VisualMissionItem * > VisualItemPair
QHash< VisualItemPair, FlightPathSegment * > FlightPathSegmentHashTable
Used to convert a Plan to a KML document.
void minAMSLAltitudeChanged(double minAMSLAltitude)
void isROIActiveChanged(void)
void resumeMission(int resumeIndex)
static constexpr int kDefaultsGroupRow
double missionHoverDistance(void) const
double progressPct(void) const
VisualMissionItem * currentPlanViewItem(void) const
bool showPlanFromManagerVehicle(void) final
void visualItemsChanged(void)
SendToVehiclePreCheckState sendToVehiclePreCheck(void)
void currentPlanViewVIIndexChanged(void)
bool dirty(void) const final
static constexpr int kMissionGroupRow
VisualMissionItem * insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex, bool makeCurrentItem=false)
QmlObjectTreeModel * visualItemsTree(void)
void isInsertTakeoffValidChanged(void)
void batteriesRequiredChanged(int batteriesRequired)
void isInsertLandValidChanged(void)
double missionTime(void) const
bool loadTextFile(QFile &file, QString &errorString)
QmlObjectListModel * directionArrows(void)
void multipleLandPatternsAllowedChanged(void)
double minAMSLAltitude(void) const
double missionPlannedDistance(void) const
bool multipleLandPatternsAllowed(void) const
VisualMissionItem * insertTakeoffItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem=false)
QGeoCoordinate takeoffCoordinate()
QmlObjectListModel *visualItems READ visualItems NOTIFY visualItemsChanged(QmlObjectTreeModel *visualItemsTree READ visualItemsTree CONSTANT) 1(QPersistentModelIndex planFileGroupIndex READ planFileGroupIndex CONSTANT) 1(QPersistentModelIndex defaultsGroupIndex READ defaultsGroupIndex CONSTANT) 1(QPersistentModelIndex missionGroupIndex READ missionGroupIndex CONSTANT) 1(QPersistentModelIndex fenceGroupIndex READ fenceGroupIndex CONSTANT) 1(QPersistentModelIndex rallyGroupIndex READ rallyGroupIndex CONSTANT) 1(QmlObjectListModel *simpleFlightPathSegments READ simpleFlightPathSegments CONSTANT) 1(QmlObjectListModel *directionArrows READ directionArrows CONSTANT) 1(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged) 1(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged) 1(QGeoCoordinate previousCoordinate MEMBER _previousCoordinate NOTIFY previousCoordinateChanged) 1(FlightPathSegment *splitSegment MEMBER _splitSegment NOTIFY splitSegmentChanged) 1(double progressPct READ progressPct NOTIFY progressPctChanged) 1(int missionItemCount READ missionItemCount NOTIFY missionItemCountChanged) 1(int currentMissionIndex READ currentMissionIndex NOTIFY currentMissionIndexChanged) 1(int resumeMissionIndex READ resumeMissionIndex NOTIFY resumeMissionIndexChanged) 1(int currentPlanViewSeqNum READ currentPlanViewSeqNum NOTIFY currentPlanViewSeqNumChanged) 1(int currentPlanViewVIIndex READ currentPlanViewVIIndex NOTIFY currentPlanViewVIIndexChanged) 1(VisualMissionItem *currentPlanViewItem READ currentPlanViewItem NOTIFY currentPlanViewItemChanged) 1(TakeoffMissionItem *takeoffMissionItem READ takeoffMissionItem NOTIFY takeoffMissionItemChanged) 1(double missionTotalDistance READ missionTotalDistance NOTIFY missionTotalDistanceChanged) 1(double missionPlannedDistance READ missionPlannedDistance NOTIFY missionPlannedDistanceChanged) 1(double missionTime READ missionTime NOTIFY missionTimeChanged) 1(double missionHoverDistance READ missionHoverDistance NOTIFY missionHoverDistanceChanged) 1(double missionCruiseDistance READ missionCruiseDistance NOTIFY missionCruiseDistanceChanged) 1(double missionHoverTime READ missionHoverTime NOTIFY missionHoverTimeChanged) 1(double missionCruiseTime READ missionCruiseTime NOTIFY missionCruiseTimeChanged) 1(double missionMaxTelemetry READ missionMaxTelemetry NOTIFY missionMaxTelemetryChanged) 1(int batteryChangePoint READ batteryChangePoint NOTIFY batteryChangePointChanged) 1(int batteriesRequired READ batteriesRequired NOTIFY batteriesRequiredChanged) 1(QGCGeoBoundingCube *travelBoundingCube READ travelBoundingCube NOTIFY missionBoundingCubeChanged) 1(QString surveyComplexItemName READ surveyComplexItemName CONSTANT) 1(QString corridorScanComplexItemName READ corridorScanComplexItemName CONSTANT) 1(QString structureScanComplexItemName READ structureScanComplexItemName CONSTANT) 1(bool onlyInsertTakeoffValid MEMBER _onlyInsertTakeoffValid NOTIFY onlyInsertTakeoffValidChanged) 1(bool isInsertTakeoffValid MEMBER _isInsertTakeoffValid NOTIFY isInsertTakeoffValidChanged) 1(bool isInsertLandValid MEMBER _isInsertLandValid NOTIFY isInsertLandValidChanged) 1(bool hasLandItem MEMBER _hasLandItem NOTIFY hasLandItemChanged) 1(bool multipleLandPatternsAllowed READ multipleLandPatternsAllowed NOTIFY multipleLandPatternsAllowedChanged) 1(bool isROIActive MEMBER _isROIActive NOTIFY isROIActiveChanged) 1(bool isROIBeginCurrentItem MEMBER _isROIBeginCurrentItem NOTIFY isROIBeginCurrentItemChanged) 1(bool flyThroughCommandsAllowed MEMBER _flyThroughCommandsAllowed NOTIFY flyThroughCommandsAllowedChanged) 1(double minAMSLAltitude MEMBER _minAMSLAltitude NOTIFY minAMSLAltitudeChanged) 1(double maxAMSLAltitude MEMBER _maxAMSLAltitude NOTIFY maxAMSLAltitudeChanged) 1(QGroundControlQmlGlobal in visualItemIndexForObject)(QObject *object) const
< Used by Plan view only for interactive editing
VisualMissionItem * insertLandItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem=false)
void offsetMission(double eastMeters, double northMeters, double upMeters=0.0, bool offsetTakeoffItems=false, bool offsetLandingItems=false)
void setCurrentPlanViewSeqNum(int sequenceNumber, bool force)
double maxAMSLAltitude(void) const
void maxAMSLAltitudeChanged(double maxAMSLAltitude)
void removeAllFromVehicle(void) final
void recalcTerrainProfile(void)
void missionPlannedDistanceChanged(double missionPlannedDistance)
void missionTotalDistanceChanged(double missionTotalDistance)
QPersistentModelIndex planFileGroupIndex(void) const
void hasLandItemChanged(void)
void _recalcFlightPathSegmentsSignal(void)
void complexMissionItemNamesChanged(void)
QPersistentModelIndex fenceGroupIndex(void) const
int currentMissionIndex(void) const
void missionMaxTelemetryChanged(double missionMaxTelemetry)
static void sendItemsToVehicle(Vehicle *vehicle, QmlObjectListModel *visualMissionItems)
Sends the mission items to the specified vehicle.
bool load(const QJsonObject &json, QString &errorString) final
int missionItemCount(void) const
double missionMaxTelemetry(void) const
void onlyInsertTakeoffValidChanged(void)
void splitSegmentChanged(void)
void repositionMission(const QGeoCoordinate &newHome, bool repositionTakeoffItems=true, bool repositionLandingItems=true)
void resumeMissionReady(void)
SendToVehiclePreCheckState
@ SendToVehiclePreCheckStateFirwmareVehicleMismatch
@ SendToVehiclePreCheckStateNoActiveVehicle
@ SendToVehiclePreCheckStateOk
@ SendToVehiclePreCheckStateActiveMission
void batteryChangePointChanged(int batteryChangePoint)
void globalAltitudeModeChanged(void)
void takeoffMissionItemChanged(void)
void rotateMission(double degreesCW, bool rotateTakeoffItems=false, bool rotateLandingItems=false)
void currentPlanViewSeqNumChanged(void)
static constexpr int kGroupCount
void addMissionToKML(KMLPlanDomDocument &planKML)
void _recalcMissionFlightStatusSignal(void)
void flyThroughCommandsAllowedChanged(void)
int batteriesRequired(void) const
-1 for not supported
void missionHoverDistanceChanged(double missionHoverDistance)
static constexpr int kFenceGroupRow
bool syncInProgress(void) const final
QPersistentModelIndex defaultsGroupIndex(void) const
TakeoffMissionItem * takeoffMissionItem(void) const
static constexpr int kRallyGroupRow
void sendToVehicle(void) final
void resumeMissionIndexChanged(void)
void currentMissionIndexChanged(int currentMissionIndex)
QGroundControlQmlGlobal::AltMode globalAltitudeMode(void)
int batteryChangePoint(void) const
-1 for not supported, 0 for not needed
VisualMissionItem * insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem=false)
void plannedHomePositionChanged(QGeoCoordinate plannedHomePosition)
QString surveyComplexItemName(void) const
void newItemsFromVehicle(void)
int currentPlanViewVIIndex(void) const
void save(QJsonObject &json) final
double missionCruiseDistance(void) const
VisualMissionItem * insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem=false)
void missionHoverTimeChanged(void)
bool isFirstLandingComplexItem(const LandingComplexItem *item) const
QGeoCoordinate plannedHomePosition(void) const
QString corridorScanComplexItemName(void) const
QString structureScanComplexItemName(void) const
bool containsItems(void) const final
void progressPctChanged(double progressPct)
void isROIBeginCurrentItemChanged(void)
void missionCruiseTimeChanged(void)
QStringList complexMissionItemNames(void) const
QPersistentModelIndex missionGroupIndex(void) const
QGroundControlQmlGlobal::AltMode globalAltitudeModeDefault(void)
int readyForSaveState(void) const
static constexpr int kPlanFileGroupRow
void currentPlanViewItemChanged(void)
void previousCoordinateChanged(void)
int currentPlanViewSeqNum(void) const
void removeAll(void) final
Removes all from controller only.
void setGlobalAltitudeMode(QGroundControlQmlGlobal::AltMode altMode)
void missionBoundingCubeChanged(void)
bool isInsertTakeoffValid(void) const
double missionCruiseTime(void) const
void missionTimeChanged(void)
QPersistentModelIndex rallyGroupIndex(void) const
void applyDefaultMissionAltitude(void)
Updates the altitudes of the items in the current mission to the new default altitude.
void setDirty(bool dirty) final
void start(bool flyView) final
Should be called immediately upon Component.onCompleted.
QGCGeoBoundingCube * travelBoundingCube()
void missionCruiseDistanceChanged(double missionCruiseDistance)
double missionTotalDistance(void) const
void resumeMissionUploadFail(void)
void loadFromVehicle(void) final
double missionHoverTime(void) const
QmlObjectListModel * simpleFlightPathSegments(void)
bool supported(void) const final
true: controller is waiting for the current load to complete
VisualMissionItem * insertCancelROIMissionItem(int visualItemIndex, bool makeCurrentItem=false)
int resumeMissionIndex(void) const
void missionItemCountChanged(int missionItemCount)
VisualMissionItem * insertComplexMissionItemFromKMLOrSHP(QString itemName, QString file, int visualItemIndex, bool makeCurrentItem=false)
QmlObjectListModel * visualItems(void)
PlanMasterController *masterController READ masterController CONSTANT(bool supported READ supported NOTIFY supportedChanged) 1(bool containsItems READ containsItems NOTIFY containsItemsChanged) 1(bool syncInProgress READ syncInProgress NOTIFY syncInProgressChanged) 1(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) PlanMasterController *masterController(void)
< true: Elemement is non-empty
Master controller for mission, fence, rally.
A SimpleMissionItem is used to represent a single MissionItem to the ui.
double vehicleSpeed
Either cruise or hover speed based on vehicle type and vtol state.
double hoverAmpsTotal
Total hover amps used.
double gimbalPitch
NaN signals pitch was never changed.
QGCMAVLink::VehicleClass_t vtolMode
Either VehicleClassFixedWing, VehicleClassMultiRotor, VehicleClassGeneric (mode unknown)
int mAhBattery
0 for not available
int batteryChangePoint
-1 for not supported, 0 for not needed
double cruiseAmps
Amp consumption during cruise.
double ampMinutesAvailable
Amp minutes available from single battery.
double cruiseAmpsTotal
Total cruise amps used.
double gimbalYaw
NaN signals yaw was never changed.
double maxTelemetryDistance
double hoverAmps
Amp consumption during hover.
int batteriesRequired
-1 for not supported