From de969afa392a56d50d0cbfc562291dd989aea148 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Sun, 27 May 2018 20:11:26 -0700 Subject: [PATCH] Camera/Transects unit tests and fixes --- src/MissionManager/CameraCalcTest.cc | 47 ++++++++++++++++- src/MissionManager/CameraCalcTest.h | 4 +- src/MissionManager/CorridorScanComplexItem.cc | 5 ++ src/MissionManager/CorridorScanComplexItem.h | 9 ++-- src/MissionManager/SurveyComplexItem.cc | 6 +++ src/MissionManager/SurveyComplexItem.h | 1 + .../TransectStyleComplexItem.cc | 6 +-- src/MissionManager/TransectStyleComplexItem.h | 3 +- .../TransectStyleComplexItemTest.cc | 51 ++++++++++++++----- .../TransectStyleComplexItemTest.h | 11 ++-- src/qgcunittest/UnitTest.cc | 7 ++- src/qgcunittest/UnitTest.h | 3 +- 12 files changed, 120 insertions(+), 33 deletions(-) diff --git a/src/MissionManager/CameraCalcTest.cc b/src/MissionManager/CameraCalcTest.cc index a7ac92422..d6fa3dcb0 100644 --- a/src/MissionManager/CameraCalcTest.cc +++ b/src/MissionManager/CameraCalcTest.cc @@ -22,6 +22,8 @@ void CameraCalcTest::init(void) _offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); _cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this); + _cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName()); + _cameraCalc->setDirty(false); _rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); _rgSignals[imageFootprintSideChangedIndex] = SIGNAL(imageFootprintSideChanged(double)); @@ -80,11 +82,52 @@ void CameraCalcTest::_testDirty(void) } rgFacts.clear(); - _cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName()); + + _cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative()); QVERIFY(_cameraCalc->dirty()); _multiSpy->clearAllSignals(); - _cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative()); + _cameraCalc->cameraName()->setRawValue(_cameraCalc->manualCameraName()); QVERIFY(_cameraCalc->dirty()); _multiSpy->clearAllSignals(); } + +void CameraCalcTest::_testAdjustedFootprint(void) +{ + double adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble(); + double adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble(); + _cameraCalc->valueSetIsDistance()->setRawValue(true); + changeFactValue(_cameraCalc->distanceToSurface()); + QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble()); + QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble()); + + adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble(); + adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble(); + _cameraCalc->valueSetIsDistance()->setRawValue(false); + changeFactValue(_cameraCalc->imageDensity()); + QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble()); + QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble()); + + adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble(); + _cameraCalc->valueSetIsDistance()->setRawValue(true); + changeFactValue(_cameraCalc->frontalOverlap()); + QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble()); + + adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble(); + _cameraCalc->valueSetIsDistance()->setRawValue(false); + changeFactValue(_cameraCalc->sideOverlap()); + QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble()); +} + +void CameraCalcTest::_testAltDensityRecalc(void) +{ + _cameraCalc->valueSetIsDistance()->setRawValue(true); + double imageDensity = _cameraCalc->imageDensity()->rawValue().toDouble(); + _cameraCalc->distanceToSurface()->setRawValue(_cameraCalc->distanceToSurface()->rawValue().toDouble() + 1); + QVERIFY(imageDensity != _cameraCalc->imageDensity()->rawValue().toDouble()); + + _cameraCalc->valueSetIsDistance()->setRawValue(false); + double distanceToSurface = _cameraCalc->distanceToSurface()->rawValue().toDouble(); + _cameraCalc->imageDensity()->setRawValue(_cameraCalc->imageDensity()->rawValue().toDouble() + 1); + QVERIFY(distanceToSurface != _cameraCalc->distanceToSurface()->rawValue().toDouble()); +} diff --git a/src/MissionManager/CameraCalcTest.h b/src/MissionManager/CameraCalcTest.h index c493f9e1c..3692a0cbb 100644 --- a/src/MissionManager/CameraCalcTest.h +++ b/src/MissionManager/CameraCalcTest.h @@ -27,7 +27,9 @@ protected: void cleanup(void) final; private slots: - void _testDirty(void); + void _testDirty (void); + void _testAdjustedFootprint (void); + void _testAltDensityRecalc (void); private: enum { diff --git a/src/MissionManager/CorridorScanComplexItem.cc b/src/MissionManager/CorridorScanComplexItem.cc index 5d8bff23e..5db1c50f8 100644 --- a/src/MissionManager/CorridorScanComplexItem.cc +++ b/src/MissionManager/CorridorScanComplexItem.cc @@ -480,3 +480,8 @@ bool CorridorScanComplexItem::readyForSave(void) const { return TransectStyleComplexItem::readyForSave(); } + +double CorridorScanComplexItem::timeBetweenShots(void) +{ + return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed; +} diff --git a/src/MissionManager/CorridorScanComplexItem.h b/src/MissionManager/CorridorScanComplexItem.h index 0903dc4c4..4a1144029 100644 --- a/src/MissionManager/CorridorScanComplexItem.h +++ b/src/MissionManager/CorridorScanComplexItem.h @@ -33,15 +33,16 @@ public: Q_INVOKABLE void rotateEntryPoint(void); - // Overrides from ComplexMissionItem - bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; - QString mapVisualQML (void) const final { return QStringLiteral("CorridorScanMapVisual.qml"); } - // Overrides from TransectStyleComplexItem void save (QJsonArray& planItems) final; bool specifiesCoordinate (void) const final; void appendMissionItems (QList& items, QObject* missionItemParent) final; void applyNewAltitude (double newAltitude) final; + double timeBetweenShots (void) final; + + // Overrides from ComplexMissionItem + bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; + QString mapVisualQML (void) const final { return QStringLiteral("CorridorScanMapVisual.qml"); } // Overrides from VisualMissionionItem QString commandDescription (void) const final { return tr("Corridor Scan"); } diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index bb33b19cb..bd246983f 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -1433,3 +1433,9 @@ void SurveyComplexItem::rotateEntryPoint(void) setDirty(true); } + +double SurveyComplexItem::timeBetweenShots(void) +{ + return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble() / _cruiseSpeed; +} + diff --git a/src/MissionManager/SurveyComplexItem.h b/src/MissionManager/SurveyComplexItem.h index 89761cf0f..f65f11d68 100644 --- a/src/MissionManager/SurveyComplexItem.h +++ b/src/MissionManager/SurveyComplexItem.h @@ -40,6 +40,7 @@ public: bool specifiesCoordinate (void) const final { return true; } void appendMissionItems (QList& items, QObject* missionItemParent) final; void applyNewAltitude (double newAltitude) final; + double timeBetweenShots (void) final; // Overrides from VisualMissionionItem QString commandDescription (void) const final { return tr("Survey"); } diff --git a/src/MissionManager/TransectStyleComplexItem.cc b/src/MissionManager/TransectStyleComplexItem.cc index 7d7ec508a..b6cc4278a 100644 --- a/src/MissionManager/TransectStyleComplexItem.cc +++ b/src/MissionManager/TransectStyleComplexItem.cc @@ -309,11 +309,6 @@ void TransectStyleComplexItem::applyNewAltitude(double newAltitude) //_altitudeFact.setRawValue(newAltitude); } -double TransectStyleComplexItem::timeBetweenShots(void) -{ - return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed; -} - void TransectStyleComplexItem::_updateCoordinateAltitudes(void) { emit coordinateChanged(coordinate()); @@ -383,6 +378,7 @@ void TransectStyleComplexItem::_rebuildTransects(void) _rebuildTransectsPhase2(); emit lastSequenceNumberChanged(lastSequenceNumber()); + emit timeBetweenShotsChanged(); } void TransectStyleComplexItem::_queryTransectsPathHeightInfo(void) diff --git a/src/MissionManager/TransectStyleComplexItem.h b/src/MissionManager/TransectStyleComplexItem.h index 5f3eb343d..b3ac6d499 100644 --- a/src/MissionManager/TransectStyleComplexItem.h +++ b/src/MissionManager/TransectStyleComplexItem.h @@ -59,12 +59,13 @@ public: Fact* terrainAdjustMaxClimbRate (void) { return &_terrainAdjustMaxDescentRateFact; } int cameraShots (void) const { return _cameraShots; } - double timeBetweenShots (void); double coveredArea (void) const; double cameraMinTriggerInterval(void) const { return _cameraMinTriggerInterval; } bool hoverAndCaptureAllowed (void) const; bool followTerrain (void) const { return _followTerrain; } + virtual double timeBetweenShots (void) { return 0; } // Most be overridden. Implementation here is needed for unit testing. + void setFollowTerrain(bool followTerrain); // Overrides from ComplexMissionItem diff --git a/src/MissionManager/TransectStyleComplexItemTest.cc b/src/MissionManager/TransectStyleComplexItemTest.cc index cd95af35a..75a63e19d 100644 --- a/src/MissionManager/TransectStyleComplexItemTest.cc +++ b/src/MissionManager/TransectStyleComplexItemTest.cc @@ -25,6 +25,10 @@ void TransectStyleComplexItemTest::init(void) _offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); _transectStyleItem = new TransectStyleItem(_offlineVehicle, this); + _transectStyleItem->cameraTriggerInTurnAround()->setRawValue(false); + _transectStyleItem->cameraCalc()->cameraName()->setRawValue(_transectStyleItem->cameraCalc()->customCameraName()); + _transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(true); + _transectStyleItem->cameraCalc()->distanceToSurface()->setRawValue(100); _setSurveyAreaPolygon(); _transectStyleItem->setDirty(false); @@ -107,36 +111,58 @@ void TransectStyleComplexItemTest::_setSurveyAreaPolygon(void) void TransectStyleComplexItemTest::_testRebuildTransects(void) { // Changing the survey polygon should trigger: - // _rebuildTransects call + // _rebuildTransects calls // coveredAreaChanged signal // lastSequenceNumberChanged signal _adjustSurveAreaPolygon(); - QVERIFY(_transectStyleItem->rebuildTransectsCalled); + QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); + QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); QVERIFY(_multiSpy->checkSignalsByMask(coveredAreaChangedMask | lastSequenceNumberChangedMask)); - _transectStyleItem->rebuildTransectsCalled = false; + _transectStyleItem->rebuildTransectsPhase1Called = false; + _transectStyleItem->rebuildTransectsPhase2Called = false; _transectStyleItem->setDirty(false); _multiSpy->clearAllSignals(); // Changes to these facts should trigger: - // _rebuildTransects call + // _rebuildTransects calls // lastSequenceNumberChanged signal QList rgFacts; rgFacts << _transectStyleItem->turnAroundDistance() << _transectStyleItem->cameraTriggerInTurnAround() << _transectStyleItem->hoverAndCapture() << _transectStyleItem->refly90Degrees() - << _transectStyleItem->cameraCalc()->adjustedFootprintSide() - << _transectStyleItem->cameraCalc()->adjustedFootprintFrontal(); + << _transectStyleItem->cameraCalc()->frontalOverlap() + << _transectStyleItem->cameraCalc()->sideOverlap(); foreach(Fact* fact, rgFacts) { qDebug() << fact->name(); changeFactValue(fact); - QVERIFY(_transectStyleItem->rebuildTransectsCalled); + QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); + QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); _transectStyleItem->setDirty(false); _multiSpy->clearAllSignals(); - _transectStyleItem->rebuildTransectsCalled = false; + _transectStyleItem->rebuildTransectsPhase1Called = false; + _transectStyleItem->rebuildTransectsPhase2Called = false; } rgFacts.clear(); + + _transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(false); + _transectStyleItem->rebuildTransectsPhase1Called = false; + _transectStyleItem->rebuildTransectsPhase2Called = false; + changeFactValue(_transectStyleItem->cameraCalc()->imageDensity()); + QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); + QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); + _multiSpy->clearAllSignals(); + + _transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(true); + _transectStyleItem->rebuildTransectsPhase1Called = false; + _transectStyleItem->rebuildTransectsPhase2Called = false; + changeFactValue(_transectStyleItem->cameraCalc()->distanceToSurface()); + QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called); + QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called); + QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); + _multiSpy->clearAllSignals(); } void TransectStyleComplexItemTest::_testDistanceSignalling(void) @@ -192,18 +218,19 @@ void TransectStyleComplexItemTest::_testAltMode(void) } TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent) - : TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent) - , rebuildTransectsCalled (false) + : TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent) + , rebuildTransectsPhase1Called (false) + , rebuildTransectsPhase2Called (false) { } void TransectStyleItem::_rebuildTransectsPhase1(void) { - rebuildTransectsCalled = true; + rebuildTransectsPhase1Called = true; } void TransectStyleItem::_rebuildTransectsPhase2(void) { - + rebuildTransectsPhase2Called = true; } diff --git a/src/MissionManager/TransectStyleComplexItemTest.h b/src/MissionManager/TransectStyleComplexItemTest.h index d8665dccc..d648e42d1 100644 --- a/src/MissionManager/TransectStyleComplexItemTest.h +++ b/src/MissionManager/TransectStyleComplexItemTest.h @@ -29,10 +29,10 @@ protected: void cleanup(void) final; private slots: - void _testDirty (void); - void _testRebuildTransects (void); - void _testDistanceSignalling (void); - void _testAltMode (void); + void _testDirty (void); + void _testRebuildTransects (void); + void _testDistanceSignalling(void); + void _testAltMode (void); private: void _setSurveyAreaPolygon (void); @@ -97,7 +97,8 @@ public: void appendMissionItems (QList& items, QObject* missionItemParent) final { Q_UNUSED(items); Q_UNUSED(missionItemParent); } void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); } - bool rebuildTransectsCalled; + bool rebuildTransectsPhase1Called; + bool rebuildTransectsPhase2Called; private slots: // Overrides from TransectStyleComplexItem diff --git a/src/qgcunittest/UnitTest.cc b/src/qgcunittest/UnitTest.cc index bf0f0854c..a39b8cd4d 100644 --- a/src/qgcunittest/UnitTest.cc +++ b/src/qgcunittest/UnitTest.cc @@ -524,11 +524,14 @@ bool UnitTest::doubleNaNCompare(double value1, double value2) } } -void UnitTest::changeFactValue(Fact* fact) +void UnitTest::changeFactValue(Fact* fact,double increment) { if (fact->typeIsBool()) { fact->setRawValue(!fact->rawValue().toBool()); } else { - fact->setRawValue(fact->rawValue().toDouble() + 1); + if (increment == 0) { + increment = 1; + } + fact->setRawValue(fact->rawValue().toDouble() + increment); } } diff --git a/src/qgcunittest/UnitTest.h b/src/qgcunittest/UnitTest.h index 6690284e6..34b18484e 100644 --- a/src/qgcunittest/UnitTest.h +++ b/src/qgcunittest/UnitTest.h @@ -98,7 +98,8 @@ public: static bool doubleNaNCompare(double value1, double value2); /// Changes the Facts rawValue such that it emits a valueChanged signal. - void changeFactValue(Fact* fact); + /// @param increment 0 use standard increment, other increment by specified amount if double value + void changeFactValue(Fact* fact, double increment = 0); protected slots: -- 2.22.0