diff --git a/src/MissionManager/AirMapManager.cc b/src/MissionManager/AirMapManager.cc index fada5c5c040d6e178e22a25c5bf12b5b3556f335..29f16589a36b806b8a66c67c512391257db5ecdd 100644 --- a/src/MissionManager/AirMapManager.cc +++ b/src/MissionManager/AirMapManager.cc @@ -525,8 +525,33 @@ void AirMapFlightManager::createFlight(const QList& missionItems) //qCDebug(AirMapManagerLog) << root; _networking.post(url, QJsonDocument(root).toJson(), true, true); + + _flightPermitStatus = AirspaceAuthorization::PermitPending; + emit flightPermitStatusChanged(); } +void AirMapFlightManager::endFlight() +{ + if (_currentFlightId.length() == 0) { + return; + } + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "AirMapFlightManager::endFlight: State not idle"; + return; + } + + qCDebug(AirMapManagerLog) << "ending flight"; + + _state = State::FlightEnd; + + QUrl url(QString("https://api.airmap.com/flight/v2/%1/end").arg(_currentFlightId)); + // to kill the flight, use: https://api.airmap.com/flight/v2/%1/delete (otherwise same query) + + _networking.post(url, QByteArray(), false, true); + + _flightPermitStatus = AirspaceAuthorization::PermitUnknown; + emit flightPermitStatusChanged(); +} void AirMapFlightManager::_parseJson(QJsonParseError parseError, QJsonDocument doc) { @@ -543,6 +568,12 @@ void AirMapFlightManager::_parseJson(QJsonParseError parseError, QJsonDocument d _state = State::Idle; } break; + + case State::FlightEnd: + _currentFlightId = ""; + _state = State::Idle; + break; + default: qCDebug(AirMapManagerLog) << "Error: wrong state"; break; @@ -552,6 +583,10 @@ void AirMapFlightManager::_parseJson(QJsonParseError parseError, QJsonDocument d void AirMapFlightManager::_error(QNetworkReply::NetworkError code, const QString& errorString, const QString& serverErrorMessage) { qCWarning(AirMapManagerLog) << "AirMapFlightManager::_error" << code << serverErrorMessage; + if (_state == State::FlightUpload) { + _flightPermitStatus = AirspaceAuthorization::PermitUnknown; + emit flightPermitStatusChanged(); + } _state = State::Idle; emit networkError(code, errorString, serverErrorMessage); } @@ -758,7 +793,7 @@ void AirMapTelemetry::startTelemetryStream(const QString& flightID) qCInfo(AirMapManagerLog) << "Starting Telemetry stream with flightID" << flightID; - QUrl url(QString("https://api.airmap.com//flight/v2/%1/start-comm").arg(flightID)); + QUrl url(QString("https://api.airmap.com/flight/v2/%1/start-comm").arg(flightID)); _networking.post(url, QByteArray(), false, true); _state = State::StartCommunication; @@ -776,7 +811,7 @@ void AirMapTelemetry::stopTelemetryStream() } qCInfo(AirMapManagerLog) << "Stopping Telemetry stream with flightID" << _flightID; - QUrl url(QString("https://api.airmap.com//flight/v2/%1/end-comm").arg(_flightID)); + QUrl url(QString("https://api.airmap.com/flight/v2/%1/end-comm").arg(_flightID)); _networking.post(url, QByteArray(), false, true); _state = State::EndCommunication; @@ -844,8 +879,14 @@ void AirMapManager::_vehicleArmedChanged(bool armed) } if (armed) { _telemetry.startTelemetryStream(_flightManager.flightID()); + _vehicleWasInMissionMode = _vehicle->flightMode() == _vehicle->missionFlightMode(); } else { _telemetry.stopTelemetryStream(); + // end the flight if we were in mission mode during arming or disarming + // TODO: needs to be improved. for instance if we do RTL and then want to continue the mission... + if (_vehicleWasInMissionMode || _vehicle->flightMode() == _vehicle->missionFlightMode()) { + _flightManager.endFlight(); + } } } diff --git a/src/MissionManager/AirMapManager.h b/src/MissionManager/AirMapManager.h index 046d1f3b2418bda2a155397c43f7324bddedad06..df2407763f763feb61e6bcefda296d25e7b8120a 100644 --- a/src/MissionManager/AirMapManager.h +++ b/src/MissionManager/AirMapManager.h @@ -243,6 +243,9 @@ public: const QString& flightID() const { return _currentFlightId; } +public slots: + void endFlight(); + signals: void networkError(QNetworkReply::NetworkError code, const QString& errorString, const QString& serverErrorMessage); void flightPermitStatusChanged(); @@ -254,6 +257,7 @@ private: enum class State { Idle, FlightUpload, + FlightEnd, }; State _state = State::Idle; @@ -369,6 +373,7 @@ private: QTimer _updateTimer; Vehicle* _vehicle = nullptr; ///< current vehicle + bool _vehicleWasInMissionMode = false; ///< true if the vehicle was in mission mode when arming }; #endif