AirMapManager.cc 7.5 KB
Newer Older
1 2
/****************************************************************************
 *
3
 *   (c) 2017 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8 9
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

Gus Grubba's avatar
Gus Grubba committed
10
#include "AirMapAdvisoryManager.h"
Gus Grubba's avatar
Gus Grubba committed
11 12 13
#include "AirMapFlightPlanManager.h"
#include "AirMapManager.h"
#include "AirMapRestrictionManager.h"
14 15 16 17
#include "AirMapRulesetsManager.h"
#include "AirMapSettings.h"
#include "AirMapTelemetry.h"
#include "AirMapTrafficMonitor.h"
Gus Grubba's avatar
Gus Grubba committed
18
#include "AirMapVehicleManager.h"
Gus Grubba's avatar
Gus Grubba committed
19
#include "AirMapWeatherInfoManager.h"
20

21 22 23 24
#include "QmlObjectListModel.h"
#include "JsonHelper.h"
#include "SettingsManager.h"
#include "AppSettings.h"
25
#include "QGCQGeoCoordinate.h"
26
#include "QGCApplication.h"
27

28
#include <airmap/authenticator.h>
29

Gus Grubba's avatar
Gus Grubba committed
30 31 32 33 34
//-- Hardwired API key
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
#include "Airmap_api_key.h"
#endif

35
using namespace airmap;
36

37
QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog")
38

39
//-----------------------------------------------------------------------------
40 41 42
AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox)
    : AirspaceManager(app, toolbox)
{
43
    _logger = std::make_shared<qt::Logger>();
44
    qt::register_types(); // TODO: still needed?
45 46
    _logger->logging_category().setEnabled(QtDebugMsg,   false);
    _logger->logging_category().setEnabled(QtInfoMsg,    false);
47
    _logger->logging_category().setEnabled(QtWarningMsg, false);
48 49 50 51
    _dispatchingLogger = std::make_shared<qt::DispatchingLogger>(_logger);
    connect(&_shared, &AirMapSharedState::error, this, &AirMapManager::_error);
}

52
//-----------------------------------------------------------------------------
53 54 55 56 57
AirMapManager::~AirMapManager()
{
    if (_shared.client()) {
        delete _shared.client();
    }
58 59
}

60
//-----------------------------------------------------------------------------
61 62
void
AirMapManager::setToolbox(QGCToolbox* toolbox)
63
{
64
    AirspaceManager::setToolbox(toolbox);
65
    AirMapSettings* ap = toolbox->settingsManager()->airMapSettings();
66 67 68 69 70
    connect(ap->usePersonalApiKey(),&Fact::rawValueChanged, this, &AirMapManager::_settingsChanged);
    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);
71 72 73
    _settingsChanged();
}

74
//-----------------------------------------------------------------------------
75 76
void
AirMapManager::_error(const QString& what, const QString& airmapdMessage, const QString& airmapdDetails)
77
{
78 79
    qCDebug(AirMapManagerLog) << "Error: "<<what<<", msg: "<<airmapdMessage<<", details: "<<airmapdDetails;
    qgcApp()->showMessage(QString("AirMap Error: %1. %2").arg(what).arg(airmapdMessage));
80 81
}

82
//-----------------------------------------------------------------------------
83 84
void
AirMapManager::_settingsChanged()
85 86 87
{
    qCDebug(AirMapManagerLog) << "AirMap settings changed";
    AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings();
88 89
    AirMapSharedState::Settings settings;
    settings.apiKey = ap->apiKey()->rawValueString();
Gus Grubba's avatar
Gus Grubba committed
90 91 92
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
    bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty();
#else
93
    bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey;
Gus Grubba's avatar
Gus Grubba committed
94
#endif
95 96 97
    settings.clientID = ap->clientID()->rawValueString();
    settings.userName = ap->userName()->rawValueString();
    settings.password = ap->password()->rawValueString();
98
    //-- If we have a hardwired key (and no custom key is present or enabled), set it.
Gus Grubba's avatar
Gus Grubba committed
99
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
100
    if(!ap->usePersonalApiKey()->rawValue().toBool() && (settings.apiKey.isEmpty() || settings.clientID.isEmpty())) {
Gus Grubba's avatar
Gus Grubba committed
101 102 103 104
        settings.apiKey     = kAirmapAPIKey;
        settings.clientID   = kAirmapClientID;
    }
#endif
105
    _shared.setSettings(settings);
106
    //-- Need to re-create the client if the API key changed
107 108 109
    if (_shared.client() && apiKeyChanged) {
        delete _shared.client();
        _shared.setClient(nullptr);
110
    }
111 112 113 114
    if (!_shared.client() && settings.apiKey != "") {
        qCDebug(AirMapManagerLog) << "Creating AirMap client";
        auto credentials    = Credentials{};
        credentials.api_key = _shared.settings().apiKey.toStdString();
115
        auto configuration  = Client::default_production_configuration(credentials);
Gus Grubba's avatar
Gus Grubba committed
116
        qt::Client::create(configuration, _dispatchingLogger, this, [this](const qt::Client::CreateResult& result) {
117 118 119 120 121
            if (result) {
                qCDebug(AirMapManagerLog) << "Successfully created airmap::qt::Client instance";
                _shared.setClient(result.value());
            } else {
                qWarning("Failed to create airmap::qt::Client instance");
122 123 124
                QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : "");
                _error("Failed to create airmap::qt::Client instance",
                        QString::fromStdString(result.error().message()), description);
125 126
            }
        });
127 128 129 130
    } else {
        if(settings.apiKey == "") {
            qCDebug(AirMapManagerLog) << "No API key for AirMap";
        }
131 132 133
    }
}

134
//-----------------------------------------------------------------------------
135 136
AirspaceVehicleManager*
AirMapManager::instantiateVehicle(const Vehicle& vehicle)
137
{
138
    AirMapVehicleManager* manager = new AirMapVehicleManager(_shared, vehicle);
139
    connect(manager, &AirMapVehicleManager::error, this, &AirMapManager::_error);
140
    return manager;
141 142
}

143
//-----------------------------------------------------------------------------
144
AirspaceRulesetsProvider*
145
AirMapManager::_instantiateRulesetsProvider()
Gus Grubba's avatar
Gus Grubba committed
146 147 148 149 150 151
{
    AirMapRulesetsManager* rulesetsManager = new AirMapRulesetsManager(_shared);
    connect(rulesetsManager, &AirMapRulesetsManager::error, this, &AirMapManager::_error);
    return rulesetsManager;
}

152
//-----------------------------------------------------------------------------
153
AirspaceWeatherInfoProvider*
154
AirMapManager::_instatiateAirspaceWeatherInfoProvider()
Gus Grubba's avatar
Gus Grubba committed
155
{
Gus Grubba's avatar
Gus Grubba committed
156 157
    AirMapWeatherInfoManager* weatherInfo = new AirMapWeatherInfoManager(_shared);
    connect(weatherInfo, &AirMapWeatherInfoManager::error, this, &AirMapManager::_error);
158
    return weatherInfo;
Gus Grubba's avatar
Gus Grubba committed
159
}
Gus Grubba's avatar
Gus Grubba committed
160

161
//-----------------------------------------------------------------------------
Gus Grubba's avatar
Gus Grubba committed
162
AirspaceAdvisoryProvider*
163
AirMapManager::_instatiateAirspaceAdvisoryProvider()
Gus Grubba's avatar
Gus Grubba committed
164
{
Gus Grubba's avatar
Gus Grubba committed
165 166
    AirMapAdvisoryManager* advisories = new AirMapAdvisoryManager(_shared);
    connect(advisories, &AirMapAdvisoryManager::error, this, &AirMapManager::_error);
Gus Grubba's avatar
Gus Grubba committed
167 168
    return advisories;
}
169

170
//-----------------------------------------------------------------------------
171
AirspaceRestrictionProvider*
172
AirMapManager::_instantiateAirspaceRestrictionProvider()
173 174 175 176 177
{
    AirMapRestrictionManager* airspaces = new AirMapRestrictionManager(_shared);
    connect(airspaces, &AirMapRestrictionManager::error, this, &AirMapManager::_error);
    return airspaces;
}
178 179

//-----------------------------------------------------------------------------
Gus Grubba's avatar
Gus Grubba committed
180 181
AirspaceFlightPlanProvider*
AirMapManager::_instantiateAirspaceFlightPlanProvider()
182
{
Gus Grubba's avatar
Gus Grubba committed
183 184 185
    AirMapFlightPlanManager* flightPlan = new AirMapFlightPlanManager(_shared);
    connect(flightPlan, &AirMapFlightPlanManager::error, this, &AirMapManager::_error);
    return flightPlan;
186
}