Commit b0fcbe05 authored by Beat Küng's avatar Beat Küng

AirMapManager: handle dynamic setting changes

parent a6becbdd
......@@ -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<QNetworkReply*>(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)
......
......@@ -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 != ""; }
......
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