diff --git a/src/MissionManager/CorridorScanComplexItem.cc b/src/MissionManager/CorridorScanComplexItem.cc index 7dcfec119f5553f40d8d7cb333f2113b6835eae2..2d165d16e1af03a5a6447055dd9f9412a8e3b325 100644 --- a/src/MissionManager/CorridorScanComplexItem.cc +++ b/src/MissionManager/CorridorScanComplexItem.cc @@ -124,10 +124,14 @@ bool CorridorScanComplexItem::load(const QJsonObject& complexObject, int sequenc _entryPoint = complexObject[_jsonEntryPointKey].toInt(); - _rebuildTransects(); - _ignoreRecalc = false; + _recalcComplexDistance(); + if (_cameraShots == 0) { + // Shot count was possibly not available from plan file + _recalcCameraShots(); + } + return true; } @@ -461,14 +465,17 @@ void CorridorScanComplexItem::_rebuildTransectsPhase1(void) } } -void CorridorScanComplexItem::_rebuildTransectsPhase2(void) +void CorridorScanComplexItem::_recalcComplexDistance(void) { - // Calculate distance flown for complex item _complexDistance = 0; for (int i=0; i<_visualTransectPoints.count() - 1; i++) { _complexDistance += _visualTransectPoints[i].value().distanceTo(_visualTransectPoints[i+1].value()); } + emit complexDistanceChanged(); +} +void CorridorScanComplexItem::_recalcCameraShots(void) +{ double triggerDistance = _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble(); if (triggerDistance == 0) { _cameraShots = 0; @@ -480,14 +487,7 @@ void CorridorScanComplexItem::_rebuildTransectsPhase2(void) _cameraShots = singleTransectImageCount * _transectCount(); } } - - _coordinate = _visualTransectPoints.count() ? _visualTransectPoints.first().value() : QGeoCoordinate(); - _exitCoordinate = _visualTransectPoints.count() ? _visualTransectPoints.last().value() : QGeoCoordinate(); - emit cameraShotsChanged(); - emit complexDistanceChanged(); - emit coordinateChanged(_coordinate); - emit exitCoordinateChanged(_exitCoordinate); } bool CorridorScanComplexItem::readyForSave(void) const diff --git a/src/MissionManager/CorridorScanComplexItem.h b/src/MissionManager/CorridorScanComplexItem.h index 278ef847f9a67ee5e9232355e60ca9f1fdfbee98..d2b9006489de5ec7927f4f3f71e10c4b3c58b497 100644 --- a/src/MissionManager/CorridorScanComplexItem.h +++ b/src/MissionManager/CorridorScanComplexItem.h @@ -65,7 +65,8 @@ private slots: // Overrides from TransectStyleComplexItem void _rebuildTransectsPhase1 (void) final; - void _rebuildTransectsPhase2 (void) final; + void _recalcComplexDistance (void) final; + void _recalcCameraShots (void) final; private: int _transectCount (void) const; diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index 95d95814028da2e0a3b6c5c1baa438a291c838e8..b26ab892b3e288fa62743c2c7d9bbedb008e9be3 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -144,6 +144,12 @@ bool SurveyComplexItem::load(const QJsonObject& complexObject, int sequenceNumbe if (!_loadV4V5(complexObject, sequenceNumber, errorString, version)) { return false; } + + _recalcComplexDistance(); + if (_cameraShots == 0) { + // Shot count was possibly not available from plan file + _recalcCameraShots(); + } } else { // Must be v2 or v3 QJsonObject v3ComplexObject = complexObject; @@ -157,9 +163,10 @@ bool SurveyComplexItem::load(const QJsonObject& complexObject, int sequenceNumbe if (!_loadV3(complexObject, sequenceNumber, errorString)) { return false; } - } - _rebuildTransects(); + // V2/3 doesn't include individual items so we need to rebuild manually + _rebuildTransects(); + } return true; } @@ -1384,42 +1391,78 @@ void SurveyComplexItem::_rebuildTransectsFromPolygon(bool refly, const QPolygonF qCDebug(SurveyComplexItemLog) << "_transects.size() " << _transects.size(); } -void SurveyComplexItem::_rebuildTransectsPhase2(void) +void SurveyComplexItem::_recalcComplexDistance(void) { - // Calculate distance flown for complex item _complexDistance = 0; for (int i=0; i<_visualTransectPoints.count() - 1; i++) { _complexDistance += _visualTransectPoints[i].value().distanceTo(_visualTransectPoints[i+1].value()); } + emit complexDistanceChanged(); +} + +void SurveyComplexItem::_recalcCameraShots(void) +{ + double triggerDistance = this->triggerDistance(); - if (triggerDistance() == 0) { + if (triggerDistance == 0) { _cameraShots = 0; } else { if (_cameraTriggerInTurnAroundFact.rawValue().toBool()) { - _cameraShots = qCeil(_complexDistance / triggerDistance()); + _cameraShots = qCeil(_complexDistance / triggerDistance); } else { _cameraShots = 0; - for (const QList& transect: _transects) { - QGeoCoordinate firstCameraCoord, lastCameraCoord; - if (_hasTurnaround()) { - firstCameraCoord = transect[1].coord; - lastCameraCoord = transect[transect.count() - 2].coord; + + if (_loadedMissionItemsParent) { + // We have to do it the hard way based on the mission items themselves + if (hoverAndCaptureEnabled()) { + // Count the number of camera triggers in the mission items + for (const MissionItem* missionItem: _loadedMissionItems) { + _cameraShots += missionItem->command() == MAV_CMD_IMAGE_START_CAPTURE ? 1 : 0; + } } else { - firstCameraCoord = transect.first().coord; - lastCameraCoord = transect.last().coord; + bool waitingForTriggerStop = false; + QGeoCoordinate distanceStartCoord; + QGeoCoordinate distanceEndCoord; + for (const MissionItem* missionItem: _loadedMissionItems) { + if (missionItem->command() == MAV_CMD_NAV_WAYPOINT) { + if (waitingForTriggerStop) { + distanceEndCoord = QGeoCoordinate(missionItem->param5(), missionItem->param6()); + } else { + distanceStartCoord = QGeoCoordinate(missionItem->param5(), missionItem->param6()); + } + } else if (missionItem->command() == MAV_CMD_DO_SET_CAM_TRIGG_DIST) { + if (missionItem->param1() > 0) { + // Trigger start + waitingForTriggerStop = true; + } else { + // Trigger stop + waitingForTriggerStop = false; + _cameraShots += qCeil(distanceEndCoord.distanceTo(distanceStartCoord) / triggerDistance); + distanceStartCoord = QGeoCoordinate(); + distanceEndCoord = QGeoCoordinate(); + } + } + } + + } + } else { + // We have transects available, calc from those + for (const QList& transect: _transects) { + QGeoCoordinate firstCameraCoord, lastCameraCoord; + if (_hasTurnaround() && !hoverAndCaptureEnabled()) { + firstCameraCoord = transect[1].coord; + lastCameraCoord = transect[transect.count() - 2].coord; + } else { + firstCameraCoord = transect.first().coord; + lastCameraCoord = transect.last().coord; + } + _cameraShots += qCeil(firstCameraCoord.distanceTo(lastCameraCoord) / triggerDistance); } - _cameraShots += qCeil(firstCameraCoord.distanceTo(lastCameraCoord) / triggerDistance()); } } } - _coordinate = _visualTransectPoints.count() ? _visualTransectPoints.first().value() : QGeoCoordinate(); - _exitCoordinate = _visualTransectPoints.count() ? _visualTransectPoints.last().value() : QGeoCoordinate(); - emit cameraShotsChanged(); - emit complexDistanceChanged(); - emit coordinateChanged(_coordinate); - emit exitCoordinateChanged(_exitCoordinate); } // FIXME: This same exact code is in Corridor Scan. Move to TransectStyleComplex? diff --git a/src/MissionManager/SurveyComplexItem.h b/src/MissionManager/SurveyComplexItem.h index 8bac39b8905c7dd2d4b385f1c565abd19e2618be..eda8ef30b5956fa63592b1f51710616bbcb70fa2 100644 --- a/src/MissionManager/SurveyComplexItem.h +++ b/src/MissionManager/SurveyComplexItem.h @@ -78,8 +78,9 @@ signals: private slots: // Overrides from TransectStyleComplexItem - void _rebuildTransectsPhase1(void) final; - void _rebuildTransectsPhase2(void) final; + void _rebuildTransectsPhase1 (void) final; + void _recalcComplexDistance (void) final; + void _recalcCameraShots (void) final; private: enum CameraTriggerCode { diff --git a/src/MissionManager/TransectStyleComplexItem.cc b/src/MissionManager/TransectStyleComplexItem.cc index 7e4a03c3a9854ca0ec5ee75ccbc813d5009b05d1..156818403f047e31ea17807fb6b567ca7f8877f7 100644 --- a/src/MissionManager/TransectStyleComplexItem.cc +++ b/src/MissionManager/TransectStyleComplexItem.cc @@ -35,6 +35,7 @@ const char* TransectStyleComplexItem::_jsonCameraCalcKey = "Cam const char* TransectStyleComplexItem::_jsonVisualTransectPointsKey = "VisualTransectPoints"; const char* TransectStyleComplexItem::_jsonItemsKey = "Items"; const char* TransectStyleComplexItem::_jsonFollowTerrainKey = "FollowTerrain"; +const char* TransectStyleComplexItem::_jsonCameraShotsKey = "CameraShots"; const int TransectStyleComplexItem::_terrainQueryTimeoutMsecs = 1000; @@ -139,6 +140,7 @@ void TransectStyleComplexItem::_save(QJsonObject& complexObject) innerObject[hoverAndCaptureName] = _hoverAndCaptureFact.rawValue().toBool(); innerObject[refly90DegreesName] = _refly90DegreesFact.rawValue().toBool(); innerObject[_jsonFollowTerrainKey] = _followTerrain; + innerObject[_jsonCameraShotsKey] = _cameraShots; if (_followTerrain) { innerObject[terrainAdjustToleranceName] = _terrainAdjustToleranceFact.rawValue().toDouble(); @@ -209,9 +211,10 @@ bool TransectStyleComplexItem::_load(const QJsonObject& complexObject, QString& { hoverAndCaptureName, QJsonValue::Bool, true }, { refly90DegreesName, QJsonValue::Bool, true }, { _jsonCameraCalcKey, QJsonValue::Object, true }, - { _jsonVisualTransectPointsKey, QJsonValue::Array, true }, + { _jsonVisualTransectPointsKey, QJsonValue::Array, true }, { _jsonItemsKey, QJsonValue::Array, true }, { _jsonFollowTerrainKey, QJsonValue::Bool, true }, + { _jsonCameraShotsKey, QJsonValue::Double, false }, // Not required since it was missing from initial implementation }; if (!JsonHelper::validateKeys(innerObject, innerKeyInfoList, errorString)) { return false; @@ -249,6 +252,12 @@ bool TransectStyleComplexItem::_load(const QJsonObject& complexObject, QString& _refly90DegreesFact.setRawValue (innerObject[refly90DegreesName].toBool()); _followTerrain = innerObject[_jsonFollowTerrainKey].toBool(); + // These two keys where not included in initial implementation so they are optional. Without them the values will be + // incorrect when loaded though. + if (innerObject.contains(_jsonCameraShotsKey)) { + _cameraShots = innerObject[_jsonCameraShotsKey].toInt(); + } + if (_followTerrain) { QList followTerrainKeyInfoList = { { terrainAdjustToleranceName, QJsonValue::Double, true }, @@ -394,7 +403,8 @@ void TransectStyleComplexItem::_rebuildTransects(void) emit coordinateChanged(_coordinate); emit exitCoordinateChanged(_exitCoordinate); - _rebuildTransectsPhase2(); + _recalcComplexDistance(); + _recalcCameraShots(); emit lastSequenceNumberChanged(lastSequenceNumber()); emit timeBetweenShotsChanged(); diff --git a/src/MissionManager/TransectStyleComplexItem.h b/src/MissionManager/TransectStyleComplexItem.h index d392f6ea73e8fda9aa452965b2ada203308a3d82..977f1228e29d464f86cac19df4f6774ecfec87e0 100644 --- a/src/MissionManager/TransectStyleComplexItem.h +++ b/src/MissionManager/TransectStyleComplexItem.h @@ -129,9 +129,6 @@ signals: void followTerrainChanged (bool followTerrain); protected slots: - virtual void _rebuildTransectsPhase1 (void) = 0; ///< Rebuilds the _transects array - virtual void _rebuildTransectsPhase2 (void) = 0; ///< Adjust values associated with _transects array - void _setDirty (void); void _setIfDirty (bool dirty); void _updateCoordinateAltitudes (void); @@ -139,6 +136,10 @@ protected slots: void _rebuildTransects (void); protected: + virtual void _rebuildTransectsPhase1 (void) = 0; ///< Rebuilds the _transects array + virtual void _recalcComplexDistance (void) = 0; + virtual void _recalcCameraShots (void) = 0; + void _save (QJsonObject& saveObject); bool _load (const QJsonObject& complexObject, QString& errorString); void _setExitCoordinate (const QGeoCoordinate& coordinate); @@ -197,6 +198,7 @@ protected: static const char* _jsonVisualTransectPointsKey; static const char* _jsonItemsKey; static const char* _jsonFollowTerrainKey; + static const char* _jsonCameraShotsKey; static const int _terrainQueryTimeoutMsecs; diff --git a/src/MissionManager/TransectStyleComplexItemTest.cc b/src/MissionManager/TransectStyleComplexItemTest.cc index 97242c6e7882a5bcabf8bc89b099860d64ce7753..e2ccd5bd3b289de391971c109faa667ece710660 100644 --- a/src/MissionManager/TransectStyleComplexItemTest.cc +++ b/src/MissionManager/TransectStyleComplexItemTest.cc @@ -115,10 +115,12 @@ void TransectStyleComplexItemTest::_testRebuildTransects(void) // lastSequenceNumberChanged signal _adjustSurveAreaPolygon(); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); - QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_transectStyleItem->recalcCameraShotsCalled); + QVERIFY(_transectStyleItem->recalcComplexDistanceCalled); QVERIFY(_multiSpy->checkSignalsByMask(coveredAreaChangedMask | lastSequenceNumberChangedMask)); _transectStyleItem->rebuildTransectsPhase1Called = false; - _transectStyleItem->rebuildTransectsPhase2Called = false; + _transectStyleItem->recalcCameraShotsCalled = false; + _transectStyleItem->recalcComplexDistanceCalled = false; _transectStyleItem->setDirty(false); _multiSpy->clearAllSignals(); @@ -136,30 +138,36 @@ void TransectStyleComplexItemTest::_testRebuildTransects(void) qDebug() << fact->name(); changeFactValue(fact); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); - QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_transectStyleItem->recalcCameraShotsCalled); + QVERIFY(_transectStyleItem->recalcComplexDistanceCalled); QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); _transectStyleItem->setDirty(false); _multiSpy->clearAllSignals(); _transectStyleItem->rebuildTransectsPhase1Called = false; - _transectStyleItem->rebuildTransectsPhase2Called = false; + _transectStyleItem->recalcCameraShotsCalled = false; + _transectStyleItem->recalcComplexDistanceCalled = false; } rgFacts.clear(); _transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(false); _transectStyleItem->rebuildTransectsPhase1Called = false; - _transectStyleItem->rebuildTransectsPhase2Called = false; + _transectStyleItem->recalcCameraShotsCalled = false; + _transectStyleItem->recalcComplexDistanceCalled = false; changeFactValue(_transectStyleItem->cameraCalc()->imageDensity()); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); - QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_transectStyleItem->recalcCameraShotsCalled); + QVERIFY(_transectStyleItem->recalcComplexDistanceCalled); QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); _multiSpy->clearAllSignals(); _transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(true); _transectStyleItem->rebuildTransectsPhase1Called = false; - _transectStyleItem->rebuildTransectsPhase2Called = false; + _transectStyleItem->recalcCameraShotsCalled = false; + _transectStyleItem->recalcComplexDistanceCalled = false; changeFactValue(_transectStyleItem->cameraCalc()->distanceToSurface()); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); - QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_transectStyleItem->recalcCameraShotsCalled); + QVERIFY(_transectStyleItem->recalcComplexDistanceCalled); QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); _multiSpy->clearAllSignals(); } @@ -219,7 +227,8 @@ void TransectStyleComplexItemTest::_testAltMode(void) TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent) : TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent) , rebuildTransectsPhase1Called (false) - , rebuildTransectsPhase2Called (false) + , recalcComplexDistanceCalled (false) + , recalcCameraShotsCalled (false) { } @@ -229,7 +238,12 @@ void TransectStyleItem::_rebuildTransectsPhase1(void) rebuildTransectsPhase1Called = true; } -void TransectStyleItem::_rebuildTransectsPhase2(void) +void TransectStyleItem::_recalcComplexDistance(void) { - rebuildTransectsPhase2Called = true; + recalcComplexDistanceCalled = true; +} + +void TransectStyleItem::_recalcCameraShots(void) +{ + recalcCameraShotsCalled = true; } diff --git a/src/MissionManager/TransectStyleComplexItemTest.h b/src/MissionManager/TransectStyleComplexItemTest.h index e0b00751e74d341f58ebdaa35d1dc73270a2a843..b85cb478658c559d63aa29663c91a09ecd0df411 100644 --- a/src/MissionManager/TransectStyleComplexItemTest.h +++ b/src/MissionManager/TransectStyleComplexItemTest.h @@ -97,10 +97,12 @@ public: double additionalTimeDelay (void) const final { return 0; } bool rebuildTransectsPhase1Called; - bool rebuildTransectsPhase2Called; + bool recalcComplexDistanceCalled; + bool recalcCameraShotsCalled; private slots: // Overrides from TransectStyleComplexItem - void _rebuildTransectsPhase1(void) final; - void _rebuildTransectsPhase2(void) final; + void _rebuildTransectsPhase1 (void) final; + void _recalcComplexDistance (void) final; + void _recalcCameraShots (void) final; };