Commit f4731132 authored by Gus Grubba's avatar Gus Grubba

Attempt and updating a flight plan (API seems broken)

parent abbb4d4c
...@@ -20,6 +20,18 @@ ...@@ -20,6 +20,18 @@
class MissionItem; class MissionItem;
/*
* TODO: This is here for reference. It will have to modifed quite a bit before it
* can be used. This was the original file that combined both the creation of a
* flight plan and immediate submission of a flight. The flight plan is now handled
* by its own class. This now needs to be made into a proper "Flight Manager".
*/
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/// class to upload a flight /// class to upload a flight
class AirMapFlightManager : public QObject, public LifetimeChecker class AirMapFlightManager : public QObject, public LifetimeChecker
......
...@@ -29,11 +29,42 @@ AirMapFlightPlanManager::AirMapFlightPlanManager(AirMapSharedState& shared, QObj ...@@ -29,11 +29,42 @@ AirMapFlightPlanManager::AirMapFlightPlanManager(AirMapSharedState& shared, QObj
, _shared(shared) , _shared(shared)
{ {
connect(&_pollTimer, &QTimer::timeout, this, &AirMapFlightPlanManager::_pollBriefing); connect(&_pollTimer, &QTimer::timeout, this, &AirMapFlightPlanManager::_pollBriefing);
//-- Set some valid, initial start/end time
_flightStartTime = QDateTime::currentDateTime().addSecs(10 * 60);
_flightEndTime = _flightStartTime.addSecs(30 * 60);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
AirMapFlightPlanManager::createFlight(MissionController* missionController) AirMapFlightPlanManager::setFlightStartTime(QDateTime start)
{
if(_flightStartTime != start) {
//-- Can't start in the past
if(start < QDateTime::currentDateTime()) {
start = QDateTime::currentDateTime().addSecs(5 * 60);
}
_flightStartTime = start;
emit flightStartTimeChanged();
}
}
//-----------------------------------------------------------------------------
void
AirMapFlightPlanManager::setFlightEndTime(QDateTime end)
{
if(_flightEndTime != end) {
//-- End has to be after start
if(end < _flightStartTime) {
end = _flightStartTime.addSecs(30 * 60);
}
_flightEndTime = end;
emit flightEndTimeChanged();
}
}
//-----------------------------------------------------------------------------
void
AirMapFlightPlanManager::createFlightPlan(MissionController* missionController)
{ {
if (!_shared.client()) { if (!_shared.client()) {
qCDebug(AirMapManagerLog) << "No AirMap client instance. Will not create a flight"; qCDebug(AirMapManagerLog) << "No AirMap client instance. Will not create a flight";
...@@ -49,7 +80,8 @@ AirMapFlightPlanManager::createFlight(MissionController* missionController) ...@@ -49,7 +80,8 @@ AirMapFlightPlanManager::createFlight(MissionController* missionController)
_createPlan = true; _createPlan = true;
if(!_controller) { if(!_controller) {
_controller = missionController; _controller = missionController;
connect(missionController, &MissionController::missionBoundingCubeChanged, this, &AirMapFlightPlanManager::_missionBoundingCubeChanged); //-- Get notified of mission changes
connect(missionController, &MissionController::missionBoundingCubeChanged, this, &AirMapFlightPlanManager::_missionChanged);
} }
} }
...@@ -72,11 +104,21 @@ AirMapFlightPlanManager::_createFlightPlan() ...@@ -72,11 +104,21 @@ AirMapFlightPlanManager::_createFlightPlan()
_flight.coords.append(QGeoCoordinate(bc.pointSE.latitude(), bc.pointNW.longitude(), _flight.maxAltitude)); _flight.coords.append(QGeoCoordinate(bc.pointSE.latitude(), bc.pointNW.longitude(), _flight.maxAltitude));
_flight.coords.append(QGeoCoordinate(bc.pointNW.latitude(), bc.pointNW.longitude(), _flight.maxAltitude)); _flight.coords.append(QGeoCoordinate(bc.pointNW.latitude(), bc.pointNW.longitude(), _flight.maxAltitude));
_flight.maxAltitude += 5; // Add a safety buffer 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();
}
qCDebug(AirMapManagerLog) << "About to create flight plan"; qCDebug(AirMapManagerLog) << "About to create flight plan";
qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord;
qCDebug(AirMapManagerLog) << "Bounding box:" << bc.pointNW << bc.pointSE; qCDebug(AirMapManagerLog) << "Bounding box:" << bc.pointNW << bc.pointSE;
qCDebug(AirMapManagerLog) << "Flight Start:" << _flightStartTime;
qCDebug(AirMapManagerLog) << "Flight End: " << _flightEndTime;
return; return;
...@@ -102,6 +144,7 @@ AirMapFlightPlanManager::_createFlightPlan() ...@@ -102,6 +144,7 @@ AirMapFlightPlanManager::_createFlightPlan()
_state = State::Idle; _state = State::Idle;
QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : "");
emit error("Failed to create Flight Plan", QString::fromStdString(result.error().message()), description); emit error("Failed to create Flight Plan", QString::fromStdString(result.error().message()), description);
return;
} }
}); });
}); });
...@@ -129,8 +172,16 @@ AirMapFlightPlanManager::_uploadFlightPlan() ...@@ -129,8 +172,16 @@ AirMapFlightPlanManager::_uploadFlightPlan()
params.latitude = _flight.takeoffCoord.latitude(); params.latitude = _flight.takeoffCoord.latitude();
params.longitude = _flight.takeoffCoord.longitude(); params.longitude = _flight.takeoffCoord.longitude();
params.pilot.id = _pilotID.toStdString(); params.pilot.id = _pilotID.toStdString();
/*
TODO: Convert this to fucking boost
quint64 start = _flightStartTime.toUTC().toMSecsSinceEpoch();
quint64 end = _flightEndTime.toUTC().toMSecsSinceEpoch();
*/
params.start_time = Clock::universal_time() + Minutes{5}; params.start_time = Clock::universal_time() + Minutes{5};
params.end_time = Clock::universal_time() + Hours{2}; // TODO: user-configurable? params.end_time = Clock::universal_time() + Hours{2};
//-- Rules //-- Rules
AirMapRulesetsManager* pRulesMgr = dynamic_cast<AirMapRulesetsManager*>(qgcApp()->toolbox()->airspaceManager()->ruleSets()); AirMapRulesetsManager* pRulesMgr = dynamic_cast<AirMapRulesetsManager*>(qgcApp()->toolbox()->airspaceManager()->ruleSets());
if(pRulesMgr) { if(pRulesMgr) {
...@@ -165,6 +216,70 @@ AirMapFlightPlanManager::_uploadFlightPlan() ...@@ -165,6 +216,70 @@ AirMapFlightPlanManager::_uploadFlightPlan()
}); });
} }
//-----------------------------------------------------------------------------
void
AirMapFlightPlanManager::_updateFlightPlan()
{
qCDebug(AirMapManagerLog) << "Updating flight plan";
_state = State::FlightUpdate;
std::weak_ptr<LifetimeChecker> isAlive(_instance);
_shared.doRequestWithLogin([this, isAlive](const QString& login_token) {
if (!isAlive.lock()) return;
if (_state != State::FlightUpdate) return;
FlightPlans::Update::Parameters params;
params.authorization = login_token.toStdString();
params.flight_plan.id = _flightPlan.toStdString();
params.flight_plan.pilot.id = _pilotID.toStdString();
//-- TODO: This is broken as the parameters for updating the plan have
// little to do with those used when creating it.
params.flight_plan.altitude_agl.max = _flight.maxAltitude;
params.flight_plan.buffer = 2.f;
params.flight_plan.takeoff.latitude = _flight.takeoffCoord.latitude();
params.flight_plan.takeoff.longitude = _flight.takeoffCoord.longitude();
/*
TODO: Convert this to fucking boost
quint64 start = _flightStartTime.toUTC().toMSecsSinceEpoch();
quint64 end = _flightEndTime.toUTC().toMSecsSinceEpoch();
*/
params.flight_plan.start_time = Clock::universal_time() + Minutes{5};
params.flight_plan.end_time = Clock::universal_time() + Hours{2};
//-- Rules
/*
AirMapRulesetsManager* pRulesMgr = dynamic_cast<AirMapRulesetsManager*>(qgcApp()->toolbox()->airspaceManager()->ruleSets());
if(pRulesMgr) {
foreach(QString ruleset, pRulesMgr->rulesetsIDs()) {
params.flight_plan.rulesets.push_back(ruleset.toStdString());
}
}
*/
//-- Geometry: LineString
Geometry::LineString lineString;
for (const auto& qcoord : _flight.coords) {
Geometry::Coordinate coord;
coord.latitude = qcoord.latitude();
coord.longitude = qcoord.longitude();
lineString.coordinates.push_back(coord);
}
params.flight_plan.geometry = Geometry(lineString);
//-- Update flight plan
_shared.client()->flight_plans().update(params, [this, isAlive](const FlightPlans::Update::Result& result) {
if (!isAlive.lock()) return;
if (_state != State::FlightUpdate) return;
if (result) {
qCDebug(AirMapManagerLog) << "Flight plan updated:" << _flightPlan;
_state = State::FlightPolling;
_pollBriefing();
} else {
QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : "");
emit error("Flight Plan creation failed", QString::fromStdString(result.error().message()), description);
}
});
});
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
AirMapFlightPlanManager::_pollBriefing() AirMapFlightPlanManager::_pollBriefing()
...@@ -259,7 +374,7 @@ AirMapFlightPlanManager::_deleteFlightPlan() ...@@ -259,7 +374,7 @@ AirMapFlightPlanManager::_deleteFlightPlan()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
AirMapFlightPlanManager::_missionBoundingCubeChanged() AirMapFlightPlanManager::_missionChanged()
{ {
//-- Creating a new flight plan? //-- Creating a new flight plan?
if(_createPlan) { if(_createPlan) {
...@@ -267,7 +382,5 @@ AirMapFlightPlanManager::_missionBoundingCubeChanged() ...@@ -267,7 +382,5 @@ AirMapFlightPlanManager::_missionBoundingCubeChanged()
_createFlightPlan(); _createFlightPlan();
} }
//-- Plan is being modified //-- Plan is being modified
// _updateFlightPlan();
} }
...@@ -27,18 +27,24 @@ public: ...@@ -27,18 +27,24 @@ public:
AirMapFlightPlanManager(AirMapSharedState& shared, QObject *parent = nullptr); AirMapFlightPlanManager(AirMapSharedState& shared, QObject *parent = nullptr);
PermitStatus flightPermitStatus () const override { return _flightPermitStatus; } PermitStatus flightPermitStatus () const override { return _flightPermitStatus; }
void createFlight (MissionController* missionController) override;
QString flightID () { return _flightPlan; } QString flightID () { return _flightPlan; }
QDateTime flightStartTime () const override { return _flightStartTime; }
QDateTime flightEndTime () const override { return _flightEndTime; }
void createFlightPlan (MissionController* missionController) override;
void setFlightStartTime (QDateTime start) override;
void setFlightEndTime (QDateTime end) override;
signals: signals:
void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
private slots: private slots:
void _pollBriefing (); void _pollBriefing ();
void _missionBoundingCubeChanged (); void _missionChanged ();
private: private:
void _uploadFlightPlan (); void _uploadFlightPlan ();
void _updateFlightPlan ();
void _createFlightPlan (); void _createFlightPlan ();
void _deleteFlightPlan (); void _deleteFlightPlan ();
...@@ -47,6 +53,7 @@ private: ...@@ -47,6 +53,7 @@ private:
Idle, Idle,
GetPilotID, GetPilotID,
FlightUpload, FlightUpload,
FlightUpdate,
FlightPolling, FlightPolling,
FlightDelete FlightDelete
}; };
...@@ -69,6 +76,8 @@ private: ...@@ -69,6 +76,8 @@ private:
QString _pilotID; ///< Pilot ID in the form "auth0|abc123" QString _pilotID; ///< Pilot ID in the form "auth0|abc123"
MissionController* _controller = nullptr; MissionController* _controller = nullptr;
bool _createPlan = true; bool _createPlan = true;
QDateTime _flightStartTime;
QDateTime _flightEndTime;
AirspaceFlightPlanProvider::PermitStatus _flightPermitStatus = AirspaceFlightPlanProvider::PermitUnknown; AirspaceFlightPlanProvider::PermitStatus _flightPermitStatus = AirspaceFlightPlanProvider::PermitUnknown;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
#include <QObject> #include <QObject>
#include <QDateTime>
class MissionController; class MissionController;
...@@ -33,15 +34,24 @@ public: ...@@ -33,15 +34,24 @@ public:
Q_ENUM(PermitStatus) Q_ENUM(PermitStatus)
AirspaceFlightPlanProvider (QObject *parent = nullptr); AirspaceFlightPlanProvider (QObject *parent = nullptr);
virtual ~AirspaceFlightPlanProvider () {} virtual ~AirspaceFlightPlanProvider () {}
Q_PROPERTY(PermitStatus flightPermitStatus READ flightPermitStatus NOTIFY flightPermitStatusChanged) ///< state of flight permission Q_PROPERTY(PermitStatus flightPermitStatus READ flightPermitStatus NOTIFY flightPermitStatusChanged) ///< State of flight permission
Q_PROPERTY(QDateTime flightStartTime READ flightStartTime WRITE setFlightStartTime NOTIFY flightStartTimeChanged) ///< Start of flight
Q_PROPERTY(QDateTime flightEndTime READ flightEndTime WRITE setFlightEndTime NOTIFY flightEndTimeChanged) ///< End of flight
virtual PermitStatus flightPermitStatus () const { return PermitUnknown; } virtual PermitStatus flightPermitStatus () const { return PermitUnknown; }
virtual void createFlight (MissionController* missionController) = 0; virtual QDateTime flightStartTime () const = 0;
virtual QDateTime flightEndTime () const = 0;
virtual void setFlightStartTime (QDateTime start) = 0;
virtual void setFlightEndTime (QDateTime end) = 0;
virtual void createFlightPlan (MissionController* missionController) = 0;
signals: signals:
void flightPermitStatusChanged (); void flightPermitStatusChanged ();
void flightStartTimeChanged ();
void flightEndTimeChanged ();
}; };
...@@ -203,7 +203,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque ...@@ -203,7 +203,7 @@ void MissionController::_newMissionItemsAvailableFromVehicle(bool removeAllReque
//-- If airspace management enabled, create new flight //-- If airspace management enabled, create new flight
#if defined(QGC_AIRMAP_ENABLED) #if defined(QGC_AIRMAP_ENABLED)
if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) {
qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlight(this); qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this);
} }
#endif #endif
} }
...@@ -371,7 +371,7 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) ...@@ -371,7 +371,7 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i)
//-- If airspace management enabled and this is the first item, create new flight //-- If airspace management enabled and this is the first item, create new flight
#if defined(QGC_AIRMAP_ENABLED) #if defined(QGC_AIRMAP_ENABLED)
if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) {
qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlight(this); qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this);
} }
#endif #endif
...@@ -464,7 +464,7 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate ...@@ -464,7 +464,7 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate
//-- If airspace management enabled and this is the first item, create new flight //-- If airspace management enabled and this is the first item, create new flight
#if defined(QGC_AIRMAP_ENABLED) #if defined(QGC_AIRMAP_ENABLED)
if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { if(_visualItems->count() == 2 && qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) {
qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlight(this); qgcApp()->toolbox()->airspaceManager()->flightPlan()->createFlightPlan(this);
} }
#endif #endif
......
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