Commit f15226ae authored by Gus Grubba's avatar Gus Grubba

An rather unfruitful attempt at consolidating Advisories and Airspaces (they...

An rather unfruitful attempt at consolidating Advisories and Airspaces (they are both arrays of Airspaces). No such luck as they vary wildly. In the end, I'm now exposing the restrictions (Polygons) directly (and inherently) instead of copying them.
Tweaked polygon overlay colors and borders.
parent 0303f5e9
...@@ -8,8 +8,13 @@ ...@@ -8,8 +8,13 @@
****************************************************************************/ ****************************************************************************/
#include "AirMapAdvisoryManager.h" #include "AirMapAdvisoryManager.h"
#include "AirspaceRestriction.h"
#include "AirMapManager.h" #include "AirMapManager.h"
#include <QTimer>
#include "airmap/airspaces.h"
#define ADVISORY_UPDATE_DISTANCE 500 //-- 500m threshold for updates #define ADVISORY_UPDATE_DISTANCE 500 //-- 500m threshold for updates
using namespace airmap; using namespace airmap;
...@@ -25,6 +30,7 @@ AirMapAdvisory::AirMapAdvisory(QObject* parent) ...@@ -25,6 +30,7 @@ AirMapAdvisory::AirMapAdvisory(QObject* parent)
AirMapAdvisoryManager::AirMapAdvisoryManager(AirMapSharedState& shared, QObject *parent) AirMapAdvisoryManager::AirMapAdvisoryManager(AirMapSharedState& shared, QObject *parent)
: AirspaceAdvisoryProvider(parent) : AirspaceAdvisoryProvider(parent)
, _valid(false) , _valid(false)
, _lastRadius(0.0)
, _shared(shared) , _shared(shared)
{ {
} }
...@@ -34,9 +40,10 @@ void ...@@ -34,9 +40,10 @@ void
AirMapAdvisoryManager::setROI(const QGeoCoordinate& center, double radiusMeters) AirMapAdvisoryManager::setROI(const QGeoCoordinate& center, double radiusMeters)
{ {
//-- If first time or we've moved more than ADVISORY_UPDATE_DISTANCE, ask for updates. //-- If first time or we've moved more than ADVISORY_UPDATE_DISTANCE, ask for updates.
if(!_lastRoiCenter.isValid() || _lastRoiCenter.distanceTo(center) > ADVISORY_UPDATE_DISTANCE) { if(!_lastRoiCenter.isValid() || _lastRoiCenter.distanceTo(center) > ADVISORY_UPDATE_DISTANCE || _lastRadius != radiusMeters) {
_lastRadius = radiusMeters;
_lastRoiCenter = center; _lastRoiCenter = center;
_requestAdvisories(center, radiusMeters); _requestAdvisories();
} }
} }
...@@ -52,7 +59,7 @@ adv_sort(QObject* a, QObject* b) ...@@ -52,7 +59,7 @@ adv_sort(QObject* a, QObject* b)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
AirMapAdvisoryManager::_requestAdvisories(const QGeoCoordinate& coordinate, double radiusMeters) AirMapAdvisoryManager::_requestAdvisories()
{ {
qCDebug(AirMapManagerLog) << "Advisories Request"; qCDebug(AirMapManagerLog) << "Advisories Request";
if (!_shared.client()) { if (!_shared.client()) {
...@@ -64,11 +71,14 @@ AirMapAdvisoryManager::_requestAdvisories(const QGeoCoordinate& coordinate, doub ...@@ -64,11 +71,14 @@ AirMapAdvisoryManager::_requestAdvisories(const QGeoCoordinate& coordinate, doub
_valid = false; _valid = false;
_airspaces.clearAndDeleteContents(); _airspaces.clearAndDeleteContents();
Status::GetStatus::Parameters params; Status::GetStatus::Parameters params;
params.longitude = coordinate.longitude(); params.longitude = _lastRoiCenter.longitude();
params.latitude = coordinate.latitude(); params.latitude = _lastRoiCenter.latitude();
params.types = Airspace::Type::all;
params.weather = false; params.weather = false;
params.buffer = radiusMeters; params.buffer = _lastRadius;
_shared.client()->status().get_status_by_point(params, [this, coordinate](const Status::GetStatus::Result& result) { std::weak_ptr<LifetimeChecker> isAlive(_instance);
_shared.client()->status().get_status_by_point(params, [this, isAlive](const Status::GetStatus::Result& result) {
if (!isAlive.lock()) return;
if (result) { if (result) {
qCDebug(AirMapManagerLog) << "Successful advisory search. Items:" << result.value().advisories.size(); qCDebug(AirMapManagerLog) << "Successful advisory search. Items:" << result.value().advisories.size();
_airspaceColor = (AirspaceAdvisoryProvider::AdvisoryColor)(int)result.value().advisory_color; _airspaceColor = (AirspaceAdvisoryProvider::AdvisoryColor)(int)result.value().advisory_color;
...@@ -79,10 +89,6 @@ AirMapAdvisoryManager::_requestAdvisories(const QGeoCoordinate& coordinate, doub ...@@ -79,10 +89,6 @@ AirMapAdvisoryManager::_requestAdvisories(const QGeoCoordinate& coordinate, doub
pAdvisory->_name = QString::fromStdString(advisory.airspace.name()); pAdvisory->_name = QString::fromStdString(advisory.airspace.name());
pAdvisory->_type = (AirspaceAdvisory::AdvisoryType)(int)advisory.airspace.type(); pAdvisory->_type = (AirspaceAdvisory::AdvisoryType)(int)advisory.airspace.type();
pAdvisory->_color = (AirspaceAdvisoryProvider::AdvisoryColor)(int)advisory.color; pAdvisory->_color = (AirspaceAdvisoryProvider::AdvisoryColor)(int)advisory.color;
//-- TODO: Add airspace center coordinates and radius (easy to get from Json but
// I have no idea how to get it from airmap::Airspace.)
// pAdvisory->_coordinates = QGeoCoordinate( something );
// pAdvisory->_radius = something ;
_airspaces.append(pAdvisory); _airspaces.append(pAdvisory);
qCDebug(AirMapManagerLog) << "Adding advisory" << pAdvisory->name(); qCDebug(AirMapManagerLog) << "Adding advisory" << pAdvisory->name();
} }
......
...@@ -60,9 +60,10 @@ public: ...@@ -60,9 +60,10 @@ public:
signals: signals:
void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
private: private:
void _requestAdvisories (const QGeoCoordinate& coordinate, double radiusMeters); void _requestAdvisories();
private: private:
bool _valid; bool _valid;
double _lastRadius;
AirMapSharedState& _shared; AirMapSharedState& _shared;
QGeoCoordinate _lastRoiCenter; QGeoCoordinate _lastRoiCenter;
QmlObjectListModel _airspaces; QmlObjectListModel _airspaces;
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
#include "AirMapManager.h" #include "AirMapManager.h"
#include "AirMapAdvisoryManager.h" #include "AirMapAdvisoryManager.h"
#include "AirMapWeatherInfoManager.h" #include "AirMapWeatherInfoManager.h"
#include "AirMapRestrictionManager.h"
#include "AirMapRulesetsManager.h" #include "AirMapRulesetsManager.h"
#include "AirMapSettings.h" #include "AirMapSettings.h"
#include "AirMapTelemetry.h" #include "AirMapTelemetry.h"
#include "AirMapRestrictionManager.h"
#include "AirMapTrafficMonitor.h" #include "AirMapTrafficMonitor.h"
#include "AirMapVehicleManager.h" #include "AirMapVehicleManager.h"
...@@ -112,14 +112,6 @@ AirMapManager::instantiateVehicle(const Vehicle& vehicle) ...@@ -112,14 +112,6 @@ AirMapManager::instantiateVehicle(const Vehicle& vehicle)
return manager; return manager;
} }
AirspaceRestrictionProvider*
AirMapManager::instantiateRestrictionProvider()
{
AirMapRestrictionManager* restrictionManager = new AirMapRestrictionManager(_shared);
connect(restrictionManager, &AirMapRestrictionManager::error, this, &AirMapManager::_error);
return restrictionManager;
}
AirspaceRulesetsProvider* AirspaceRulesetsProvider*
AirMapManager::instantiateRulesetsProvider() AirMapManager::instantiateRulesetsProvider()
{ {
...@@ -143,3 +135,11 @@ AirMapManager::instatiateAirspaceAdvisoryProvider() ...@@ -143,3 +135,11 @@ AirMapManager::instatiateAirspaceAdvisoryProvider()
connect(advisories, &AirMapAdvisoryManager::error, this, &AirMapManager::_error); connect(advisories, &AirMapAdvisoryManager::error, this, &AirMapManager::_error);
return advisories; return advisories;
} }
AirspaceRestrictionProvider*
AirMapManager::instantiateAirspaceRestrictionProvider()
{
AirMapRestrictionManager* airspaces = new AirMapRestrictionManager(_shared);
connect(airspaces, &AirMapRestrictionManager::error, this, &AirMapManager::_error);
return airspaces;
}
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
class QGCToolbox; class QGCToolbox;
class AirspaceVehicleManager; class AirspaceVehicleManager;
class AirspaceRestrictionProvider;
class AirspaceRulesetsProvider; class AirspaceRulesetsProvider;
class AirspaceWeatherInfoProvider; class AirspaceWeatherInfoProvider;
class AirspaceAdvisoryProvider; class AirspaceAdvisoryProvider;
class AirspaceRestrictionProvider;
Q_DECLARE_LOGGING_CATEGORY(AirMapManagerLog) Q_DECLARE_LOGGING_CATEGORY(AirMapManagerLog)
...@@ -44,10 +44,10 @@ public: ...@@ -44,10 +44,10 @@ public:
void setToolbox (QGCToolbox* toolbox) override; void setToolbox (QGCToolbox* toolbox) override;
AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) override; AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) override;
AirspaceRestrictionProvider* instantiateRestrictionProvider () override;
AirspaceRulesetsProvider* instantiateRulesetsProvider () override; AirspaceRulesetsProvider* instantiateRulesetsProvider () override;
AirspaceWeatherInfoProvider* instatiateAirspaceWeatherInfoProvider () override; AirspaceWeatherInfoProvider* instatiateAirspaceWeatherInfoProvider () override;
AirspaceAdvisoryProvider* instatiateAirspaceAdvisoryProvider () override; AirspaceAdvisoryProvider* instatiateAirspaceAdvisoryProvider () override;
AirspaceRestrictionProvider* instantiateAirspaceRestrictionProvider () override;
QString name () const override { return "AirMap"; } QString name () const override { return "AirMap"; }
......
...@@ -13,15 +13,32 @@ ...@@ -13,15 +13,32 @@
#include "airmap/airspaces.h" #include "airmap/airspaces.h"
#define RESTRICTION_UPDATE_DISTANCE 500 //-- 500m threshold for updates
using namespace airmap; using namespace airmap;
//-----------------------------------------------------------------------------
AirMapRestrictionManager::AirMapRestrictionManager(AirMapSharedState& shared) AirMapRestrictionManager::AirMapRestrictionManager(AirMapSharedState& shared)
: _shared(shared) : _shared(shared)
, _lastRadius(0.0)
{ {
} }
//-----------------------------------------------------------------------------
void void
AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMeters) AirMapRestrictionManager::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) > RESTRICTION_UPDATE_DISTANCE || _lastRadius != radiusMeters) {
_lastRadius = radiusMeters;
_lastRoiCenter = center;
_requestRestrictions(center, radiusMeters);
}
}
//-----------------------------------------------------------------------------
void
AirMapRestrictionManager::_requestRestrictions(const QGeoCoordinate& center, double radiusMeters)
{ {
if (!_shared.client()) { if (!_shared.client()) {
qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Airspace"; qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Airspace";
...@@ -32,8 +49,8 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete ...@@ -32,8 +49,8 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete
return; return;
} }
qCDebug(AirMapManagerLog) << "setting ROI"; qCDebug(AirMapManagerLog) << "setting ROI";
_polygonList.clear(); _polygons.clear();
_circleList.clear(); _circles.clear();
_state = State::RetrieveItems; _state = State::RetrieveItems;
Airspaces::Search::Parameters params; Airspaces::Search::Parameters params;
params.geometry = Geometry::point(center.latitude(), center.longitude()); params.geometry = Geometry::point(center.latitude(), center.longitude());
...@@ -52,19 +69,19 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete ...@@ -52,19 +69,19 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete
switch(geometry.type()) { switch(geometry.type()) {
case Geometry::Type::polygon: { case Geometry::Type::polygon: {
const Geometry::Polygon& polygon = geometry.details_for_polygon(); const Geometry::Polygon& polygon = geometry.details_for_polygon();
_addPolygonToList(polygon, _polygonList); _addPolygonToList(polygon);
} }
break; break;
case Geometry::Type::multi_polygon: { case Geometry::Type::multi_polygon: {
const Geometry::MultiPolygon& multiPolygon = geometry.details_for_multi_polygon(); const Geometry::MultiPolygon& multiPolygon = geometry.details_for_multi_polygon();
for (const auto& polygon : multiPolygon) { for (const auto& polygon : multiPolygon) {
_addPolygonToList(polygon, _polygonList); _addPolygonToList(polygon);
} }
} }
break; break;
case Geometry::Type::point: { case Geometry::Type::point: {
const Geometry::Point& point = geometry.details_for_point(); const Geometry::Point& point = geometry.details_for_point();
_circleList.append(new AirspaceCircularRestriction(QGeoCoordinate(point.latitude, point.longitude), 0.)); _circles.append(new AirspaceCircularRestriction(QGeoCoordinate(point.latitude, point.longitude), 0.));
// TODO: radius??? // TODO: radius???
} }
break; break;
...@@ -78,13 +95,13 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete ...@@ -78,13 +95,13 @@ AirMapRestrictionManager::setROI(const QGeoCoordinate& center, double radiusMete
emit error("Failed to retrieve Geofences", emit error("Failed to retrieve Geofences",
QString::fromStdString(result.error().message()), description); QString::fromStdString(result.error().message()), description);
} }
emit requestDone(true);
_state = State::Idle; _state = State::Idle;
}); });
} }
//-----------------------------------------------------------------------------
void void
AirMapRestrictionManager::_addPolygonToList(const airmap::Geometry::Polygon& polygon, QList<AirspacePolygonRestriction*>& list) AirMapRestrictionManager::_addPolygonToList(const airmap::Geometry::Polygon& polygon)
{ {
QVariantList polygonArray; QVariantList polygonArray;
for (const auto& vertex : polygon.outer_ring.coordinates) { for (const auto& vertex : polygon.outer_ring.coordinates) {
...@@ -96,7 +113,7 @@ AirMapRestrictionManager::_addPolygonToList(const airmap::Geometry::Polygon& pol ...@@ -96,7 +113,7 @@ AirMapRestrictionManager::_addPolygonToList(const airmap::Geometry::Polygon& pol
} }
polygonArray.append(QVariant::fromValue(coord)); polygonArray.append(QVariant::fromValue(coord));
} }
list.append(new AirspacePolygonRestriction(polygonArray)); _polygons.append(new AirspacePolygonRestriction(polygonArray));
if (polygon.inner_rings.size() > 0) { if (polygon.inner_rings.size() > 0) {
// no need to support those (they are rare, and in most cases, there's a more restrictive polygon filling the hole) // no need to support those (they are rare, and in most cases, there's a more restrictive polygon filling the hole)
qCDebug(AirMapManagerLog) << "Polygon with holes. Size: "<<polygon.inner_rings.size(); qCDebug(AirMapManagerLog) << "Polygon with holes. Size: "<<polygon.inner_rings.size();
......
...@@ -27,19 +27,28 @@ class AirMapRestrictionManager : public AirspaceRestrictionProvider, public Life ...@@ -27,19 +27,28 @@ class AirMapRestrictionManager : public AirspaceRestrictionProvider, public Life
{ {
Q_OBJECT Q_OBJECT
public: public:
AirMapRestrictionManager (AirMapSharedState& shared); AirMapRestrictionManager (AirMapSharedState& shared);
void setROI (const QGeoCoordinate& center, double radiusMeters) override; QmlObjectListModel* polygons () override { return &_polygons; }
QmlObjectListModel* circles () override { return &_circles; }
void setROI (const QGeoCoordinate& center, double radiusMeters) override;
signals: signals:
void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails);
private: private:
static void _addPolygonToList (const airmap::Geometry::Polygon& polygon, QList<AirspacePolygonRestriction*>& list); void _requestRestrictions(const QGeoCoordinate& center, double radiusMeters);
void _addPolygonToList (const airmap::Geometry::Polygon& polygon);
enum class State { enum class State {
Idle, Idle,
RetrieveItems, RetrieveItems,
}; };
State _state = State::Idle;
AirMapSharedState& _shared; AirMapSharedState& _shared;
double _lastRadius;
QGeoCoordinate _lastRoiCenter;
State _state = State::Idle;
QmlObjectListModel _polygons;
QmlObjectListModel _circles;
}; };
...@@ -35,7 +35,7 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -35,7 +35,7 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
return; return;
} }
if (_state != State::Idle) { if (_state != State::Idle) {
qCWarning(AirMapManagerLog) << "AirMapRestrictionManager::updateROI: state not idle"; qCWarning(AirMapManagerLog) << "AirMapRulesetsManager::updateROI: state not idle";
return; return;
} }
qCDebug(AirMapManagerLog) << "Setting ROI for Rulesets"; qCDebug(AirMapManagerLog) << "Setting ROI for Rulesets";
......
## To be deleted when development is complete ## To be deleted when development is complete
* "Required" rules must be pre-selectd and cannot be unselected by the user
* AirMapRestrictionManager seems to be incomplete (if not redundant). Shouldn't we use the array of AirSpace items returned by AirMapAdvisoryManager instead? In addition to the AirSpace object, it gives you a color to use in order of importance. * AirMapRestrictionManager seems to be incomplete (if not redundant). Shouldn't we use the array of AirSpace items returned by AirMapAdvisoryManager instead? In addition to the AirSpace object, it gives you a color to use in order of importance.
* Traffic monitor timeout is now set to 2 minutes following instructions from Thomas Voß. * Traffic monitor timeout is now set to 2 minutes following instructions from Thomas Voß.
......
...@@ -29,18 +29,6 @@ AirspaceController::setROI(QGeoCoordinate center, double radius) ...@@ -29,18 +29,6 @@ AirspaceController::setROI(QGeoCoordinate center, double radius)
_manager->setROI(center, radius); _manager->setROI(center, radius);
} }
QmlObjectListModel*
AirspaceController::polygons()
{
return _manager->polygonRestrictions();
}
QmlObjectListModel*
AirspaceController::circles()
{
return _manager->circularRestrictions();
}
QString QString
AirspaceController::providerName() AirspaceController::providerName()
{ {
...@@ -64,3 +52,9 @@ AirspaceController::rulesets() ...@@ -64,3 +52,9 @@ AirspaceController::rulesets()
{ {
return _manager->rulesets(); return _manager->rulesets();
} }
AirspaceRestrictionProvider*
AirspaceController::airspaces()
{
return _manager->airspaces();
}
...@@ -17,6 +17,7 @@ class QmlObjectListModel; ...@@ -17,6 +17,7 @@ class QmlObjectListModel;
class AirspaceWeatherInfoProvider; class AirspaceWeatherInfoProvider;
class AirspaceAdvisoryProvider; class AirspaceAdvisoryProvider;
class AirspaceRulesetsProvider; class AirspaceRulesetsProvider;
class AirspaceRestrictionProvider;
class AirspaceController : public QObject class AirspaceController : public QObject
{ {
...@@ -25,22 +26,20 @@ public: ...@@ -25,22 +26,20 @@ public:
AirspaceController(QObject* parent = NULL); AirspaceController(QObject* parent = NULL);
~AirspaceController() = default; ~AirspaceController() = default;
Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT) ///< List of AirspacePolygonRestriction objects
Q_PROPERTY(QmlObjectListModel* circles READ circles CONSTANT) ///< List of AirspaceCircularRestriction objects
Q_PROPERTY(QString providerName READ providerName CONSTANT) Q_PROPERTY(QString providerName READ providerName CONSTANT)
Q_PROPERTY(AirspaceWeatherInfoProvider* weatherInfo READ weatherInfo CONSTANT) Q_PROPERTY(AirspaceWeatherInfoProvider* weatherInfo READ weatherInfo CONSTANT)
Q_PROPERTY(AirspaceAdvisoryProvider* advisories READ advisories CONSTANT) Q_PROPERTY(AirspaceAdvisoryProvider* advisories READ advisories CONSTANT)
Q_PROPERTY(AirspaceRulesetsProvider* rulesets READ rulesets CONSTANT) Q_PROPERTY(AirspaceRulesetsProvider* rulesets READ rulesets CONSTANT)
Q_PROPERTY(AirspaceRestrictionProvider* airspaces READ airspaces CONSTANT)
Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setairspaceVisible NOTIFY airspaceVisibleChanged) Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setairspaceVisible NOTIFY airspaceVisibleChanged)
Q_INVOKABLE void setROI (QGeoCoordinate center, double radius); Q_INVOKABLE void setROI (QGeoCoordinate center, double radius);
QmlObjectListModel* polygons ();
QmlObjectListModel* circles ();
QString providerName (); QString providerName ();
AirspaceWeatherInfoProvider* weatherInfo (); AirspaceWeatherInfoProvider* weatherInfo ();
AirspaceAdvisoryProvider* advisories (); AirspaceAdvisoryProvider* advisories ();
AirspaceRulesetsProvider* rulesets (); AirspaceRulesetsProvider* rulesets ();
AirspaceRestrictionProvider* airspaces ();
bool airspaceVisible () { return _airspaceVisible; } bool airspaceVisible () { return _airspaceVisible; }
void setairspaceVisible (bool set) { _airspaceVisible = set; emit airspaceVisibleChanged(); } void setairspaceVisible (bool set) { _airspaceVisible = set; emit airspaceVisibleChanged(); }
......
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
#include "AirspaceWeatherInfoProvider.h" #include "AirspaceWeatherInfoProvider.h"
#include "AirspaceAdvisoryProvider.h" #include "AirspaceAdvisoryProvider.h"
#include "AirspaceRestriction.h" #include "AirspaceRestriction.h"
#include "AirspaceRestrictionProvider.h"
#include "AirspaceRulesetsProvider.h" #include "AirspaceRulesetsProvider.h"
#include "AirspaceRestrictionProvider.h"
#include "AirspaceVehicleManager.h" #include "AirspaceVehicleManager.h"
#include "AirspaceController.h" #include "AirspaceController.h"
...@@ -28,12 +28,13 @@ AirspaceManager::AirspaceManager(QGCApplication* app, QGCToolbox* toolbox) ...@@ -28,12 +28,13 @@ AirspaceManager::AirspaceManager(QGCApplication* app, QGCToolbox* toolbox)
_roiUpdateTimer.setInterval(2000); _roiUpdateTimer.setInterval(2000);
_roiUpdateTimer.setSingleShot(true); _roiUpdateTimer.setSingleShot(true);
connect(&_roiUpdateTimer, &QTimer::timeout, this, &AirspaceManager::_updateToROI); connect(&_roiUpdateTimer, &QTimer::timeout, this, &AirspaceManager::_updateToROI);
qmlRegisterUncreatableType<AirspaceAuthorization> ("QGroundControl", 1, 0, "AirspaceAuthorization", "Reference only"); qmlRegisterUncreatableType<AirspaceAuthorization> ("QGroundControl", 1, 0, "AirspaceAuthorization", "Reference only");
qmlRegisterUncreatableType<AirspaceController> ("QGroundControl.Vehicle", 1, 0, "AirspaceController", "Reference only"); qmlRegisterUncreatableType<AirspaceController> ("QGroundControl.Vehicle", 1, 0, "AirspaceController", "Reference only");
qmlRegisterUncreatableType<AirspaceWeatherInfoProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceWeatherInfoProvider","Reference only"); qmlRegisterUncreatableType<AirspaceWeatherInfoProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceWeatherInfoProvider", "Reference only");
qmlRegisterUncreatableType<AirspaceAdvisoryProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceAdvisoryProvider", "Reference only"); qmlRegisterUncreatableType<AirspaceAdvisoryProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceAdvisoryProvider", "Reference only");
qmlRegisterUncreatableType<AirspaceRule> ("QGroundControl.Vehicle", 1, 0, "AirspaceRule", "Reference only"); qmlRegisterUncreatableType<AirspaceRule> ("QGroundControl.Vehicle", 1, 0, "AirspaceRule", "Reference only");
qmlRegisterUncreatableType<AirspaceRulesetsProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceRulesetsProvider", "Reference only"); qmlRegisterUncreatableType<AirspaceRulesetsProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceRulesetsProvider", "Reference only");
qmlRegisterUncreatableType<AirspaceRestrictionProvider> ("QGroundControl.Vehicle", 1, 0, "AirspaceRestrictionProvider", "Reference only");
} }
AirspaceManager::~AirspaceManager() AirspaceManager::~AirspaceManager()
...@@ -47,24 +48,19 @@ AirspaceManager::~AirspaceManager() ...@@ -47,24 +48,19 @@ AirspaceManager::~AirspaceManager()
if(_rulesetsProvider) { if(_rulesetsProvider) {
delete _rulesetsProvider; delete _rulesetsProvider;
} }
if (_restrictionsProvider) { if(_airspaces) {
delete _restrictionsProvider; delete _airspaces;
} }
_polygonRestrictions.clearAndDeleteContents();
_circleRestrictions.clearAndDeleteContents();
} }
void AirspaceManager::setToolbox(QGCToolbox* toolbox) void AirspaceManager::setToolbox(QGCToolbox* toolbox)
{ {
QGCTool::setToolbox(toolbox); QGCTool::setToolbox(toolbox);
// We should not call virtual methods in the constructor, so we instantiate the restriction provider here // We should not call virtual methods in the constructor, so we instantiate the restriction provider here
_restrictionsProvider = instantiateRestrictionProvider();
if (_restrictionsProvider) {
connect(_restrictionsProvider, &AirspaceRestrictionProvider::requestDone, this, &AirspaceManager::_restrictionsUpdated);
}
_rulesetsProvider = instantiateRulesetsProvider(); _rulesetsProvider = instantiateRulesetsProvider();
_weatherProvider = instatiateAirspaceWeatherInfoProvider(); _weatherProvider = instatiateAirspaceWeatherInfoProvider();
_advisories = instatiateAirspaceAdvisoryProvider(); _advisories = instatiateAirspaceAdvisoryProvider();
_airspaces = instantiateAirspaceRestrictionProvider();
} }
void AirspaceManager::setROI(const QGeoCoordinate& center, double radiusMeters) void AirspaceManager::setROI(const QGeoCoordinate& center, double radiusMeters)
...@@ -76,8 +72,8 @@ void AirspaceManager::setROI(const QGeoCoordinate& center, double radiusMeters) ...@@ -76,8 +72,8 @@ void AirspaceManager::setROI(const QGeoCoordinate& center, double radiusMeters)
void AirspaceManager::_updateToROI() void AirspaceManager::_updateToROI()
{ {
if (_restrictionsProvider) { if(_airspaces) {
_restrictionsProvider->setROI(_roiCenter, _roiRadius); _airspaces->setROI(_roiCenter, _roiRadius);
} }
if(_rulesetsProvider) { if(_rulesetsProvider) {
_rulesetsProvider->setROI(_roiCenter); _rulesetsProvider->setROI(_roiCenter);
...@@ -89,24 +85,3 @@ void AirspaceManager::_updateToROI() ...@@ -89,24 +85,3 @@ void AirspaceManager::_updateToROI()
_advisories->setROI(_roiCenter, _roiRadius); _advisories->setROI(_roiCenter, _roiRadius);
} }
} }
void AirspaceManager::_restrictionsUpdated(bool success)
{
_polygonRestrictions.clearAndDeleteContents();
_circleRestrictions.clearAndDeleteContents();
if (success) {
for (const auto& circle : _restrictionsProvider->circles()) {
_circleRestrictions.append(circle);
}
for (const auto& polygon : _restrictionsProvider->polygons()) {
_polygonRestrictions.append(polygon);
}
} else {
// TODO: show error?
}
}
void AirspaceManager::_rulessetsUpdated(bool)
{
}
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
* classes. * classes.
* - AirspaceVehicleManager * - AirspaceVehicleManager
* this provides the multi-vehicle support - each vehicle has an instance * this provides the multi-vehicle support - each vehicle has an instance
* - AirspaceRestrictionProvider * - AirspaceAdvisoriesProvider
* provides airspace restrictions. Currently only used by AirspaceManager, but * Provides airspace advisories and restrictions. Currently only used by AirspaceManager, but
* each vehicle could have its own restrictions. * each vehicle could have its own restrictions.
*/ */
...@@ -36,10 +36,10 @@ ...@@ -36,10 +36,10 @@
class Vehicle; class Vehicle;
class QGCApplication; class QGCApplication;
class AirspaceWeatherInfoProvider; class AirspaceWeatherInfoProvider;
class AirspaceRestrictionProvider;
class AirspaceRulesetsProvider; class AirspaceRulesetsProvider;
class AirspaceVehicleManager; class AirspaceVehicleManager;
class AirspaceAdvisoryProvider; class AirspaceAdvisoryProvider;
class AirspaceRestrictionProvider;
Q_DECLARE_LOGGING_CATEGORY(AirspaceManagementLog) Q_DECLARE_LOGGING_CATEGORY(AirspaceManagementLog)
...@@ -59,11 +59,6 @@ public: ...@@ -59,11 +59,6 @@ public:
*/ */
virtual AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) = 0; virtual AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) = 0;
/**
* Factory method to create an AirspaceRestrictionProvider object
*/
virtual AirspaceRestrictionProvider* instantiateRestrictionProvider () = 0;
/** /**
* Factory method to create an AirspaceRulesetsProvider object * Factory method to create an AirspaceRulesetsProvider object
*/ */
...@@ -79,6 +74,11 @@ public: ...@@ -79,6 +74,11 @@ public:
*/ */
virtual AirspaceAdvisoryProvider* instatiateAirspaceAdvisoryProvider () = 0; virtual AirspaceAdvisoryProvider* instatiateAirspaceAdvisoryProvider () = 0;
/**
* Factory method to create an AirspaceRestrictionProvider object
*/
virtual AirspaceRestrictionProvider* instantiateAirspaceRestrictionProvider () = 0;
/** /**
* Set the ROI for airspace information (restrictions shown in UI) * Set the ROI for airspace information (restrictions shown in UI)
* @param center Center coordinate for ROI * @param center Center coordinate for ROI
...@@ -86,11 +86,10 @@ public: ...@@ -86,11 +86,10 @@ public:
*/ */
void setROI (const QGeoCoordinate& center, double radiusMeters); void setROI (const QGeoCoordinate& center, double radiusMeters);
QmlObjectListModel* polygonRestrictions () { return &_polygonRestrictions; }
QmlObjectListModel* circularRestrictions () { return &_circleRestrictions; }
AirspaceWeatherInfoProvider* weatherInfo () { return _weatherProvider; } AirspaceWeatherInfoProvider* weatherInfo () { return _weatherProvider; }
AirspaceAdvisoryProvider* advisories () { return _advisories; } AirspaceAdvisoryProvider* advisories () { return _advisories; }
AirspaceRulesetsProvider* rulesets () { return _rulesetsProvider; } AirspaceRulesetsProvider* rulesets () { return _rulesetsProvider; }
AirspaceRestrictionProvider* airspaces () { return _airspaces; }
void setToolbox(QGCToolbox* toolbox) override; void setToolbox(QGCToolbox* toolbox) override;
...@@ -99,22 +98,13 @@ public: ...@@ -99,22 +98,13 @@ public:
*/ */
virtual QString name () const = 0; virtual QString name () const = 0;
protected slots:
virtual void _rulessetsUpdated (bool success);
private slots:
void _restrictionsUpdated (bool success);
private: private:
void _updateToROI (); void _updateToROI ();
AirspaceRestrictionProvider* _restrictionsProvider = nullptr; ///< Restrictions that are shown in the UI AirspaceRulesetsProvider* _rulesetsProvider = nullptr; ///< Rulesets that are shown in the UI
AirspaceRulesetsProvider* _rulesetsProvider = nullptr; ///< Restrictions that are shown in the UI
AirspaceWeatherInfoProvider* _weatherProvider = nullptr; ///< Weather info that is shown in the UI AirspaceWeatherInfoProvider* _weatherProvider = nullptr; ///< Weather info that is shown in the UI
AirspaceAdvisoryProvider* _advisories = nullptr; ///< Advisory info that is shown in the UI AirspaceAdvisoryProvider* _advisories = nullptr; ///< Advisory info that is shown in the UI
AirspaceRestrictionProvider* _airspaces = nullptr; ///< Airspace info that is shown in the UI
QmlObjectListModel _polygonRestrictions; ///< current polygon restrictions
QmlObjectListModel _circleRestrictions; ///< current circle restrictions
QTimer _roiUpdateTimer; QTimer _roiUpdateTimer;
QGeoCoordinate _roiCenter; QGeoCoordinate _roiCenter;
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
* Base class that queries for airspace restrictions * Base class that queries for airspace restrictions
*/ */
#include "QmlObjectListModel.h"
#include <QObject> #include <QObject>
#include <QList> #include <QList>
#include <QGeoCoordinate> #include <QGeoCoordinate>
...@@ -27,6 +29,9 @@ public: ...@@ -27,6 +29,9 @@ public:
AirspaceRestrictionProvider (QObject* parent = NULL); AirspaceRestrictionProvider (QObject* parent = NULL);
~AirspaceRestrictionProvider () = default; ~AirspaceRestrictionProvider () = default;
Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT)
Q_PROPERTY(QmlObjectListModel* circles READ circles CONSTANT)
/** /**
* Set region of interest that should be queried. When finished, the requestDone() signal will be emmited. * Set region of interest that should be queried. When finished, the requestDone() signal will be emmited.
* @param center Center coordinate for ROI * @param center Center coordinate for ROI
...@@ -34,13 +39,6 @@ public: ...@@ -34,13 +39,6 @@ public:
*/ */
virtual void setROI (const QGeoCoordinate& center, double radiusMeters) = 0; virtual void setROI (const QGeoCoordinate& center, double radiusMeters) = 0;
const QList<AirspacePolygonRestriction*>& polygons() const { return _polygonList; } virtual QmlObjectListModel* polygons () = 0; ///< List of AirspacePolygonRestriction objects
const QList<AirspaceCircularRestriction*>& circles () const { return _circleList; } virtual QmlObjectListModel* circles () = 0; ///< List of AirspaceCircularRestriction objects
signals:
void requestDone (bool success);
protected:
QList<AirspacePolygonRestriction*> _polygonList;
QList<AirspaceCircularRestriction*> _circleList;
}; };
...@@ -331,21 +331,21 @@ FlightMap { ...@@ -331,21 +331,21 @@ FlightMap {
// Airspace overlap support // Airspace overlap support
MapItemView { MapItemView {
model: _airspaceManagement && _activeVehicle.airspaceController.airspaceVisible ? _activeVehicle.airspaceController.circles : [] model: _airspaceManagement && _activeVehicle.airspaceController.airspaceVisible ? _activeVehicle.airspaceController.airspaces.circles : []
delegate: MapCircle { delegate: MapCircle {
center: object.center center: object.center
radius: object.radius radius: object.radius
color: Qt.rgba(0.94, 0.87, 0, 0.15)
border.color: Qt.rgba(1,1,1,0.85) border.color: Qt.rgba(1,1,1,0.85)
color: Qt.rgba(0.94,0.87,0,0.25)
} }
} }
MapItemView { MapItemView {
model: _airspaceManagement && _activeVehicle.airspaceController.airspaceVisible ? _activeVehicle.airspaceController.polygons : [] model: _airspaceManagement && _activeVehicle.airspaceController.airspaceVisible ? _activeVehicle.airspaceController.airspaces.polygons : []
delegate: MapPolygon { delegate: MapPolygon {
border.color: Qt.rgba(1,1,1,0.85)
color: Qt.rgba(0.94,0.87,0,0.25)
path: object.polygon path: object.polygon
color: Qt.rgba(0.94, 0.87, 0, 0.15)
border.color: Qt.rgba(1,1,1,0.85)
} }
} }
} }
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