diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 4d96c86a5891b1dadf38b36ee405d3a45b77b317..8d923f608cb9ee7c5e434177c5a88e13d306ced9 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1084,6 +1084,9 @@ void MissionController::_updateBatteryInfo(int waypointIndex) _missionFlightStatus.hoverAmpsTotal = (_missionFlightStatus.hoverTime / 60.0) * _missionFlightStatus.hoverAmps; _missionFlightStatus.cruiseAmpsTotal = (_missionFlightStatus.cruiseTime / 60.0) * _missionFlightStatus.cruiseAmps; _missionFlightStatus.batteriesRequired = ceil((_missionFlightStatus.hoverAmpsTotal + _missionFlightStatus.cruiseAmpsTotal) / _missionFlightStatus.ampMinutesAvailable); + // FIXME: Battery change point code pretty much doesn't work. The reason is that is treats complex items as a black box. It needs to be able to look + // inside complex items in order to determine a swap point that is interior to a complex item. Current the swap point display in PlanToolbar is + // disabled to do this problem. if (waypointIndex != -1 && _missionFlightStatus.batteriesRequired == 2 && _missionFlightStatus.batteryChangePoint == -1) { _missionFlightStatus.batteryChangePoint = waypointIndex - 1; } diff --git a/src/MissionManager/PlanManager.cc b/src/MissionManager/PlanManager.cc index 6ad7fbfd0d8c1bcd91b482d6b000e75c8c5d0d45..be0321b23ecde42fc8d2c936de8f5bff0d0d604e 100644 --- a/src/MissionManager/PlanManager.cc +++ b/src/MissionManager/PlanManager.cc @@ -604,7 +604,7 @@ void PlanManager::_handleMissionAck(const mavlink_message_t& message) // MISSION_REQUEST is expected, or MISSION_ACK to end sequence if (missionAck.type == MAV_MISSION_ACCEPTED) { if (_itemIndicesToWrite.count() == 0) { - qCDebug(PlanManagerLog) << QStringLiteral("_handleMissionAck write sequence complete").arg(_planTypeString()); + qCDebug(PlanManagerLog) << QStringLiteral("_handleMissionAck write sequence complete %1").arg(_planTypeString()); _finishTransaction(true); } else { _sendError(MissingRequestsError, tr("Vehicle did not request all items during write sequence, missed count %1.").arg(_itemIndicesToWrite.count())); diff --git a/src/MissionManager/StructureScanComplexItem.cc b/src/MissionManager/StructureScanComplexItem.cc index b5e9c8b595c5e978d602e5585466dd2e9b87f2da..1258979b3de31618fa2f1d26436bff0a5dcdc72b 100644 --- a/src/MissionManager/StructureScanComplexItem.cc +++ b/src/MissionManager/StructureScanComplexItem.cc @@ -127,8 +127,10 @@ void StructureScanComplexItem::_polygonCountChanged(int count) int StructureScanComplexItem::lastSequenceNumber(void) const { return _sequenceNumber + - ((_flightPolygon.count() + 1) * _layersFact.rawValue().toInt()) + // 1 waypoint for each polygon vertex + 1 to go back to first polygon vertex - 1; // Gimbal control command + (_layersFact.rawValue().toInt() * + ((_flightPolygon.count() + 1) + // 1 waypoint for each polygon vertex + 1 to go back to first polygon vertex for each layer + 2)) + // Camera trigger start/stop for each layer + 1; // Gimbal control command } void StructureScanComplexItem::setDirty(bool dirty) diff --git a/src/MissionManager/StructureScanComplexItemTest.cc b/src/MissionManager/StructureScanComplexItemTest.cc index f894e5f6ee2f92f7bf143d6e0cc7187062108469..f4d1a2c9e2310e668b5d386637f83f136d7c4f4d 100644 --- a/src/MissionManager/StructureScanComplexItemTest.cc +++ b/src/MissionManager/StructureScanComplexItemTest.cc @@ -122,9 +122,6 @@ void StructureScanComplexItemTest::_validateItem(StructureScanComplexItem* item) QCOMPARE(item->gimbalPitch()->cookedValue().toDouble(), 45.0); QCOMPARE(item->gimbalYaw()->cookedValue().toDouble(), 45.0); QCOMPARE(item->layers()->cookedValue().toInt(), 2); - - int seqNum = item->sequenceNumber(); - QCOMPARE(item->lastSequenceNumber(), seqNum + (5 /* 5 waypoints per layer */ * item->layers()->cookedValue().toInt()) + 1 /* gimbal command */); } void StructureScanComplexItemTest::_testSaveLoad(void) @@ -152,3 +149,13 @@ void StructureScanComplexItemTest::_testGimbalAngleUpdate(void) QCOMPARE(_structureScanItem->gimbalPitch()->cookedValue().toDouble(), 0.0); QCOMPARE(_structureScanItem->gimbalYaw()->cookedValue().toDouble(), 90.0); } + +void StructureScanComplexItemTest::_testItemCount(void) +{ + QList items; + + _initItem(); + _structureScanItem->appendMissionItems(items, this); + QCOMPARE(items.count(), _structureScanItem->lastSequenceNumber()); + +} diff --git a/src/MissionManager/StructureScanComplexItemTest.h b/src/MissionManager/StructureScanComplexItemTest.h index 535842422b8ed07449f87c8433e1bef6e2aa9bd0..c6c42432b90e050aabb27425af7b5d2b5bf91453 100644 --- a/src/MissionManager/StructureScanComplexItemTest.h +++ b/src/MissionManager/StructureScanComplexItemTest.h @@ -28,6 +28,7 @@ private slots: void _testDirty(void); void _testSaveLoad(void); void _testGimbalAngleUpdate(void); + void _testItemCount(void); private: void _initItem(void); diff --git a/src/MissionManager/SurveyMissionItem.cc b/src/MissionManager/SurveyMissionItem.cc index 7dce0aefb9bf38bf7a0fd149ab819aa06f236694..db58bb83d6fd2ec72d8b86c574c5a3cb62f13d51 100644 --- a/src/MissionManager/SurveyMissionItem.cc +++ b/src/MissionManager/SurveyMissionItem.cc @@ -638,6 +638,28 @@ void SurveyMissionItem::_adjustTransectsToEntryPointLocation(QList>& transectSegments) +{ + int missionCommandCount= 0; + for (int i=0; i& transectSegment = transectSegments[i]; + + missionCommandCount += transectSegment.count(); // This accounts for all waypoints + if (_hoverAndCaptureEnabled()) { + // Internal camera trigger points are entry point, plus all points before exit point + missionCommandCount += transectSegment.count() - (_hasTurnaround() ? 2 : 0) - 1; + } else if (_triggerCamera() && !_imagesEverywhere()) { + // Camera on/off at entry/exit of each transect + missionCommandCount += 2; + } + } + if (transectSegments.count() && _triggerCamera() && _imagesEverywhere()) { + // Camera on/off for entire survey + missionCommandCount += 2; + } + + return missionCommandCount; +} void SurveyMissionItem::_generateGrid(void) { if (_ignoreRecalc) { @@ -725,19 +747,8 @@ void SurveyMissionItem::_generateGrid(void) emit gridPointsChanged(); // Determine command count for lastSequenceNumber - - _missionCommandCount= 0; - for (int i=0; i<_transectSegments.count(); i++) { - const QList& transectSegment = _transectSegments[i]; - - _missionCommandCount += transectSegment.count(); // This accounts for all waypoints - if (_hoverAndCaptureEnabled()) { - // Internal camera trigger points are entry point, plus all points before exit point - _missionCommandCount += transectSegment.count() - (_hasTurnaround() ? 2 : 0) - 1; - } else if (_triggerCamera()) { - _missionCommandCount += 2; // Camera on/off at entry/exit - } - } + _missionCommandCount = _calcMissionCommandCount(_transectSegments); + _missionCommandCount += _calcMissionCommandCount(_reflyTransectSegments); emit lastSequenceNumberChanged(lastSequenceNumber()); // Set exit coordinate @@ -1117,7 +1128,7 @@ bool SurveyMissionItem::_appendMissionItemsWorker(QList& items, QO { bool firstWaypointTrigger = false; - qCDebug(SurveyMissionItemLog) << "hasTurnaround:triggerCamera:hoverAndCapture:imagesEverywhere:hasRefly:buildRefly" << _hasTurnaround() << _triggerCamera() << _hoverAndCaptureEnabled() << _imagesEverywhere() << hasRefly << buildRefly; + qCDebug(SurveyMissionItemLog) << QStringLiteral("hasTurnaround(%1) triggerCamera(%2) hoverAndCapture(%3) imagesEverywhere(%4) hasRefly(%5) buildRefly(%6) ").arg(_hasTurnaround()).arg(_triggerCamera()).arg(_hoverAndCaptureEnabled()).arg(_imagesEverywhere()).arg(hasRefly).arg(buildRefly); QList>& transectSegments = buildRefly ? _reflyTransectSegments : _transectSegments; diff --git a/src/MissionManager/SurveyMissionItem.h b/src/MissionManager/SurveyMissionItem.h index c3a02e012780bbe807fdb76c5e3ef27686de916c..78e2ef41b1ec107331288a98b0c942b197290f4b 100644 --- a/src/MissionManager/SurveyMissionItem.h +++ b/src/MissionManager/SurveyMissionItem.h @@ -222,6 +222,7 @@ private: void _adjustTransectsToEntryPointLocation(QList>& transects); bool _gridAngleIsNorthSouthTransects(); double _clampGridAngle90(double gridAngle); + int _calcMissionCommandCount(QList>& transectSegments); int _sequenceNumber; bool _dirty; diff --git a/src/MissionManager/SurveyMissionItemTest.cc b/src/MissionManager/SurveyMissionItemTest.cc index 7b207797b5cac97f1de9489092d9c8267ddccf17..0f021051f250db374d7401a0378ea6e8aa72afb9 100644 --- a/src/MissionManager/SurveyMissionItemTest.cc +++ b/src/MissionManager/SurveyMissionItemTest.cc @@ -200,14 +200,17 @@ double SurveyMissionItemTest::_clampGridAngle180(double gridAngle) return gridAngle; } -void SurveyMissionItemTest::_testGridAngle(void) +void SurveyMissionItemTest::_setPolygon(void) { - QGCMapPolygon* mapPolygon = _surveyItem->mapPolygon(); - for (int i=0; i<_polyPoints.count(); i++) { QGeoCoordinate& vertex = _polyPoints[i]; - mapPolygon->appendVertex(vertex); + _mapPolygon->appendVertex(vertex); } +} + +void SurveyMissionItemTest::_testGridAngle(void) +{ + _setPolygon(); for (double gridAngle=-360.0; gridAngle<=360.0; gridAngle++) { _surveyItem->gridAngle()->setRawValue(gridAngle); @@ -223,12 +226,7 @@ void SurveyMissionItemTest::_testGridAngle(void) void SurveyMissionItemTest::_testEntryLocation(void) { - QGCMapPolygon* mapPolygon = _surveyItem->mapPolygon(); - - for (int i=0; i<_polyPoints.count(); i++) { - QGeoCoordinate& vertex = _polyPoints[i]; - mapPolygon->appendVertex(vertex); - } + _setPolygon(); for (double gridAngle=-360.0; gridAngle<=360.0; gridAngle++) { _surveyItem->gridAngle()->setRawValue(gridAngle); @@ -251,3 +249,39 @@ void SurveyMissionItemTest::_testEntryLocation(void) rgSeenEntryCoords.clear(); } } + + +void SurveyMissionItemTest::_testItemCount(void) +{ + QList items; + + _setPolygon(); + + _surveyItem->hoverAndCapture()->setRawValue(false); + _surveyItem->cameraTriggerInTurnaround()->setRawValue(false); + _surveyItem->setRefly90Degrees(false); + _surveyItem->appendMissionItems(items, this); + QCOMPARE(items.count(), _surveyItem->lastSequenceNumber()); + items.clear(); + + _surveyItem->hoverAndCapture()->setRawValue(false); + _surveyItem->cameraTriggerInTurnaround()->setRawValue(true); + _surveyItem->setRefly90Degrees(false); + _surveyItem->appendMissionItems(items, this); + QCOMPARE(items.count(), _surveyItem->lastSequenceNumber()); + items.clear(); + + _surveyItem->hoverAndCapture()->setRawValue(true); + _surveyItem->cameraTriggerInTurnaround()->setRawValue(false); + _surveyItem->setRefly90Degrees(false); + _surveyItem->appendMissionItems(items, this); + QCOMPARE(items.count(), _surveyItem->lastSequenceNumber()); + items.clear(); + + _surveyItem->hoverAndCapture()->setRawValue(true); + _surveyItem->cameraTriggerInTurnaround()->setRawValue(false); + _surveyItem->setRefly90Degrees(true); + _surveyItem->appendMissionItems(items, this); + QCOMPARE(items.count(), _surveyItem->lastSequenceNumber()); + items.clear(); +} diff --git a/src/MissionManager/SurveyMissionItemTest.h b/src/MissionManager/SurveyMissionItemTest.h index db5969207fbe20a9e7aa557d9334e597706e5bd4..0fe45131f79d17f2446e8218a40d1d6ad06d9685 100644 --- a/src/MissionManager/SurveyMissionItemTest.h +++ b/src/MissionManager/SurveyMissionItemTest.h @@ -36,9 +36,11 @@ private slots: void _testCameraTrigger(void); void _testGridAngle(void); void _testEntryLocation(void); + void _testItemCount(void); private: double _clampGridAngle180(double gridAngle); + void _setPolygon(void); enum { gridPointsChangedIndex = 0, diff --git a/src/PlanView/PlanToolBar.qml b/src/PlanView/PlanToolBar.qml index c37b38257c43a221c89527b69166725f194d1f36..ffc92a4b862019f72c68d62951f466e54442b1af 100644 --- a/src/PlanView/PlanToolBar.qml +++ b/src/PlanView/PlanToolBar.qml @@ -283,13 +283,15 @@ Rectangle { } Item { width: 1; height: 1 } - +/* + FIXME: Swap point display is currently hidden since the code which calcs it doesn't work correctly QGCLabel { text: qsTr("Swap waypoint:"); font.pointSize: _dataFontSize; } QGCLabel { text: _batteryChangePointText font.pointSize: _dataFontSize Layout.minimumWidth: _mediumValueWidth } +*/ } }