diff --git a/src/FlightDisplay/FlyViewMap.qml b/src/FlightDisplay/FlyViewMap.qml index acff58b..202824f 100644 --- a/src/FlightDisplay/FlyViewMap.qml +++ b/src/FlightDisplay/FlyViewMap.qml @@ -286,7 +286,7 @@ FlightMap { PlanMapItems { map: _root largeMapView: !pipMode - planMasterController: _planMasterController + planMasterController: masterController vehicle: _vehicle property var _vehicle: object diff --git a/src/MissionManager/PlanMasterController.cc b/src/MissionManager/PlanMasterController.cc index ad4e6f9..f40cd9d 100644 --- a/src/MissionManager/PlanMasterController.cc +++ b/src/MissionManager/PlanMasterController.cc @@ -127,9 +127,9 @@ void PlanMasterController::_activeVehicleChanged(Vehicle* activeVehicle) if (_managerVehicle) { // Disconnect old vehicle. Be careful of wildcarding disconnect too much since _managerVehicle may equal _controllerVehicle - disconnect(_managerVehicle->missionManager(), nullptr, nullptr, nullptr); - disconnect(_managerVehicle->geoFenceManager(), nullptr, nullptr, nullptr); - disconnect(_managerVehicle->rallyPointManager(), nullptr, nullptr, nullptr); + disconnect(_managerVehicle->missionManager(), nullptr, this, nullptr); + disconnect(_managerVehicle->geoFenceManager(), nullptr, this, nullptr); + disconnect(_managerVehicle->rallyPointManager(), nullptr, this, nullptr); } bool newOffline = false; diff --git a/src/MissionManager/PlanMasterControllerTest.cc b/src/MissionManager/PlanMasterControllerTest.cc index 4b8fe69..a89db4c 100644 --- a/src/MissionManager/PlanMasterControllerTest.cc +++ b/src/MissionManager/PlanMasterControllerTest.cc @@ -15,11 +15,12 @@ #include "QGCApplication.h" #include "SettingsManager.h" #include "AppSettings.h" +#include "MultiSignalSpyV2.h" PlanMasterControllerTest::PlanMasterControllerTest(void) : _masterController(nullptr) { - + } void PlanMasterControllerTest::init(void) @@ -50,3 +51,33 @@ void PlanMasterControllerTest::_testMissionPlannerFileLoad(void) _masterController->loadFromFile(":/unittest/MissionPlanner.waypoints"); QCOMPARE(_masterController->missionController()->visualItems()->count(), 6); } + +void PlanMasterControllerTest::_testActiveVehicleChanged(void) { + // There was a defect where the PlanMasterController would, upon a new active vehicle, + // overzelously disconnect all subscribers interested in the outgoing active vechicle. + Vehicle* outgoingManagerVehicle = _masterController->managerVehicle(); + + // spyMissionManager emulates a subscriber that should not be disconnected when + // the active vehicle changes + MultiSignalSpyV2 spyMissionManager; + spyMissionManager.init(outgoingManagerVehicle->missionManager()); + MultiSignalSpyV2 spyMasterController; + spyMasterController.init(_masterController); + + // Since MissionManager works with actual vehicles (which we don't have in the test cycle) + // we have to be a bit creative emulating a signal emitted by a MissionManager. + emit outgoingManagerVehicle->missionManager()->error(0,""); + auto missionManagerErrorSignalMask = spyMissionManager.signalNameToMask("error"); + QVERIFY(spyMissionManager.checkOnlySignalByMask(missionManagerErrorSignalMask)); + spyMissionManager.clearSignal("error"); + QVERIFY(spyMissionManager.checkNoSignals()); + + _connectMockLink(MAV_AUTOPILOT_PX4); + auto masterControllerMgrVehicleChanged = spyMasterController.signalNameToMask("managerVehicleChanged"); + QVERIFY(spyMasterController.checkSignalByMask(masterControllerMgrVehicleChanged)); + + emit outgoingManagerVehicle->missionManager()->error(0,""); + // This signal was affected by the defect - it wouldn't reach the subscriber. Here + // we make sure it does. + QVERIFY(spyMissionManager.checkOnlySignalByMask(missionManagerErrorSignalMask)); +} diff --git a/src/MissionManager/PlanMasterControllerTest.h b/src/MissionManager/PlanMasterControllerTest.h index 1b368a3..c93aa13 100644 --- a/src/MissionManager/PlanMasterControllerTest.h +++ b/src/MissionManager/PlanMasterControllerTest.h @@ -23,7 +23,7 @@ class PlanMasterControllerTest : public UnitTest { Q_OBJECT - + public: PlanMasterControllerTest(void); @@ -33,6 +33,7 @@ private slots: void _testMissionFileLoad(void); void _testMissionPlannerFileLoad(void); + void _testActiveVehicleChanged(void); private: PlanMasterController* _masterController;