diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index da2990b35bfd716a576079d480aabb3da73177f7..cc07dd40737badf834094c8aa266687c49997e9d 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -228,7 +228,7 @@ src/WimaView/WimaJoinedAreaMapVisual.qml src/WimaView/WimaCorridorEditor.qml src/FlightMap/MapItems/WimaPlanMapItems.qml - src/PlanView/WimaMissionItemMapVisual.qml + src/PlanView/WimaMissionItemMapVisual.qml src/Settings/APMMavlinkStreamRate.SettingsGroup.json diff --git a/src/FlightDisplay/FlightDisplayViewMap.qml b/src/FlightDisplay/FlightDisplayViewMap.qml index 852af22d07f6749d5c3d69f826671948238e124b..b7e97f785aee5ef7c6db2904dd4f83e47e13689a 100644 --- a/src/FlightDisplay/FlightDisplayViewMap.qml +++ b/src/FlightDisplay/FlightDisplayViewMap.qml @@ -214,8 +214,8 @@ FlightMap { map: flightMap largeMapView: _mainIsMap wimaController: flightMap.wimaController - z: QGroundControl.zOrderTrajectoryLines-1 - color: "gray" + z: QGroundControl.zOrderTrajectoryLines-1 + color: "#B4808080" // gray with alpha #AARRGGBB } // Add trajectory points to the map diff --git a/src/FlightMap/MapItems/MissionItemIndicator.qml b/src/FlightMap/MapItems/MissionItemIndicator.qml index 71cbaf99a5744392001d1778995cd22695c4ea2d..d41b286975584e5ee397ff34264dfecf1231b9a3 100644 --- a/src/FlightMap/MapItems/MissionItemIndicator.qml +++ b/src/FlightMap/MapItems/MissionItemIndicator.qml @@ -38,7 +38,8 @@ MapQuickItem { vehicleYaw: missionItem.missionVehicleYaw showGimbalYaw: !isNaN(missionItem.missionGimbalYaw) onClicked: _item.clicked() - color: _item.color + color: _item.color ? _item.color + : checked ? "green" : (child ? qgcPal.mapIndicatorChild : qgcPal.mapIndicator) property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem : false } diff --git a/src/FlightMap/MapItems/WimaPlanMapItems.qml b/src/FlightMap/MapItems/WimaPlanMapItems.qml index 15cb9c434ac8296d6e4b54e644c620ce7c654218..bfbe89cc57754b16f7e7582f901e7ee16d0a5db7 100644 --- a/src/FlightMap/MapItems/WimaPlanMapItems.qml +++ b/src/FlightMap/MapItems/WimaPlanMapItems.qml @@ -23,6 +23,7 @@ Item { property bool largeMapView ///< true: map takes up entire view, false: map is in small window property var wimaController property var color + property var lineColor: color property var _map: map property var _missionLineViewComponent @@ -68,7 +69,7 @@ Item { MapPolyline { line.width: 3 - line.color: "gray" // Hack, can't get palette to work in here + line.color: lineColor // Hack, can't get palette to work in here z: QGroundControl.zOrderWaypointLines path: wimaController.waypointPath } diff --git a/src/Wima/WimaController.cc b/src/Wima/WimaController.cc index d8b6bd0c06f17ff21c4f40597284f822be6601d4..f9fbd676b94803f83669bd2a5971e997be4d475f 100644 --- a/src/Wima/WimaController.cc +++ b/src/Wima/WimaController.cc @@ -12,6 +12,7 @@ WimaController::WimaController(QObject *parent) , _serviceArea (this) , _corridor (this) , _localPlanDataValid (false) + , _firstWaypointIndex (2) // starts with 2, 0 is home position, 1 is takeoff { } @@ -141,6 +142,74 @@ QJsonDocument WimaController::saveToJson(FileType fileType) return QJsonDocument(); } +bool WimaController::calcShortestPath(const QGeoCoordinate &start, const QGeoCoordinate &destination, QList &path) +{ + using namespace GeoUtilities; + using namespace PolygonCalculus; + QList path2D; + bool retVal = PolygonCalculus::shortestPath( + toQPolygonF(toCartesian2D(_joinedArea.coordinateList(), /*origin*/ start)), + /*start point*/ QPointF(0,0), + /*destination*/ toCartesian2D(destination, start), + /*shortest path*/ path2D); + path.append(toGeo(path2D, /*origin*/ start)); + + return retVal; +} + +bool WimaController::extractCoordinateList(const QmlObjectListModel &missionItems, QList &coordinateList) +{ + return extractCoordinateList(missionItems, coordinateList, 0, missionItems.count()-1); +} + +bool WimaController::extractCoordinateList(const QmlObjectListModel &missionItems, QList &coordinateList, int startIndex, int endIndex) +{ + if ( startIndex >= 0 + && startIndex < missionItems.count() + && endIndex >= 0 + && endIndex < missionItems.count()) { + if (startIndex > endIndex) { + if (!extractCoordinateList(missionItems, coordinateList, startIndex, missionItems.count()-1)) + return false; + if (!extractCoordinateList(missionItems, coordinateList, 0, endIndex)) + return false; + } else { + for (int i = startIndex; i <= endIndex; i++) { + const MissionItem *mItem = qobject_cast(missionItems[i]); + + if (mItem == nullptr) { + coordinateList.clear(); + return false; + } + coordinateList.append(mItem->coordinate()); + } + } + } else + return false; + + return true; +} + +bool WimaController::extractCoordinateList(const QmlObjectListModel &missionItems, QVariantList &coordinateList) +{ + return extractCoordinateList(missionItems, coordinateList, 0 , missionItems.count()-1); +} + +bool WimaController::extractCoordinateList(const QmlObjectListModel &missionItems, QVariantList &coordinateList, int startIndex, int endIndex) +{ + QList geoCoordintateList; + + bool retValue = extractCoordinateList(missionItems, geoCoordintateList, startIndex, endIndex); + + if (!retValue) + return false; + + for (auto coordinate : geoCoordintateList) + coordinateList.append(QVariant::fromValue(coordinate)); + + return true; +} + /*! * \fn void WimaController::containerDataValidChanged(bool valid) * Pulls plan data generated by \c WimaPlaner from the \c _container if the data is valid (\a valid equals true). @@ -254,25 +323,35 @@ void WimaController::containerDataValidChanged(bool valid) #endif } -void WimaController::updateWaypointPath() +void WimaController::updateCurrentMissionItems() { - _waypointPath.clear(); + int numberWaypoints = 30; // the number of waypoints currentMissionItems must not exceed - for ( int i = 1; i < _missionItems.count(); i++) { - SimpleMissionItem *item = qobject_cast(_missionItems[i]); - if (item == nullptr) { - qWarning("WimaController::updateWaypointPath(): nullptr"); - return; - } - _waypointPath.append(QVariant::fromValue(item->coordinate())); + QList geoCoordinateList; // list with potential waypoints (from _missionItems), for _currentMissionItems + if (!extractCoordinateList(_missionItems, geoCoordinateList, _firstWaypointIndex, + std::min(_firstWaypointIndex + numberWaypoints, _missionItems.count()-2))) // -2 -> last item is land item + { + qWarning("WimaController::updateCurrentMissionItems(): error on waypoint extraction."); + return; } - emit waypointPathChanged(); -} +} +void WimaController::updateWaypointPath() +{ + _waypointPath.clear(); + extractCoordinateList(_missionItems, _waypointPath, 1, _missionItems.count()-1); + emit waypointPathChanged(); +} +void WimaController::updateCurrentPath() +{ + _currentWaypointPath.clear(); + extractCoordinateList(_currentMissionItems, _currentWaypointPath, 1, _currentMissionItems.count()-1); + emit currentWaypointPathChanged(); +}