Commit 98088b35 authored by Gus Grubba's avatar Gus Grubba

Make PlanMasterController in charge of initializing Airspace flight planning.

parent abab26cc
......@@ -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();
}
......@@ -18,6 +18,8 @@
#include <QList>
#include <QGeoCoordinate>
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;
......
......@@ -20,7 +20,7 @@
#include <QObject>
#include <QDateTime>
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 ();
......
......@@ -40,6 +40,7 @@ class AirspaceRestrictionProvider;
class AirspaceRulesetsProvider;
class AirspaceVehicleManager;
class AirspaceWeatherInfoProvider;
class PlanMasterController;
class QGCApplication;
class Vehicle;
......
......@@ -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();
}
......
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment