diff --git a/src/Airmap/AirMapManager.cc b/src/Airmap/AirMapManager.cc index fab5f23631228da08d2173269001a03d7770592a..b2361fbffe509c26381c0a5cd9f6633db1cbcf55 100644 --- a/src/Airmap/AirMapManager.cc +++ b/src/Airmap/AirMapManager.cc @@ -39,6 +39,7 @@ QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog") //----------------------------------------------------------------------------- AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox) : AirspaceManager(app, toolbox) + , _authStatus(Unknown) { _logger = std::make_shared(); qt::register_types(); // TODO: still needed? @@ -47,6 +48,7 @@ AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox) _logger->logging_category().setEnabled(QtWarningMsg, false); _dispatchingLogger = std::make_shared(_logger); connect(&_shared, &AirMapSharedState::error, this, &AirMapManager::_error); + connect(&_shared, &AirMapSharedState::authStatus, this, &AirMapManager::_authStatusChanged); } //----------------------------------------------------------------------------- @@ -87,6 +89,14 @@ AirMapManager::_error(const QString& what, const QString& airmapdMessage, const qgcApp()->showMessage(QString("AirMap Error: %1. %2").arg(what).arg(airmapdMessage)); } +//----------------------------------------------------------------------------- +void +AirMapManager::_authStatusChanged(AirspaceManager::AuthStatus status) +{ + _authStatus = status; + emit authStatusChanged(); +} + //----------------------------------------------------------------------------- void AirMapManager::_settingsChanged() @@ -97,6 +107,7 @@ AirMapManager::_settingsChanged() AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); //-- If we are disabled, there is nothing else to do. if (!ap->enableAirMap()->rawValue().toBool()) { + _shared.logout(); if(_shared.client()) { delete _shared.client(); _shared.setClient(nullptr); @@ -109,21 +120,24 @@ AirMapManager::_settingsChanged() settings.apiKey = ap->apiKey()->rawValueString(); settings.clientID = ap->clientID()->rawValueString(); } - settings.userName = ap->userName()->rawValueString(); - settings.password = ap->password()->rawValueString(); //-- If we have a hardwired key (and no custom key is present), set it. #if defined(QGC_AIRMAP_KEY_AVAILABLE) if(!ap->usePersonalApiKey()->rawValue().toBool()) { settings.apiKey = kAirmapAPIKey; settings.clientID = kAirmapClientID; } - bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); + bool authChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); #else - bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey; + bool authChanged = settings.apiKey != _shared.settings().apiKey; #endif + settings.userName = ap->userName()->rawValueString(); + settings.password = ap->password()->rawValueString(); + if(settings.userName != _shared.settings().userName || settings.password != _shared.settings().password) { + authChanged = true; + } _shared.setSettings(settings); - //-- Need to re-create the client if the API key changed - if ((_shared.client() && apiKeyChanged) || !ap->enableAirMap()->rawValue().toBool()) { + //-- Need to re-create the client if the API key or user name/password changed + if ((_shared.client() && authChanged) || !ap->enableAirMap()->rawValue().toBool()) { delete _shared.client(); _shared.setClient(nullptr); emit connectedChanged(); diff --git a/src/Airmap/AirMapManager.h b/src/Airmap/AirMapManager.h index f315c46a80f4b6f54771ae7844de957bb3324c9e..f6c56b5774799faef9ff96fbea1181cdf01cf0d6 100644 --- a/src/Airmap/AirMapManager.h +++ b/src/Airmap/AirMapManager.h @@ -43,6 +43,7 @@ public: AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) override; bool connected () const override; QString connectStatus () const override { return _connectStatus; } + AirspaceManager::AuthStatus authStatus () const override { return _authStatus; } protected: AirspaceRulesetsProvider* _instantiateRulesetsProvider () override; @@ -54,12 +55,14 @@ protected: private slots: void _error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void _settingsChanged (); + void _authStatusChanged (AirspaceManager::AuthStatus status); private: QString _connectStatus; AirMapSharedState _shared; std::shared_ptr _logger; std::shared_ptr _dispatchingLogger; + AirspaceManager::AuthStatus _authStatus; }; diff --git a/src/Airmap/AirMapRulesetsManager.cc b/src/Airmap/AirMapRulesetsManager.cc index 06a63cb0c1dcc1128f909eafdea1e75d3f04f9dc..af54be679601b620e571626c626e4954ada22a8c 100644 --- a/src/Airmap/AirMapRulesetsManager.cc +++ b/src/Airmap/AirMapRulesetsManager.cc @@ -197,7 +197,6 @@ AirMapRuleSet::setSelected(bool sel) if(_selected != sel) { _selected = sel; emit selectedChanged(); - qDebug() << "Selection" << name() << sel; qgcApp()->toolbox()->airspaceManager()->setUpdate(); } } else { @@ -244,7 +243,6 @@ void AirMapRulesetsManager::setROI(const QGCGeoBoundingCube& roi, bool reset) for(int rs = 0; rs < ruleSets()->count(); rs++) { AirMapRuleSet* ruleSet = qobject_cast(ruleSets()->get(rs)); selectionSet[ruleSet->id()] = ruleSet->selected(); - qDebug() << ruleSet->id() << ruleSet->selected(); } _ruleSets.clearAndDeleteContents(); _state = State::RetrieveItems; @@ -277,7 +275,6 @@ void AirMapRulesetsManager::setROI(const QGCGeoBoundingCube& roi, bool reset) //-- Restore selection set (if any) if(selectionSet.contains(pRuleSet->id())) { pRuleSet->_selected = selectionSet[pRuleSet->id()]; - qDebug() << pRuleSet->name() << pRuleSet->id() << pRuleSet->_selected; } else { if(pRuleSet->_isDefault) { pRuleSet->_selected = true; diff --git a/src/Airmap/AirMapSharedState.cc b/src/Airmap/AirMapSharedState.cc index 04cbd87049e6dd544d5dd69d2a6c659101b0fbc1..f27da2cd8d18c40fb2cea1fa7d8f1fe6ff38067e 100644 --- a/src/Airmap/AirMapSharedState.cc +++ b/src/Airmap/AirMapSharedState.cc @@ -50,10 +50,12 @@ AirMapSharedState::login() } if (result) { qCDebug(AirMapManagerLog)<<"Successfully authenticated with AirMap: id="<< result.value().id.c_str(); + emit authStatus(AirspaceManager::AuthStatus::Anonymous); _loginToken = QString::fromStdString(result.value().id); _processPendingRequests(); } else { _pendingRequests.clear(); + emit authStatus(AirspaceManager::AuthStatus::Error); QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); emit error("Failed to authenticate with AirMap", QString::fromStdString(result.error().message()), description); @@ -73,11 +75,13 @@ AirMapSharedState::login() if (result) { qCDebug(AirMapManagerLog)<<"Successfully authenticated with AirMap: id="<< result.value().id.c_str()<<", access=" < #include +#include "AirspaceManager.h" + #include /** @@ -55,7 +57,8 @@ public: const QString& loginToken () const { return _loginToken; } signals: - void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void authStatus (AirspaceManager::AuthStatus status); private: void _processPendingRequests (); diff --git a/src/Airmap/AirmapSettings.qml b/src/Airmap/AirmapSettings.qml index 3c27090ce5ed8028a5cfbf4a496d69e3bdcb06d6..15475dba6ddbb5dfcd3852b5f85b8d00ebf799f7 100644 --- a/src/Airmap/AirmapSettings.qml +++ b/src/Airmap/AirmapSettings.qml @@ -19,6 +19,7 @@ import QtLocation 5.3 import QtPositioning 5.3 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactControls 1.0 @@ -42,6 +43,7 @@ QGCView { property real _panelWidth: _qgcView.width * _internalWidthRatio property Fact _enableAirMapFact: QGroundControl.settingsManager.airMapSettings.enableAirMap property bool _airMapEnabled: _enableAirMapFact.rawValue + property var _authStatus: QGroundControl.airspaceManager.authStatus readonly property real _internalWidthRatio: 0.8 @@ -184,7 +186,8 @@ QGCView { anchors.horizontalCenter: parent.horizontalCenter GridLayout { id: loginGrid - columns: 2 + columns: 3 + columnSpacing: ScreenTools.defaultFontPixelWidth rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 anchors.centerIn: parent QGCLabel { text: qsTr("User Name:") } @@ -197,6 +200,24 @@ QGCView { Layout.minimumWidth: _editFieldWidth property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName } + QGCLabel { + text: { + if(!QGroundControl.airspaceManager.connected) + return qsTr("Not Connected") + switch(_authStatus) { + case AirspaceManager.Unknown: + return qsTr("") + case AirspaceManager.Anonymous: + return qsTr("Anonymous") + case AirspaceManager.Autheticated: + return qsTr("Autheticated") + default: + return qsTr("Authetication Error") + } + } + Layout.rowSpan: 2 + Layout.alignment: Qt.AlignVCenter + } QGCLabel { text: qsTr("Password:") } FactTextField { fact: _passwordFact @@ -211,22 +232,26 @@ QGCView { Item { width: 1 height: 1 - Layout.columnSpan: 2 + } + Item { + width: 1 + height: 1 + Layout.columnSpan: 3 } QGCLabel { text: qsTr("Forgot Your AirMap Password?") Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 + Layout.columnSpan: 3 } Item { width: 1 height: 1 - Layout.columnSpan: 2 + Layout.columnSpan: 3 } QGCButton { text: qsTr("Register for an AirMap Account") Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 + Layout.columnSpan: 3 enabled: _airMapEnabled onClicked: { Qt.openUrlExternally("https://www.airmap.com"); diff --git a/src/AirspaceManagement/AirspaceAdvisoryProvider.h b/src/AirspaceManagement/AirspaceAdvisoryProvider.h index 18fd05726bf7e50ee5867c95d6e9951e05a9cb77..11bcaff8b0d22791aab9b4ac51508028beefa21e 100644 --- a/src/AirspaceManagement/AirspaceAdvisoryProvider.h +++ b/src/AirspaceManagement/AirspaceAdvisoryProvider.h @@ -81,7 +81,7 @@ public: Q_ENUM(AdvisoryType) - AirspaceAdvisory (QObject* parent = NULL); + AirspaceAdvisory (QObject* parent = nullptr); Q_PROPERTY(QString id READ id CONSTANT) Q_PROPERTY(QString name READ name CONSTANT) diff --git a/src/AirspaceManagement/AirspaceManager.h b/src/AirspaceManagement/AirspaceManager.h index 1d3ecc7e56f31d67d4c10305a6c78aa79e9ea7b1..7d3ffa4de322fd190feb0de9f87d5d6861c1da22 100644 --- a/src/AirspaceManagement/AirspaceManager.h +++ b/src/AirspaceManagement/AirspaceManager.h @@ -57,6 +57,15 @@ public: AirspaceManager(QGCApplication* app, QGCToolbox* toolbox); virtual ~AirspaceManager() override; + enum AuthStatus { + Unknown, + Anonymous, + Autheticated, + Error + }; + + Q_ENUM(AuthStatus) + Q_PROPERTY(QString providerName READ providerName CONSTANT) Q_PROPERTY(AirspaceWeatherInfoProvider* weatherInfo READ weatherInfo CONSTANT) Q_PROPERTY(AirspaceAdvisoryProvider* advisories READ advisories CONSTANT) @@ -65,6 +74,7 @@ public: Q_PROPERTY(AirspaceFlightPlanProvider* flightPlan READ flightPlan CONSTANT) Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) Q_PROPERTY(QString connectStatus READ connectStatus NOTIFY connectStatusChanged) + Q_PROPERTY(AirspaceManager::AuthStatus authStatus READ authStatus NOTIFY authStatusChanged) Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setAirspaceVisible NOTIFY airspaceVisibleChanged) Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset = false); @@ -85,6 +95,8 @@ public: virtual QString connectStatus () const { return QString(); } virtual void setUpdate (); + virtual AirspaceManager::AuthStatus authStatus () const { return Anonymous; } + /** * Factory method to create an AirspaceVehicleManager object */ @@ -94,6 +106,7 @@ signals: void airspaceVisibleChanged (); void connectedChanged (); void connectStatusChanged (); + void authStatusChanged (); void update (); protected: diff --git a/src/AirspaceManagement/AirspaceRestriction.h b/src/AirspaceManagement/AirspaceRestriction.h index 4cd8c48f6d653a61fb3d1da4b038732ef306c940..e160e1b3fb0e46b0fcc6fb193f38f035f9874f55 100644 --- a/src/AirspaceManagement/AirspaceRestriction.h +++ b/src/AirspaceManagement/AirspaceRestriction.h @@ -22,7 +22,7 @@ class AirspaceRestriction : public QObject { Q_OBJECT public: - AirspaceRestriction(QObject* parent = NULL); + AirspaceRestriction(QObject* parent = nullptr); }; /** @@ -34,7 +34,7 @@ class AirspacePolygonRestriction : public AirspaceRestriction { Q_OBJECT public: - AirspacePolygonRestriction(const QVariantList& polygon, QObject* parent = NULL); + AirspacePolygonRestriction(const QVariantList& polygon, QObject* parent = nullptr); Q_PROPERTY(QVariantList polygon MEMBER _polygon CONSTANT) @@ -53,7 +53,7 @@ class AirspaceCircularRestriction : public AirspaceRestriction { Q_OBJECT public: - AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QObject* parent = NULL); + AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QObject* parent = nullptr); Q_PROPERTY(QGeoCoordinate center MEMBER _center CONSTANT) Q_PROPERTY(double radius MEMBER _radius CONSTANT) diff --git a/src/AirspaceManagement/AirspaceRestrictionProvider.h b/src/AirspaceManagement/AirspaceRestrictionProvider.h index 4882fd1de56285cdf65d873bfcd03e21168b2808..f94dff845a363503440b6e87650c82fa4e33d7c1 100644 --- a/src/AirspaceManagement/AirspaceRestrictionProvider.h +++ b/src/AirspaceManagement/AirspaceRestrictionProvider.h @@ -27,7 +27,7 @@ class AirspaceCircularRestriction; class AirspaceRestrictionProvider : public QObject { Q_OBJECT public: - AirspaceRestrictionProvider (QObject* parent = NULL); + AirspaceRestrictionProvider (QObject* parent = nullptr); ~AirspaceRestrictionProvider () = default; Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT)