AirmapAdvisories.cc 2.32 KB
Newer Older
Gus Grubba's avatar
Gus Grubba committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#include "AirMapAdvisories.h"
#include "AirMapManager.h"

#define ADVISORY_UPDATE_DISTANCE    500     //-- 500m threshold for updates

using namespace airmap;

AirMapAdvisories::AirMapAdvisories(AirMapSharedState& shared, QObject *parent)
    : AirspaceAdvisoryProvider(parent)
    , _valid(false)
    , _shared(shared)
{
}

void
AirMapAdvisories::setROI(const QGeoCoordinate& center, double radiusMeters)
{
    //-- If first time or we've moved more than ADVISORY_UPDATE_DISTANCE, ask for updates.
    if(!_lastRoiCenter.isValid() || _lastRoiCenter.distanceTo(center) > ADVISORY_UPDATE_DISTANCE) {
        _lastRoiCenter = center;
        _requestAdvisories(center, radiusMeters);
    }
}

void
AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double radiusMeters)
{
    qCDebug(AirMapManagerLog) << "Advisories Request";
    if (!_shared.client()) {
        qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Advisories";
        _valid = false;
        emit advisoryChanged();
        return;
    }
    _advisories.clear();
    _valid = false;
    Status::GetStatus::Parameters params;
    params.longitude = coordinate.longitude();
    params.latitude  = coordinate.latitude();
    params.weather   = false;
    params.buffer    = radiusMeters;
    _shared.client()->status().get_status_by_point(params, [this, coordinate](const Status::GetStatus::Result& result) {
        if (result) {
            qCDebug(AirMapManagerLog) << _advisories.size() << "Advisories Received";
            _advisories     = result.value().advisories;
            _advisory_color = result.value().advisory_color;
            if(_advisories.size()) {
                _valid = true;
                qCDebug(AirMapManagerLog) << "Advisory Info: " << _advisories.size() << _advisories[0].airspace.name().data();
            }
        } else {
            qCDebug(AirMapManagerLog) << "Advisories Request Failed";
            _valid = false;
        }
        emit advisoryChanged();
    });
}