From f41317102e19d9d4924415a9e51895ade238ca03 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Thu, 22 Mar 2018 17:48:33 -0400 Subject: [PATCH] Airmap API key integration. The build system will look for src/Airmap/Airmap_api_key.h If it find is, it will used the provided API key and client ID for Airmap. That file should provide two strings: static const char* kAirmapAPIKey = "key data"; static const char* kAirmapClientID = "id data"; Local builds, without these will have no Airmap support by default (users can always enter their own within the Airmap settings panel). --- .gitignore | 1 + qgroundcontrol.pro | 7 +++ src/Airmap/AirMap.SettingsGroup.json | 12 ------ src/Airmap/AirMapManager.cc | 16 +++++++ src/Airmap/AirMapSettings.cc | 4 -- src/Airmap/AirMapSettings.h | 2 - src/Airmap/AirmapSettings.qml | 59 ++++++++++++++----------- src/QmlControls/QmlObjectListModel.cc | 8 ++-- src/QmlControls/QmlObjectListModel.h | 62 +++++++++++++-------------- 9 files changed, 94 insertions(+), 77 deletions(-) diff --git a/.gitignore b/.gitignore index 87d0a7993..07ca8ac69 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ thirdParty/qserialport/lib/ libs/thirdParty/libxbee/lib/ GeneratedFiles/ gstreamer-1.0-android* +src/Airmap/Airmap_api_key.h *.autosave .settings/ diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 35d0a7c8f..46d151e35 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -1137,6 +1137,13 @@ contains (DEFINES, QGC_AIRMAP_ENABLED) { src/Airmap/AirMapVehicleManager.cc \ src/Airmap/AirMapWeatherInfoManager.cc \ + #-- Do we have an API key? + exists(src/Airmap/Airmap_api_key.h) { + HEADERS += \ + src/Airmap/Airmap_api_key.h + DEFINES += QGC_AIRMAP_KEY_AVAILABLE + } + } else { #-- Dummies INCLUDEPATH += \ diff --git a/src/Airmap/AirMap.SettingsGroup.json b/src/Airmap/AirMap.SettingsGroup.json index 4263833d3..4f61a0f8d 100644 --- a/src/Airmap/AirMap.SettingsGroup.json +++ b/src/Airmap/AirMap.SettingsGroup.json @@ -34,17 +34,5 @@ "shortDescription": "Enable AirMap Telemetry", "type": "bool", "defaultValue": false -}, -{ - "name": "loginEmail", - "shortDescription": "AirMap Login Email", - "type": "string", - "defaultValue": "" -}, -{ - "name": "loginPassword", - "shortDescription": "AirMap Login Password", - "type": "string", - "defaultValue": "" } ] diff --git a/src/Airmap/AirMapManager.cc b/src/Airmap/AirMapManager.cc index e42c7bc3d..039dbc0aa 100644 --- a/src/Airmap/AirMapManager.cc +++ b/src/Airmap/AirMapManager.cc @@ -27,6 +27,11 @@ #include +//-- Hardwired API key +#if defined(QGC_AIRMAP_KEY_AVAILABLE) +#include "Airmap_api_key.h" +#endif + using namespace airmap; QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog") @@ -81,10 +86,21 @@ AirMapManager::_settingsChanged() AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); AirMapSharedState::Settings settings; settings.apiKey = ap->apiKey()->rawValueString(); +#if defined(QGC_AIRMAP_KEY_AVAILABLE) + bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); +#else bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey; +#endif 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), set it. +#if defined(QGC_AIRMAP_KEY_AVAILABLE) + if(settings.apiKey.isEmpty() || settings.clientID.isEmpty()) { + settings.apiKey = kAirmapAPIKey; + settings.clientID = kAirmapClientID; + } +#endif _shared.setSettings(settings); //-- Need to re-create the client if the API key changed if (_shared.client() && apiKeyChanged) { diff --git a/src/Airmap/AirMapSettings.cc b/src/Airmap/AirMapSettings.cc index b559d6e6a..62ad46a18 100644 --- a/src/Airmap/AirMapSettings.cc +++ b/src/Airmap/AirMapSettings.cc @@ -21,8 +21,6 @@ DECLARE_SETTINGGROUP(AirMap) INIT_SETTINGFACT(password); INIT_SETTINGFACT(enableAirMap); INIT_SETTINGFACT(enableTelemetry); - INIT_SETTINGFACT(loginEmail); - INIT_SETTINGFACT(loginPassword); QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "AirMapSettings", "Reference only"); } @@ -33,5 +31,3 @@ DECLARE_SETTINGSFACT(AirMapSettings, userName) DECLARE_SETTINGSFACT(AirMapSettings, password) DECLARE_SETTINGSFACT(AirMapSettings, enableAirMap) DECLARE_SETTINGSFACT(AirMapSettings, enableTelemetry) -DECLARE_SETTINGSFACT(AirMapSettings, loginEmail) -DECLARE_SETTINGSFACT(AirMapSettings, loginPassword) diff --git a/src/Airmap/AirMapSettings.h b/src/Airmap/AirMapSettings.h index f095dd7b6..d26cc6ebc 100644 --- a/src/Airmap/AirMapSettings.h +++ b/src/Airmap/AirMapSettings.h @@ -25,7 +25,5 @@ public: DEFINE_SETTINGFACT(password) DEFINE_SETTINGFACT(enableAirMap) DEFINE_SETTINGFACT(enableTelemetry) - DEFINE_SETTINGFACT(loginEmail) - DEFINE_SETTINGFACT(loginPassword) }; diff --git a/src/Airmap/AirmapSettings.qml b/src/Airmap/AirmapSettings.qml index 5d6fd0c7c..36a7b4e51 100644 --- a/src/Airmap/AirmapSettings.qml +++ b/src/Airmap/AirmapSettings.qml @@ -122,21 +122,21 @@ QGCView { columns: 2 rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 anchors.centerIn: parent - QGCLabel { text: qsTr("Email:") } + QGCLabel { text: qsTr("User Name:") } FactTextField { - fact: _loginEmailFact + fact: _usernameFact width: _editFieldWidth enabled: _airMapEnabled - visible: _loginEmailFact.visible - property Fact _loginEmailFact: QGroundControl.settingsManager.airMapSettings.loginEmail + visible: _usernameFact.visible + property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName } QGCLabel { text: qsTr("Password:") } FactTextField { - fact: _loginPasswordFact + fact: _passwordFact width: _editFieldWidth enabled: _airMapEnabled - visible: _loginPasswordFact.visible - property Fact _loginPasswordFact: QGroundControl.settingsManager.airMapSettings.loginPassword + visible: _passwordFact.visible + property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password } Item { width: 1 @@ -144,20 +144,20 @@ QGCView { Layout.columnSpan: 2 } QGCLabel { - text: qsTr("Forgot Your AirMap Password?") - Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 + text: qsTr("Forgot Your AirMap Password?") + Layout.alignment: Qt.AlignHCenter + Layout.columnSpan: 2 } Item { width: 1 height: 1 - Layout.columnSpan: 2 + Layout.columnSpan: 2 } QGCButton { - text: qsTr("Register for an AirMap Account") - Layout.alignment: Qt.AlignHCenter - Layout.columnSpan: 2 - enabled: _airMapEnabled + text: qsTr("Register for an AirMap Account") + Layout.alignment: Qt.AlignHCenter + Layout.columnSpan: 2 + enabled: _airMapEnabled onClicked: { Qt.openUrlExternally("https://www.airmap.com"); } @@ -174,7 +174,7 @@ QGCView { visible: QGroundControl.settingsManager.appSettings.visible QGCLabel { id: profileLabel - text: qsTr("Pilot Profile") + text: qsTr("Pilot Profile (WIP)") font.family: ScreenTools.demiboldFontFamily } } @@ -226,14 +226,25 @@ QGCView { columnSpacing: ScreenTools.defaultFontPixelHeight * 2 rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25 anchors.centerIn: parent - QGCLabel { text: qsTr("API Key:") } - FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth; } - QGCLabel { text: qsTr("Client ID:") } - FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth; } - QGCLabel { text: qsTr("User Name:") } - FactTextField { fact: QGroundControl.settingsManager.airMapSettings.userName; width: _editFieldWidth; } - QGCLabel { text: qsTr("Password:") } - FactTextField { fact: QGroundControl.settingsManager.airMapSettings.password; width: _editFieldWidth; echoMode: TextInput.Password } + QGCCheckBox { + id: hasPrivateKey + text: qsTr("Personal API Key") + Layout.columnSpan: 2 + Component.onCompleted: { + if(QGroundControl.settingsManager.airMapSettings.apiKey !== "") + checked = true + } + } + Item { + width: 1 + height: 1 + visible: hasPrivateKey.checked + Layout.columnSpan: 2 + } + QGCLabel { text: qsTr("API Key:"); visible: hasPrivateKey.checked; } + FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; } + QGCLabel { text: qsTr("Client ID:"); visible: hasPrivateKey.checked; } + FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; } } } //----------------------------------------------------------------- diff --git a/src/QmlControls/QmlObjectListModel.cc b/src/QmlControls/QmlObjectListModel.cc index 0ce26d459..b1d936039 100644 --- a/src/QmlControls/QmlObjectListModel.cc +++ b/src/QmlControls/QmlObjectListModel.cc @@ -128,7 +128,7 @@ const QObject* QmlObjectListModel::operator[](int index) const return _objectList[index]; } -void QmlObjectListModel::clear(void) +void QmlObjectListModel::clear() { while (rowCount()) { removeAt(0); @@ -218,7 +218,7 @@ QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist) return oldlist; } -int QmlObjectListModel::count(void) const +int QmlObjectListModel::count() const { return rowCount(); } @@ -247,7 +247,7 @@ void QmlObjectListModel::_childDirtyChanged(bool dirty) emit dirtyChanged(_dirty); } -void QmlObjectListModel::deleteListAndContents(void) +void QmlObjectListModel::deleteListAndContents() { for (int i=0; i<_objectList.count(); i++) { _objectList[i]->deleteLater(); @@ -255,7 +255,7 @@ void QmlObjectListModel::deleteListAndContents(void) deleteLater(); } -void QmlObjectListModel::clearAndDeleteContents(void) +void QmlObjectListModel::clearAndDeleteContents() { beginResetModel(); for (int i=0; i<_objectList.count(); i++) { diff --git a/src/QmlControls/QmlObjectListModel.h b/src/QmlControls/QmlObjectListModel.h index 337edca24..d7db98d75 100644 --- a/src/QmlControls/QmlObjectListModel.h +++ b/src/QmlControls/QmlObjectListModel.h @@ -31,50 +31,50 @@ public: // Property accessors - int count(void) const; - - bool dirty(void) const { return _dirty; } - void setDirty(bool dirty); - - void append(QObject* object); - void append(QList objects); - QObjectList swapObjectList(const QObjectList& newlist); - void clear(void); - QObject* removeAt(int i); - QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); } - void insert(int i, QObject* object); - void insert(int i, QList objects); - QObject* operator[](int i); - const QObject* operator[](int i) const; - bool contains(QObject* object) { return _objectList.indexOf(object) != -1; } - int indexOf(QObject* object) { return _objectList.indexOf(object); } - template T value(int index) { return qobject_cast(_objectList[index]); } + int count () const; + bool dirty () const { return _dirty; } + void setDirty (bool dirty); + void append (QObject* object); + void append (QList objects); + QObjectList swapObjectList (const QObjectList& newlist); + void clear (); + QObject* removeAt (int i); + QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); } + void insert (int i, QObject* object); + void insert (int i, QList objects); + bool contains (QObject* object) { return _objectList.indexOf(object) != -1; } + int indexOf (QObject* object) { return _objectList.indexOf(object); } + + QObject* operator[] (int i); + const QObject* operator[] (int i) const; + template T value (int index) { return qobject_cast(_objectList[index]); } + QList* objectList () { return &_objectList; } /// Calls deleteLater on all items and this itself. - void deleteListAndContents (void); + void deleteListAndContents (); /// Clears the list and calls deleteLater on each entry - void clearAndDeleteContents (void); + void clearAndDeleteContents (); - void beginReset () { beginResetModel(); } - void endReset () { endResetModel(); } + void beginReset () { beginResetModel(); } + void endReset () { endResetModel(); } signals: - void countChanged (int count); - void dirtyChanged (bool dirtyChanged); + void countChanged (int count); + void dirtyChanged (bool dirtyChanged); private slots: - void _childDirtyChanged (bool dirty); + void _childDirtyChanged (bool dirty); private: // Overrides from QAbstractListModel - int rowCount(const QModelIndex & parent = QModelIndex()) const override; - QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; + int rowCount (const QModelIndex & parent = QModelIndex()) const override; + QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const override; + bool insertRows (int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool removeRows (int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QHash roleNames(void) const override; - bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; - bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - + private: QList _objectList; -- 2.22.0