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

#include "AirMapManager.h"
Gus Grubba's avatar
Gus Grubba committed
11
#include "AirMapAdvisories.h"
Gus Grubba's avatar
Gus Grubba committed
12
#include "AirMapWeatherInformation.h"
13 14 15 16 17
#include "AirMapRestrictionManager.h"
#include "AirMapRulesetsManager.h"
#include "AirMapSettings.h"
#include "AirMapTelemetry.h"
#include "AirMapTrafficMonitor.h"
Gus Grubba's avatar
Gus Grubba committed
18
#include "AirMapVehicleManager.h"
19

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

27
#include <airmap/authenticator.h>
28

29
using namespace airmap;
30

31
QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog")
32

33 34 35
AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox)
    : AirspaceManager(app, toolbox)
{
36
    _logger = std::make_shared<qt::Logger>();
37
    qt::register_types(); // TODO: still needed?s
Gus Grubba's avatar
Gus Grubba committed
38
    _logger->logging_category().setEnabled(QtDebugMsg, true);
39 40 41 42 43 44 45 46 47 48 49
    _logger->logging_category().setEnabled(QtInfoMsg, true);
    _logger->logging_category().setEnabled(QtWarningMsg, true);
    _dispatchingLogger = std::make_shared<qt::DispatchingLogger>(_logger);
    connect(&_shared, &AirMapSharedState::error, this, &AirMapManager::_error);
}

AirMapManager::~AirMapManager()
{
    if (_shared.client()) {
        delete _shared.client();
    }
50 51
}

52 53
void
AirMapManager::setToolbox(QGCToolbox* toolbox)
54
{
55
    AirspaceManager::setToolbox(toolbox);
56
    AirMapSettings* ap = toolbox->settingsManager()->airMapSettings();
57 58 59 60
    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);
61 62 63
    _settingsChanged();
}

64 65
void
AirMapManager::_error(const QString& what, const QString& airmapdMessage, const QString& airmapdDetails)
66
{
67 68
    qCDebug(AirMapManagerLog) << "Error: "<<what<<", msg: "<<airmapdMessage<<", details: "<<airmapdDetails;
    qgcApp()->showMessage(QString("AirMap Error: %1. %2").arg(what).arg(airmapdMessage));
69 70
}

71 72
void
AirMapManager::_settingsChanged()
73 74 75
{
    qCDebug(AirMapManagerLog) << "AirMap settings changed";
    AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings();
76 77 78 79 80 81 82 83 84 85 86
    AirMapSharedState::Settings settings;
    settings.apiKey = ap->apiKey()->rawValueString();
    bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey;
    settings.clientID = ap->clientID()->rawValueString();
    settings.userName = ap->userName()->rawValueString();
    settings.password = ap->password()->rawValueString();
    _shared.setSettings(settings);
    // need to re-create the client if the API key changed
    if (_shared.client() && apiKeyChanged) {
        delete _shared.client();
        _shared.setClient(nullptr);
87
    }
88 89 90 91 92 93 94 95 96 97 98
    if (!_shared.client() && settings.apiKey != "") {
        qCDebug(AirMapManagerLog) << "Creating AirMap client";
        auto credentials    = Credentials{};
        credentials.api_key = _shared.settings().apiKey.toStdString();
        auto configuration  = Client::default_staging_configuration(credentials);
        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");
99 100 101
                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);
102 103
            }
        });
104 105 106
    }
}

107 108
AirspaceVehicleManager*
AirMapManager::instantiateVehicle(const Vehicle& vehicle)
109
{
110 111
    AirMapVehicleManager* manager = new AirMapVehicleManager(_shared, vehicle, *_toolbox);
    connect(manager, &AirMapVehicleManager::error, this, &AirMapManager::_error);
112
    return manager;
113 114
}

115 116
AirspaceRestrictionProvider*
AirMapManager::instantiateRestrictionProvider()
117
{
118 119
    AirMapRestrictionManager* restrictionManager = new AirMapRestrictionManager(_shared);
    connect(restrictionManager, &AirMapRestrictionManager::error, this, &AirMapManager::_error);
120
    return restrictionManager;
121 122
}

123 124
AirspaceRulesetsProvider*
AirMapManager::instantiateRulesetsProvider()
Gus Grubba's avatar
Gus Grubba committed
125 126 127 128 129 130
{
    AirMapRulesetsManager* rulesetsManager = new AirMapRulesetsManager(_shared);
    connect(rulesetsManager, &AirMapRulesetsManager::error, this, &AirMapManager::_error);
    return rulesetsManager;
}

131 132
AirspaceWeatherInfoProvider*
AirMapManager::instatiateAirspaceWeatherInfoProvider()
Gus Grubba's avatar
Gus Grubba committed
133
{
134 135 136
    AirMapWeatherInformation* weatherInfo = new AirMapWeatherInformation(_shared);
    connect(weatherInfo, &AirMapWeatherInformation::error, this, &AirMapManager::_error);
    return weatherInfo;
Gus Grubba's avatar
Gus Grubba committed
137
}
Gus Grubba's avatar
Gus Grubba committed
138 139 140 141 142 143 144 145

AirspaceAdvisoryProvider*
AirMapManager::instatiateAirspaceAdvisoryProvider()
{
    AirMapAdvisories* advisories = new AirMapAdvisories(_shared);
    connect(advisories, &AirMapAdvisories::error, this, &AirMapManager::_error);
    return advisories;
}