From 36de7a3765e6e0c27388ff148448d167d0c5afc6 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 10 Dec 2019 19:32:37 +0300 Subject: [PATCH] Active ROI indication in Plan Map items --- src/FlightMap/MapItems/MissionLineView.qml | 6 +- src/MissionManager/MissionController.cc | 95 ++++++++++++++++++---- src/MissionManager/MissionController.h | 8 +- src/PlanView/PlanView.qml | 3 +- src/QmlControls/CoordinateVector.cc | 8 ++ src/QmlControls/CoordinateVector.h | 17 ++-- 6 files changed, 110 insertions(+), 27 deletions(-) diff --git a/src/FlightMap/MapItems/MissionLineView.qml b/src/FlightMap/MapItems/MissionLineView.qml index 6371aa448..4e7bf38cf 100644 --- a/src/FlightMap/MapItems/MissionLineView.qml +++ b/src/FlightMap/MapItems/MissionLineView.qml @@ -17,11 +17,11 @@ import QGroundControl.Palette 1.0 /// The MissionLineView control is used to add lines between mission items MapItemView { + property bool showSpecialVisual: false delegate: MapPolyline { line.width: 3 - line.color: "#be781c" // Hack, can't get palette to work in here + line.color: object && showSpecialVisual && object.specialVisual ? "green" : "#be781c" // Hack, can't get palette to work in here z: QGroundControl.zOrderWaypointLines - - path: object && object.coordinate1.isValid && object.coordinate2.isValid ? [ object.coordinate1, object.coordinate2 ] : [] + path: object && object.coordinate1.isValid && object.coordinate2.isValid ? [ object.coordinate1, object.coordinate2 ] : [] } } diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index ca905f40b..5d8b5f7ee 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -444,6 +444,7 @@ VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordi simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ; simpleItem->missionItem().setParam1(MAV_ROI_LOCATION); } + _recalcROISpecialVisuals(); return simpleItem; } @@ -455,6 +456,7 @@ VisualMissionItem* MissionController::insertCancelROIMissionItem(int visualItemI simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ; simpleItem->missionItem().setParam1(MAV_ROI_NONE); } + _recalcROISpecialVisuals(); return simpleItem; } @@ -555,15 +557,15 @@ void MissionController::_insertComplexMissionItemWorker(const QGeoCoordinate& ma } } -void MissionController::removeMissionItem(int index) +void MissionController::removeMissionItem(int viIndex) { - if (index <= 0 || index >= _visualItems->count()) { - qWarning() << "MissionController::removeMissionItem called with bad index - count:index" << _visualItems->count() << index; + if (viIndex <= 0 || viIndex >= _visualItems->count()) { + qWarning() << "MissionController::removeMissionItem called with bad index - count:index" << _visualItems->count() << viIndex; return; } - bool removeSurveyStyle = _visualItems->value(index) || _visualItems->value(index); - VisualMissionItem* item = qobject_cast(_visualItems->removeAt(index)); + bool removeSurveyStyle = _visualItems->value(viIndex) || _visualItems->value(viIndex); + VisualMissionItem* item = qobject_cast(_visualItems->removeAt(viIndex)); _deinitVisualItem(item); item->deleteLater(); @@ -1163,6 +1165,39 @@ CoordinateVector* MissionController::_addWaypointLineSegment(CoordVectHashTable& return coordVector; } +void MissionController::_recalcROISpecialVisuals(void) +{ + return; + VisualMissionItem* lastCoordinateItem = qobject_cast(_visualItems->get(0)); + bool roiActive = false; + + for (int i=1; i<_visualItems->count(); i++) { + VisualMissionItem* visualItem = qobject_cast(_visualItems->get(i)); + SimpleMissionItem* simpleItem = qobject_cast(visualItem); + VisualItemPair viPair; + + if (simpleItem) { + if (roiActive) { + if (_isROICancelItem(simpleItem)) { + roiActive = false; + } + } else { + if (_isROIBeginItem(simpleItem)) { + roiActive = true; + } + } + } + + if (visualItem->specifiesCoordinate() && !visualItem->isStandaloneCoordinate()) { + viPair = VisualItemPair(lastCoordinateItem, visualItem); + if (_linesTable.contains(viPair)) { + _linesTable[viPair]->setSpecialVisual(roiActive); + } + lastCoordinateItem = visualItem; + } + } +} + void MissionController::_recalcWaypointLines(void) { VisualItemPair lastSegmentVisualItemPair; @@ -1172,7 +1207,8 @@ void MissionController::_recalcWaypointLines(void) bool linkEndToHome = false; bool linkStartToHome = _managerVehicle->rover() ? true : false; bool foundRTL = false; - bool homePositionValid = _settingsItem->coordinate().isValid(); + bool homePositionValid = _settingsItem->coordinate().isValid(); + bool roiActive = false; qCDebug(MissionControllerLog) << "_recalcWaypointLines homePositionValid" << homePositionValid; @@ -1190,10 +1226,20 @@ void MissionController::_recalcWaypointLines(void) // Grovel through the list of items keeping track of things needed to correctly draw waypoints lines for (int i=1; i<_visualItems->count(); i++) { - VisualMissionItem* visualItem = qobject_cast(_visualItems->get(i)); - SimpleMissionItem* simpleItem = qobject_cast(visualItem); + VisualMissionItem* visualItem = qobject_cast(_visualItems->get(i)); + SimpleMissionItem* simpleItem = qobject_cast(visualItem); if (simpleItem) { + if (roiActive) { + if (_isROICancelItem(simpleItem)) { + roiActive = false; + } + } else { + if (_isROIBeginItem(simpleItem)) { + roiActive = true; + } + } + MAV_CMD command = simpleItem->mavCommand(); switch (command) { case MAV_CMD_NAV_TAKEOFF: @@ -1235,6 +1281,7 @@ void MissionController::_recalcWaypointLines(void) lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItemBeforeRTL, visualItem); if (!_flyView || addDirectionArrow) { CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair); + coordVector->setSpecialVisual(roiActive); if (addDirectionArrow) { _directionArrows.append(coordVector); } @@ -1255,7 +1302,8 @@ void MissionController::_recalcWaypointLines(void) if (_flyView) { _waypointPath.append(QVariant::fromValue(_settingsItem->coordinate())); } - _addWaypointLineSegment(old_table, lastSegmentVisualItemPair); + CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair); + coordVector->setSpecialVisual(roiActive); } // Add direction arrow to last segment @@ -2164,6 +2212,21 @@ void MissionController::_managerRemoveAllComplete(bool error) } } +bool MissionController::_isROIBeginItem(SimpleMissionItem* simpleItem) +{ + return simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_LOCATION || + simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET || + (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI && + static_cast(simpleItem->missionItem().param1()) == MAV_ROI_LOCATION); +} + +bool MissionController::_isROICancelItem(SimpleMissionItem* simpleItem) +{ + return simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_NONE || + (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI && + static_cast(simpleItem->missionItem().param1()) == MAV_ROI_NONE); +} + void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) { if (_visualItems && (force || sequenceNumber != _currentPlanViewSeqNum)) { @@ -2178,6 +2241,7 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) _isInsertTakeoffValid = true; _isInsertLandValid = true; _isROIActive = false; + _isROIBeginCurrentItem = false; _flyThroughCommandsAllowed = true; for (int viIndex=0; viIndex<_visualItems->count(); viIndex++) { @@ -2222,20 +2286,18 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) if (simpleItem) { if (pVI->sequenceNumber() <= sequenceNumber) { if (_isROIActive) { - if (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_NONE || - (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI && - simpleItem->missionItem().param1() == MAV_ROI_NONE)) { + if (_isROICancelItem(simpleItem)) { _isROIActive = false; } } else { - if (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_LOCATION || - simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET || - (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI && - simpleItem->missionItem().param1() == MAV_ROI_LOCATION)) { + if (_isROIBeginItem(simpleItem)) { _isROIActive = true; } } } + if (pVI->sequenceNumber() == sequenceNumber && _isROIBeginItem(simpleItem)) { + _isROIBeginCurrentItem = true; + } } if (pVI->sequenceNumber() == sequenceNumber) { @@ -2287,6 +2349,7 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force) emit isInsertTakeoffValidChanged(); emit isInsertLandValidChanged(); emit isROIActiveChanged(); + emit isROIBeginCurrentItemChanged(); emit flyThroughCommandsAllowedChanged(); } } diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 1e6643c08..718521c84 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -96,9 +96,10 @@ public: Q_PROPERTY(bool isInsertTakeoffValid MEMBER _isInsertTakeoffValid NOTIFY isInsertTakeoffValidChanged) Q_PROPERTY(bool isInsertLandValid MEMBER _isInsertLandValid NOTIFY isInsertLandValidChanged) Q_PROPERTY(bool isROIActive MEMBER _isROIActive NOTIFY isROIActiveChanged) + Q_PROPERTY(bool isROIBeginCurrentItem MEMBER _isROIBeginCurrentItem NOTIFY isROIBeginCurrentItemChanged) Q_PROPERTY(bool flyThroughCommandsAllowed MEMBER _flyThroughCommandsAllowed NOTIFY flyThroughCommandsAllowedChanged) - Q_INVOKABLE void removeMissionItem(int index); + Q_INVOKABLE void removeMissionItem(int viIndex); /// Add a new simple mission item to the list /// @param coordinate: Coordinate for item @@ -263,6 +264,7 @@ signals: void isInsertTakeoffValidChanged (void); void isInsertLandValidChanged (void); void isROIActiveChanged (void); + void isROIBeginCurrentItemChanged (void); void flyThroughCommandsAllowedChanged (void); private slots: @@ -286,6 +288,7 @@ private: void _recalcSequence(void); void _recalcChildItems(void); void _recalcAllWithCoordinate(const QGeoCoordinate& coordinate); + void _recalcROISpecialVisuals(void); void _initAllVisualItems(void); void _deinitAllVisualItems(void); void _initVisualItem(VisualMissionItem* item); @@ -317,6 +320,8 @@ private: VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem); void _insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem); void _warnIfTerrainFrameUsed(void); + bool _isROIBeginItem(SimpleMissionItem* simpleItem); + bool _isROICancelItem(SimpleMissionItem* simpleItem); private: MissionManager* _missionManager; @@ -344,6 +349,7 @@ private: bool _isInsertLandValid = true; bool _isROIActive = false; bool _flyThroughCommandsAllowed = true; + bool _isROIBeginCurrentItem = false; static const char* _settingsGroup; diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 981f6848b..c3d6d365b 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -430,7 +430,8 @@ Item { // Add lines between waypoints MissionLineView { - model: _editingLayer == _layerMission ? _missionController.waypointLines : undefined + showSpecialVisual: _missionController.isROIBeginCurrentItem + model: _editingLayer == _layerMission ? _missionController.waypointLines : undefined } MapItemView { diff --git a/src/QmlControls/CoordinateVector.cc b/src/QmlControls/CoordinateVector.cc index ff8964a86..dcf47a605 100644 --- a/src/QmlControls/CoordinateVector.cc +++ b/src/QmlControls/CoordinateVector.cc @@ -44,3 +44,11 @@ void CoordinateVector::setCoordinate2(const QGeoCoordinate &coordinate) emit coordinate2Changed(_coordinate2); } } + +void CoordinateVector::setSpecialVisual(bool specialVisual) +{ + if (_specialVisual != specialVisual) { + _specialVisual = specialVisual; + emit specialVisualChanged(specialVisual); + } +} diff --git a/src/QmlControls/CoordinateVector.h b/src/QmlControls/CoordinateVector.h index 5d265e7d2..b6534ff4e 100644 --- a/src/QmlControls/CoordinateVector.h +++ b/src/QmlControls/CoordinateVector.h @@ -21,25 +21,30 @@ public: CoordinateVector(QObject* parent = nullptr); CoordinateVector(const QGeoCoordinate& coordinate1, const QGeoCoordinate& coordinate2, QObject* parent = nullptr); - Q_PROPERTY(QGeoCoordinate coordinate1 MEMBER _coordinate1 NOTIFY coordinate1Changed) - Q_PROPERTY(QGeoCoordinate coordinate2 MEMBER _coordinate2 NOTIFY coordinate2Changed) + Q_PROPERTY(QGeoCoordinate coordinate1 MEMBER _coordinate1 NOTIFY coordinate1Changed) + Q_PROPERTY(QGeoCoordinate coordinate2 MEMBER _coordinate2 NOTIFY coordinate2Changed) + Q_PROPERTY(bool specialVisual READ specialVisual WRITE setSpecialVisual NOTIFY specialVisualChanged) - QGeoCoordinate coordinate1(void) const { return _coordinate1; } - QGeoCoordinate coordinate2(void) const { return _coordinate2; } + QGeoCoordinate coordinate1(void) const { return _coordinate1; } + QGeoCoordinate coordinate2(void) const { return _coordinate2; } + bool specialVisual(void) const { return _specialVisual; } void setCoordinates(const QGeoCoordinate& coordinate1, const QGeoCoordinate& coordinate2); + void setSpecialVisual(bool specialVisual); public slots: void setCoordinate1(const QGeoCoordinate& coordinate); void setCoordinate2(const QGeoCoordinate& coordinate); signals: - void coordinate1Changed(QGeoCoordinate coordinate); - void coordinate2Changed(QGeoCoordinate coordinate); + void coordinate1Changed (QGeoCoordinate coordinate); + void coordinate2Changed (QGeoCoordinate coordinate); + void specialVisualChanged (bool specialVisual); private: QGeoCoordinate _coordinate1; QGeoCoordinate _coordinate2; + bool _specialVisual = false; }; #endif -- 2.22.0