AirMapManager.cc 7.18 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,   true);
    _logger->logging_category().setEnabled(QtInfoMsg,    true);
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
    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);
70 71 72
    _settingsChanged();
}

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

81
//-----------------------------------------------------------------------------
82 83
void
AirMapManager::_settingsChanged()
84 85 86
{
    qCDebug(AirMapManagerLog) << "AirMap settings changed";
    AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings();
87 88
    AirMapSharedState::Settings settings;
    settings.apiKey = ap->apiKey()->rawValueString();
Gus Grubba's avatar
Gus Grubba committed
89 90 91
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
    bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty();
#else
92
    bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey;
Gus Grubba's avatar
Gus Grubba committed
93
#endif
94 95 96
    settings.clientID = ap->clientID()->rawValueString();
    settings.userName = ap->userName()->rawValueString();
    settings.password = ap->password()->rawValueString();
Gus Grubba's avatar
Gus Grubba committed
97 98 99 100 101 102 103
    //-- 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
104
    _shared.setSettings(settings);
105
    //-- Need to re-create the client if the API key changed
106 107 108
    if (_shared.client() && apiKeyChanged) {
        delete _shared.client();
        _shared.setClient(nullptr);
109
    }
110 111 112 113
    if (!_shared.client() && settings.apiKey != "") {
        qCDebug(AirMapManagerLog) << "Creating AirMap client";
        auto credentials    = Credentials{};
        credentials.api_key = _shared.settings().apiKey.toStdString();
114
        auto configuration  = Client::default_production_configuration(credentials);
115 116 117 118 119 120
        qt::Client::create(configuration, _dispatchingLogger, this, [this, ap](const qt::Client::CreateResult& result) {
            if (result) {
                qCDebug(AirMapManagerLog) << "Successfully created airmap::qt::Client instance";
                _shared.setClient(result.value());
            } else {
                qWarning("Failed to create airmap::qt::Client instance");
121 122 123
                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);
124 125
            }
        });
126 127 128
    }
}

129
//-----------------------------------------------------------------------------
130 131
AirspaceVehicleManager*
AirMapManager::instantiateVehicle(const Vehicle& vehicle)
132
{
133
    AirMapVehicleManager* manager = new AirMapVehicleManager(_shared, vehicle);
134
    connect(manager, &AirMapVehicleManager::error, this, &AirMapManager::_error);
135
    return manager;
136 137
}

138
//-----------------------------------------------------------------------------
139
AirspaceRulesetsProvider*
140
AirMapManager::_instantiateRulesetsProvider()
Gus Grubba's avatar
Gus Grubba committed
141 142 143 144 145 146
{
    AirMapRulesetsManager* rulesetsManager = new AirMapRulesetsManager(_shared);
    connect(rulesetsManager, &AirMapRulesetsManager::error, this, &AirMapManager::_error);
    return rulesetsManager;
}

147
//-----------------------------------------------------------------------------
148
AirspaceWeatherInfoProvider*
149
AirMapManager::_instatiateAirspaceWeatherInfoProvider()
Gus Grubba's avatar
Gus Grubba committed
150
{
Gus Grubba's avatar
Gus Grubba committed
151 152
    AirMapWeatherInfoManager* weatherInfo = new AirMapWeatherInfoManager(_shared);
    connect(weatherInfo, &AirMapWeatherInfoManager::error, this, &AirMapManager::_error);
153
    return weatherInfo;
Gus Grubba's avatar
Gus Grubba committed
154
}
Gus Grubba's avatar
Gus Grubba committed
155

156
//-----------------------------------------------------------------------------
Gus Grubba's avatar
Gus Grubba committed
157
AirspaceAdvisoryProvider*
158
AirMapManager::_instatiateAirspaceAdvisoryProvider()
Gus Grubba's avatar
Gus Grubba committed
159
{
Gus Grubba's avatar
Gus Grubba committed
160 161
    AirMapAdvisoryManager* advisories = new AirMapAdvisoryManager(_shared);
    connect(advisories, &AirMapAdvisoryManager::error, this, &AirMapManager::_error);
Gus Grubba's avatar
Gus Grubba committed
162 163
    return advisories;
}
164

165
//-----------------------------------------------------------------------------
166
AirspaceRestrictionProvider*
167
AirMapManager::_instantiateAirspaceRestrictionProvider()
168 169 170 171 172
{
    AirMapRestrictionManager* airspaces = new AirMapRestrictionManager(_shared);
    connect(airspaces, &AirMapRestrictionManager::error, this, &AirMapManager::_error);
    return airspaces;
}
173 174

//-----------------------------------------------------------------------------
Gus Grubba's avatar
Gus Grubba committed
175 176
AirspaceFlightPlanProvider*
AirMapManager::_instantiateAirspaceFlightPlanProvider()
177
{
Gus Grubba's avatar
Gus Grubba committed
178 179 180
    AirMapFlightPlanManager* flightPlan = new AirMapFlightPlanManager(_shared);
    connect(flightPlan, &AirMapFlightPlanManager::error, this, &AirMapManager::_error);
    return flightPlan;
181
}