diff --git a/src/Airmap/AirMapFlightPlanManager.cc b/src/Airmap/AirMapFlightPlanManager.cc index a7571aed1430343b1cd7046109e58aa1afedb20f..b42e55f2636e437e55499c6660c6e9f6aac147db 100644 --- a/src/Airmap/AirMapFlightPlanManager.cc +++ b/src/Airmap/AirMapFlightPlanManager.cc @@ -12,8 +12,9 @@ #include "AirMapRulesetsManager.h" #include "AirMapAdvisoryManager.h" #include "QGCApplication.h" +#include "SettingsManager.h" -#include "MissionController.h" +#include "PlanMasterController.h" #include "QGCMAVLink.h" #include "airmap/pilots.h" @@ -72,7 +73,7 @@ AirMapFlightPlanManager::setFlightEndTime(QDateTime end) //----------------------------------------------------------------------------- void -AirMapFlightPlanManager::createFlightPlan(MissionController* missionController) +AirMapFlightPlanManager::startFlightPlanning(PlanMasterController *planController) { if (!_shared.client()) { qCDebug(AirMapManagerLog) << "No AirMap client instance. Will not create a flight"; @@ -85,11 +86,10 @@ AirMapFlightPlanManager::createFlightPlan(MissionController* missionController) } //-- TODO: Check if there is an ongoing flight plan and do something about it (Delete it?) - _createPlan = true; - if(!_controller) { - _controller = missionController; + if(!_planController) { + _planController = planController; //-- Get notified of mission changes - connect(missionController, &MissionController::missionBoundingCubeChanged, this, &AirMapFlightPlanManager::_missionChanged); + connect(planController->missionController(), &MissionController::missionBoundingCubeChanged, this, &AirMapFlightPlanManager::_missionChanged); } } @@ -100,18 +100,21 @@ AirMapFlightPlanManager::_createFlightPlan() _flight.reset(); //-- Get flight bounding cube and prepare (box) polygon + QGCGeoBoundingCube bc = _planController->missionController()->travelBoundingCube(); + if(!bc.area()) { + //-- TODO: If single point, we need to set a point and a radius instead + return; + } - //-- TODO: If single point, we need to set a point and a radius instead - - QGCGeoBoundingCube bc = _controller->travelBoundingCube(); _flight.maxAltitude = fmax(bc.pointNW.altitude(), bc.pointSE.altitude()); - _flight.takeoffCoord = _controller->takeoffCoordinate(); + _flight.takeoffCoord = _planController->missionController()->takeoffCoordinate(); _flight.coords = bc.polygon2D(); + + //-- Flight Date/Time if(_flightStartTime.isNull() || _flightStartTime < QDateTime::currentDateTime()) { _flightStartTime = QDateTime::currentDateTime().addSecs(5 * 60); emit flightStartTimeChanged(); } - if(_flightEndTime.isNull() || _flightEndTime < _flightStartTime) { _flightEndTime = _flightStartTime.addSecs(30 * 60); emit flightEndTimeChanged(); @@ -469,11 +472,21 @@ AirMapFlightPlanManager::_deleteFlightPlan() void AirMapFlightPlanManager::_missionChanged() { + //-- Are we enabled? + if(!qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { + return; + } + //-- Do we have a license? + if(!_shared.hasAPIKey()) { + return; + } //-- Creating a new flight plan? - if(_createPlan) { - _createPlan = false; - _createFlightPlan(); + if(_state == State::Idle) { + if(_flightPlan.isEmpty()) { + _createFlightPlan(); + } else { + //-- Plan is being modified + // _updateFlightPlan(); + } } - //-- Plan is being modified - // _updateFlightPlan(); } diff --git a/src/Airmap/AirMapFlightPlanManager.h b/src/Airmap/AirMapFlightPlanManager.h index b13b56a002738d939b7866f758af7e7c58f8f80b..bf15bac5542c1ba062cde1c3b5cc584cc9a0e1ba 100644 --- a/src/Airmap/AirMapFlightPlanManager.h +++ b/src/Airmap/AirMapFlightPlanManager.h @@ -18,6 +18,8 @@ #include #include +class PlanMasterController; + //----------------------------------------------------------------------------- /// class to upload a flight class AirMapFlightPlanManager : public AirspaceFlightPlanProvider, public LifetimeChecker @@ -36,7 +38,7 @@ public: QmlObjectListModel* ruleSets () override { return &_rulesets; } AirspaceAdvisoryProvider::AdvisoryColor airspaceColor () override { return _airspaceColor; } - void createFlightPlan (MissionController* missionController) override; + void startFlightPlanning (PlanMasterController* planController) override; void setFlightStartTime (QDateTime start) override; void setFlightEndTime (QDateTime end) override; @@ -45,7 +47,7 @@ signals: private slots: void _pollBriefing (); - void _missionChanged (); + void _missionChanged (); private: void _uploadFlightPlan (); @@ -79,8 +81,7 @@ private: QTimer _pollTimer; ///< timer to poll for approval check QString _flightPlan; ///< Current flight plan QString _pilotID; ///< Pilot ID in the form "auth0|abc123" - MissionController* _controller = nullptr; - bool _createPlan = true; + PlanMasterController* _planController = nullptr; bool _valid = false; QDateTime _flightStartTime; QDateTime _flightEndTime; diff --git a/src/AirspaceManagement/AirspaceFlightPlanProvider.h b/src/AirspaceManagement/AirspaceFlightPlanProvider.h index 6d30a6ba407c596ccfabb0f7b724652aba081e63..4127ad40267c6b22029f7eabc1e6d08b486b848c 100644 --- a/src/AirspaceManagement/AirspaceFlightPlanProvider.h +++ b/src/AirspaceManagement/AirspaceFlightPlanProvider.h @@ -20,7 +20,7 @@ #include #include -class MissionController; +class PlanMasterController; //----------------------------------------------------------------------------- class AirspaceFlightPlanProvider : public QObject @@ -58,7 +58,7 @@ public: virtual void setFlightStartTime (QDateTime start) = 0; virtual void setFlightEndTime (QDateTime end) = 0; - virtual void createFlightPlan (MissionController* missionController) = 0; + virtual void startFlightPlanning (PlanMasterController* planController) = 0; signals: void flightPermitStatusChanged (); diff --git a/src/AirspaceManagement/AirspaceManager.h b/src/AirspaceManagement/AirspaceManager.h index d99e8a65f26628b1c7db6c39fb0e3d0faae22592..9ffb8ad99e3568a9537076e01f8fe178fd9ec071 100644 --- a/src/AirspaceManagement/AirspaceManager.h +++ b/src/AirspaceManagement/AirspaceManager.h @@ -40,6 +40,7 @@ class AirspaceRestrictionProvider; class AirspaceRulesetsProvider; class AirspaceVehicleManager; class AirspaceWeatherInfoProvider; +class PlanMasterController; class QGCApplication; class Vehicle; diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index bc410065bcca4aa4489b6de5b7e1a52498b3f433..96ca4a8b319525a4dfa669c055d0dd93f2904aba 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -199,13 +199,6 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque _initAllVisualItems(); _updateContainsItems(); emit newItemsFromVehicle(); - - //-- If airspace management enabled, create new flight -#if defined(QGC_AIRMAP_ENABLED) - if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { - qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this); - } -#endif } _itemsRequested = false; } @@ -367,14 +360,6 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) _visualItems->insert(i, newItem); _recalcAll(); - - //-- If airspace management enabled and this is the first item, create new flight -#if defined(QGC_AIRMAP_ENABLED) - if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { - qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this); - } -#endif - return newItem->sequenceNumber(); } @@ -461,13 +446,6 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate _visualItems->insert(i, newItem); _recalcAll(); - //-- If airspace management enabled and this is the first item, create new flight -#if defined(QGC_AIRMAP_ENABLED) - if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { - qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this); - } -#endif - return newItem->sequenceNumber(); } diff --git a/src/MissionManager/PlanMasterController.cc b/src/MissionManager/PlanMasterController.cc index 7896e4c7c8b93fd593cfb47947a31dad31b5a580..7d6db3f03199140b4fdc6aebe71b216a9148df4a 100644 --- a/src/MissionManager/PlanMasterController.cc +++ b/src/MissionManager/PlanMasterController.cc @@ -71,6 +71,13 @@ void PlanMasterController::start(bool editMode) connect(_multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &PlanMasterController::_activeVehicleChanged); _activeVehicleChanged(_multiVehicleMgr->activeVehicle()); + +#if defined(QGC_AIRMAP_ENABLED) + //-- This assumes there is one single instance of PlanMasterController in edit mode. + if(editMode) { + qgcApp()->toolbox()->airspaceManager()->flightPlan()->startFlightPlanning(this); + } +#endif } void PlanMasterController::startStaticActiveVehicle(Vehicle* vehicle) @@ -123,6 +130,7 @@ void PlanMasterController::_activeVehicleChanged(Vehicle* activeVehicle) connect(_managerVehicle->geoFenceManager(), &GeoFenceManager::sendComplete, this, &PlanMasterController::_sendGeoFenceComplete); connect(_managerVehicle->rallyPointManager(), &RallyPointManager::sendComplete, this, &PlanMasterController::_sendRallyPointsComplete); } + if (newOffline != _offline) { _offline = newOffline; emit offlineEditingChanged(newOffline); @@ -169,7 +177,7 @@ void PlanMasterController::loadFromVehicle(void) } else if (syncInProgress()) { qCWarning(PlanMasterControllerLog) << "PlanMasterController::loadFromVehicle called while syncInProgress"; } else { - _loadGeoFence = true; + _loadGeoFence = true; _syncInProgress = true; emit syncInProgressChanged(true); qCDebug(PlanMasterControllerLog) << "PlanMasterController::loadFromVehicle _missionController.loadFromVehicle"; @@ -504,7 +512,7 @@ void PlanMasterController::_showPlanFromManagerVehicle(void) _managerVehicle->forceInitialPlanRequestComplete(); } - // The crazy if structure is to handle the load propogating by itself through the system + // The crazy if structure is to handle the load propagating by itself through the system if (!_missionController.showPlanFromManagerVehicle()) { if (!_geoFenceController.showPlanFromManagerVehicle()) { _rallyPointController.showPlanFromManagerVehicle();