From b0fcbe05536c2d0dea748b0d749484c69b058373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Mon, 21 Aug 2017 15:16:20 +0200 Subject: [PATCH] AirMapManager: handle dynamic setting changes --- src/MissionManager/AirMapManager.cc | 47 +++++++++++++++++++++++++++++ src/MissionManager/AirMapManager.h | 18 +++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/MissionManager/AirMapManager.cc b/src/MissionManager/AirMapManager.cc index c651537f1..c23fd589b 100644 --- a/src/MissionManager/AirMapManager.cc +++ b/src/MissionManager/AirMapManager.cc @@ -177,6 +177,7 @@ void AirMapNetworking::post(QUrl url, const QByteArray& postData, bool isJsonDat } connect(networkReply, &QNetworkReply::finished, this, &AirMapNetworking::_requestFinished); + _currentNetworkReply = networkReply; } void AirMapNetworking::_loginSuccess() @@ -198,6 +199,16 @@ void AirMapNetworking::_loginFailure(QNetworkReply::NetworkError networkError, c emit error(networkError, errorString, serverErrorMessage); } +void AirMapNetworking::abort() +{ + if (_currentNetworkReply) { + disconnect(_currentNetworkReply, &QNetworkReply::finished, this, &AirMapNetworking::_requestFinished); + _currentNetworkReply->abort(); + _currentNetworkReply = nullptr; + } + _pendingRequest.type = RequestType::None; +} + void AirMapNetworking::get(QUrl url, bool requiresLogin) { QNetworkRequest request(url); @@ -230,11 +241,13 @@ void AirMapNetworking::get(QUrl url, bool requiresLogin) } connect(networkReply, &QNetworkReply::finished, this, &AirMapNetworking::_requestFinished); + _currentNetworkReply = networkReply; } void AirMapNetworking::_requestFinished(void) { QNetworkReply* reply = qobject_cast(QObject::sender()); + _currentNetworkReply = nullptr; // When an error occurs we still end up here if (reply->error() != QNetworkReply::NoError) { @@ -622,6 +635,14 @@ void AirMapFlightManager::endFlight() emit flightPermitStatusChanged(); } +void AirMapFlightManager::abort() +{ + _state = State::Idle; + _networking.abort(); + _flightPermitStatus = AirspaceAuthorization::PermitUnknown; + emit flightPermitStatusChanged(); +} + void AirMapFlightManager::_endFlight(const QString& flightID) { qCDebug(AirMapManagerLog) << "ending flight" << flightID; @@ -1001,6 +1022,7 @@ void AirMapTelemetry::_parseJson(QJsonParseError parseError, QJsonDocument doc) delete _socket; _socket = nullptr; } + _key = ""; _state = State::Idle; break; default: @@ -1202,6 +1224,31 @@ void AirMapManager::setToolbox(QGCToolbox* toolbox) _networkingData.login.setCredentials(ap->clientID()->rawValueString(), ap->userName()->rawValueString(), ap->password()->rawValueString()); _flightManager.setSitaPilotRegistrationId(ap->sitaUserReg()->rawValueString()); _flightManager.setSitaUavRegistrationId(ap->sitaUavReg()->rawValueString()); + + connect(ap->apiKey(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->clientID(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->userName(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->password(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + + connect(ap->sitaUserReg(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->sitaUavReg(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); +} + +void AirMapManager::_settingsChanged() +{ + qCDebug(AirMapManagerLog) << "AirMap settings changed"; + + // reset the states + _flightManager.abort(); + _flightManager.endFlight(); + _telemetry.stopTelemetryStream(); + _trafficAlerts.disconnectFromHost(); + + AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); + _networkingData.airmapAPIKey = ap->apiKey()->rawValueString(); + _networkingData.login.setCredentials(ap->clientID()->rawValueString(), ap->userName()->rawValueString(), ap->password()->rawValueString()); + _flightManager.setSitaPilotRegistrationId(ap->sitaUserReg()->rawValueString()); + _flightManager.setSitaUavRegistrationId(ap->sitaUavReg()->rawValueString()); } void AirMapManager::setROI(QGeoCoordinate& center, double radiusMeters) diff --git a/src/MissionManager/AirMapManager.h b/src/MissionManager/AirMapManager.h index 85379e8e7..5bd77fae6 100644 --- a/src/MissionManager/AirMapManager.h +++ b/src/MissionManager/AirMapManager.h @@ -119,6 +119,11 @@ private: QString _password; }; +/** + * @class AirMapNetworking + * Handles networking requests (GET & POST), with login if required. + * There can only be one active request per object instance. + */ class AirMapNetworking : public QObject { Q_OBJECT @@ -155,6 +160,11 @@ public: const AirMapLogin& getLogin() const { return _networkingData.login; } + /** + * abort the current request (_requestFinished() or _requestError() will not be emitted) + */ + void abort(); + signals: /// signal when the request finished (get or post). All requests are assumed to return JSON. void finished(QJsonParseError parseError, QJsonDocument document); @@ -180,6 +190,8 @@ private: bool requiresLogin; }; PendingRequest _pendingRequest; + + QNetworkReply* _currentNetworkReply = nullptr; }; @@ -252,6 +264,11 @@ public: _sitaPilotRegistrationId = sitaPilotRegistrationId; } + /** + * abort the current operation + */ + void abort(); + public slots: void endFlight(); @@ -441,6 +458,7 @@ private slots: void _flightPermitStatusChanged(); + void _settingsChanged(); private: bool _hasAPIKey() const { return _networkingData.airmapAPIKey != ""; } -- 2.22.0