Commit f4131710 authored by Gus Grubba's avatar Gus Grubba

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).
parent 06272ff6
...@@ -56,6 +56,7 @@ thirdParty/qserialport/lib/ ...@@ -56,6 +56,7 @@ thirdParty/qserialport/lib/
libs/thirdParty/libxbee/lib/ libs/thirdParty/libxbee/lib/
GeneratedFiles/ GeneratedFiles/
gstreamer-1.0-android* gstreamer-1.0-android*
src/Airmap/Airmap_api_key.h
*.autosave *.autosave
.settings/ .settings/
......
...@@ -1137,6 +1137,13 @@ contains (DEFINES, QGC_AIRMAP_ENABLED) { ...@@ -1137,6 +1137,13 @@ contains (DEFINES, QGC_AIRMAP_ENABLED) {
src/Airmap/AirMapVehicleManager.cc \ src/Airmap/AirMapVehicleManager.cc \
src/Airmap/AirMapWeatherInfoManager.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 { } else {
#-- Dummies #-- Dummies
INCLUDEPATH += \ INCLUDEPATH += \
......
...@@ -34,17 +34,5 @@ ...@@ -34,17 +34,5 @@
"shortDescription": "Enable AirMap Telemetry", "shortDescription": "Enable AirMap Telemetry",
"type": "bool", "type": "bool",
"defaultValue": false "defaultValue": false
},
{
"name": "loginEmail",
"shortDescription": "AirMap Login Email",
"type": "string",
"defaultValue": ""
},
{
"name": "loginPassword",
"shortDescription": "AirMap Login Password",
"type": "string",
"defaultValue": ""
} }
] ]
...@@ -27,6 +27,11 @@ ...@@ -27,6 +27,11 @@
#include <airmap/authenticator.h> #include <airmap/authenticator.h>
//-- Hardwired API key
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
#include "Airmap_api_key.h"
#endif
using namespace airmap; using namespace airmap;
QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog") QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog")
...@@ -81,10 +86,21 @@ AirMapManager::_settingsChanged() ...@@ -81,10 +86,21 @@ AirMapManager::_settingsChanged()
AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings();
AirMapSharedState::Settings settings; AirMapSharedState::Settings settings;
settings.apiKey = ap->apiKey()->rawValueString(); 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; bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey;
#endif
settings.clientID = ap->clientID()->rawValueString(); settings.clientID = ap->clientID()->rawValueString();
settings.userName = ap->userName()->rawValueString(); settings.userName = ap->userName()->rawValueString();
settings.password = ap->password()->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); _shared.setSettings(settings);
//-- Need to re-create the client if the API key changed //-- Need to re-create the client if the API key changed
if (_shared.client() && apiKeyChanged) { if (_shared.client() && apiKeyChanged) {
......
...@@ -21,8 +21,6 @@ DECLARE_SETTINGGROUP(AirMap) ...@@ -21,8 +21,6 @@ DECLARE_SETTINGGROUP(AirMap)
INIT_SETTINGFACT(password); INIT_SETTINGFACT(password);
INIT_SETTINGFACT(enableAirMap); INIT_SETTINGFACT(enableAirMap);
INIT_SETTINGFACT(enableTelemetry); INIT_SETTINGFACT(enableTelemetry);
INIT_SETTINGFACT(loginEmail);
INIT_SETTINGFACT(loginPassword);
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
qmlRegisterUncreatableType<AirMapSettings>("QGroundControl.SettingsManager", 1, 0, "AirMapSettings", "Reference only"); qmlRegisterUncreatableType<AirMapSettings>("QGroundControl.SettingsManager", 1, 0, "AirMapSettings", "Reference only");
} }
...@@ -33,5 +31,3 @@ DECLARE_SETTINGSFACT(AirMapSettings, userName) ...@@ -33,5 +31,3 @@ DECLARE_SETTINGSFACT(AirMapSettings, userName)
DECLARE_SETTINGSFACT(AirMapSettings, password) DECLARE_SETTINGSFACT(AirMapSettings, password)
DECLARE_SETTINGSFACT(AirMapSettings, enableAirMap) DECLARE_SETTINGSFACT(AirMapSettings, enableAirMap)
DECLARE_SETTINGSFACT(AirMapSettings, enableTelemetry) DECLARE_SETTINGSFACT(AirMapSettings, enableTelemetry)
DECLARE_SETTINGSFACT(AirMapSettings, loginEmail)
DECLARE_SETTINGSFACT(AirMapSettings, loginPassword)
...@@ -25,7 +25,5 @@ public: ...@@ -25,7 +25,5 @@ public:
DEFINE_SETTINGFACT(password) DEFINE_SETTINGFACT(password)
DEFINE_SETTINGFACT(enableAirMap) DEFINE_SETTINGFACT(enableAirMap)
DEFINE_SETTINGFACT(enableTelemetry) DEFINE_SETTINGFACT(enableTelemetry)
DEFINE_SETTINGFACT(loginEmail)
DEFINE_SETTINGFACT(loginPassword)
}; };
...@@ -122,21 +122,21 @@ QGCView { ...@@ -122,21 +122,21 @@ QGCView {
columns: 2 columns: 2
rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25
anchors.centerIn: parent anchors.centerIn: parent
QGCLabel { text: qsTr("Email:") } QGCLabel { text: qsTr("User Name:") }
FactTextField { FactTextField {
fact: _loginEmailFact fact: _usernameFact
width: _editFieldWidth width: _editFieldWidth
enabled: _airMapEnabled enabled: _airMapEnabled
visible: _loginEmailFact.visible visible: _usernameFact.visible
property Fact _loginEmailFact: QGroundControl.settingsManager.airMapSettings.loginEmail property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName
} }
QGCLabel { text: qsTr("Password:") } QGCLabel { text: qsTr("Password:") }
FactTextField { FactTextField {
fact: _loginPasswordFact fact: _passwordFact
width: _editFieldWidth width: _editFieldWidth
enabled: _airMapEnabled enabled: _airMapEnabled
visible: _loginPasswordFact.visible visible: _passwordFact.visible
property Fact _loginPasswordFact: QGroundControl.settingsManager.airMapSettings.loginPassword property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password
} }
Item { Item {
width: 1 width: 1
...@@ -144,20 +144,20 @@ QGCView { ...@@ -144,20 +144,20 @@ QGCView {
Layout.columnSpan: 2 Layout.columnSpan: 2
} }
QGCLabel { QGCLabel {
text: qsTr("Forgot Your AirMap Password?") text: qsTr("Forgot Your AirMap Password?")
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2 Layout.columnSpan: 2
} }
Item { Item {
width: 1 width: 1
height: 1 height: 1
Layout.columnSpan: 2 Layout.columnSpan: 2
} }
QGCButton { QGCButton {
text: qsTr("Register for an AirMap Account") text: qsTr("Register for an AirMap Account")
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2 Layout.columnSpan: 2
enabled: _airMapEnabled enabled: _airMapEnabled
onClicked: { onClicked: {
Qt.openUrlExternally("https://www.airmap.com"); Qt.openUrlExternally("https://www.airmap.com");
} }
...@@ -174,7 +174,7 @@ QGCView { ...@@ -174,7 +174,7 @@ QGCView {
visible: QGroundControl.settingsManager.appSettings.visible visible: QGroundControl.settingsManager.appSettings.visible
QGCLabel { QGCLabel {
id: profileLabel id: profileLabel
text: qsTr("Pilot Profile") text: qsTr("Pilot Profile (WIP)")
font.family: ScreenTools.demiboldFontFamily font.family: ScreenTools.demiboldFontFamily
} }
} }
...@@ -226,14 +226,25 @@ QGCView { ...@@ -226,14 +226,25 @@ QGCView {
columnSpacing: ScreenTools.defaultFontPixelHeight * 2 columnSpacing: ScreenTools.defaultFontPixelHeight * 2
rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25 rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25
anchors.centerIn: parent anchors.centerIn: parent
QGCLabel { text: qsTr("API Key:") } QGCCheckBox {
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth; } id: hasPrivateKey
QGCLabel { text: qsTr("Client ID:") } text: qsTr("Personal API Key")
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth; } Layout.columnSpan: 2
QGCLabel { text: qsTr("User Name:") } Component.onCompleted: {
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.userName; width: _editFieldWidth; } if(QGroundControl.settingsManager.airMapSettings.apiKey !== "")
QGCLabel { text: qsTr("Password:") } checked = true
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.password; width: _editFieldWidth; echoMode: TextInput.Password } }
}
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; }
} }
} }
//----------------------------------------------------------------- //-----------------------------------------------------------------
......
...@@ -128,7 +128,7 @@ const QObject* QmlObjectListModel::operator[](int index) const ...@@ -128,7 +128,7 @@ const QObject* QmlObjectListModel::operator[](int index) const
return _objectList[index]; return _objectList[index];
} }
void QmlObjectListModel::clear(void) void QmlObjectListModel::clear()
{ {
while (rowCount()) { while (rowCount()) {
removeAt(0); removeAt(0);
...@@ -218,7 +218,7 @@ QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist) ...@@ -218,7 +218,7 @@ QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist)
return oldlist; return oldlist;
} }
int QmlObjectListModel::count(void) const int QmlObjectListModel::count() const
{ {
return rowCount(); return rowCount();
} }
...@@ -247,7 +247,7 @@ void QmlObjectListModel::_childDirtyChanged(bool dirty) ...@@ -247,7 +247,7 @@ void QmlObjectListModel::_childDirtyChanged(bool dirty)
emit dirtyChanged(_dirty); emit dirtyChanged(_dirty);
} }
void QmlObjectListModel::deleteListAndContents(void) void QmlObjectListModel::deleteListAndContents()
{ {
for (int i=0; i<_objectList.count(); i++) { for (int i=0; i<_objectList.count(); i++) {
_objectList[i]->deleteLater(); _objectList[i]->deleteLater();
...@@ -255,7 +255,7 @@ void QmlObjectListModel::deleteListAndContents(void) ...@@ -255,7 +255,7 @@ void QmlObjectListModel::deleteListAndContents(void)
deleteLater(); deleteLater();
} }
void QmlObjectListModel::clearAndDeleteContents(void) void QmlObjectListModel::clearAndDeleteContents()
{ {
beginResetModel(); beginResetModel();
for (int i=0; i<_objectList.count(); i++) { for (int i=0; i<_objectList.count(); i++) {
......
...@@ -31,50 +31,50 @@ public: ...@@ -31,50 +31,50 @@ public:
// Property accessors // Property accessors
int count(void) const; int count () const;
bool dirty () const { return _dirty; }
bool dirty(void) const { return _dirty; } void setDirty (bool dirty);
void setDirty(bool dirty); void append (QObject* object);
void append (QList<QObject*> objects);
void append(QObject* object); QObjectList swapObjectList (const QObjectList& newlist);
void append(QList<QObject*> objects); void clear ();
QObjectList swapObjectList(const QObjectList& newlist); QObject* removeAt (int i);
void clear(void); QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); }
QObject* removeAt(int i); void insert (int i, QObject* object);
QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); } void insert (int i, QList<QObject*> objects);
void insert(int i, QObject* object); bool contains (QObject* object) { return _objectList.indexOf(object) != -1; }
void insert(int i, QList<QObject*> objects); int indexOf (QObject* object) { return _objectList.indexOf(object); }
QObject* operator[](int i);
const QObject* operator[](int i) const; QObject* operator[] (int i);
bool contains(QObject* object) { return _objectList.indexOf(object) != -1; } const QObject* operator[] (int i) const;
int indexOf(QObject* object) { return _objectList.indexOf(object); } template<class T> T value (int index) { return qobject_cast<T>(_objectList[index]); }
template<class T> T value(int index) { return qobject_cast<T>(_objectList[index]); } QList<QObject*>* objectList () { return &_objectList; }
/// Calls deleteLater on all items and this itself. /// Calls deleteLater on all items and this itself.
void deleteListAndContents (void); void deleteListAndContents ();
/// Clears the list and calls deleteLater on each entry /// Clears the list and calls deleteLater on each entry
void clearAndDeleteContents (void); void clearAndDeleteContents ();
void beginReset () { beginResetModel(); } void beginReset () { beginResetModel(); }
void endReset () { endResetModel(); } void endReset () { endResetModel(); }
signals: signals:
void countChanged (int count); void countChanged (int count);
void dirtyChanged (bool dirtyChanged); void dirtyChanged (bool dirtyChanged);
private slots: private slots:
void _childDirtyChanged (bool dirty); void _childDirtyChanged (bool dirty);
private: private:
// Overrides from QAbstractListModel // Overrides from QAbstractListModel
int rowCount(const QModelIndex & parent = QModelIndex()) const override; int rowCount (const QModelIndex & parent = QModelIndex()) const override;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) 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<int, QByteArray> roleNames(void) const override; QHash<int, QByteArray> 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: private:
QList<QObject*> _objectList; QList<QObject*> _objectList;
......
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