Commit f91c3ae6 authored by Gus Grubba's avatar Gus Grubba

Rules and advisories

parent 7f35db33
...@@ -16,6 +16,8 @@ using namespace airmap; ...@@ -16,6 +16,8 @@ using namespace airmap;
AirMapRule::AirMapRule(QObject* parent) AirMapRule::AirMapRule(QObject* parent)
: AirspaceRule(parent) : AirspaceRule(parent)
, _isDefault(false) , _isDefault(false)
, _selected(false)
, _selectionType(AirspaceRule::Optional)
{ {
} }
...@@ -55,7 +57,8 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -55,7 +57,8 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
for (const auto& ruleset : rules) { for (const auto& ruleset : rules) {
AirMapRule* pRule = new AirMapRule(this); AirMapRule* pRule = new AirMapRule(this);
pRule->_id = QString::fromStdString(ruleset.id); pRule->_id = QString::fromStdString(ruleset.id);
pRule->_name = QString::fromStdString(ruleset.short_name); pRule->_name = QString::fromStdString(ruleset.name);
pRule->_shortName = QString::fromStdString(ruleset.short_name);
pRule->_description = QString::fromStdString(ruleset.description); pRule->_description = QString::fromStdString(ruleset.description);
pRule->_isDefault = ruleset.is_default; pRule->_isDefault = ruleset.is_default;
if(pRule->_isDefault) { if(pRule->_isDefault) {
...@@ -66,14 +69,14 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center) ...@@ -66,14 +69,14 @@ void AirMapRulesetsManager::setROI(const QGeoCoordinate& center)
} }
switch(ruleset.selection_type) { switch(ruleset.selection_type) {
case RuleSet::SelectionType::pickone: case RuleSet::SelectionType::pickone:
pRule->_selectionType = AirspaceRule::pickone; pRule->_selectionType = AirspaceRule::Pickone;
break; break;
case RuleSet::SelectionType::required: case RuleSet::SelectionType::required:
pRule->_selectionType = AirspaceRule::required; pRule->_selectionType = AirspaceRule::Required;
break; break;
default: default:
case RuleSet::SelectionType::optional: case RuleSet::SelectionType::optional:
pRule->_selectionType = AirspaceRule::optional; pRule->_selectionType = AirspaceRule::Optional;
break; break;
} }
_rules.append(pRule); _rules.append(pRule);
......
...@@ -33,12 +33,17 @@ public: ...@@ -33,12 +33,17 @@ public:
QString description () override { return _description; } QString description () override { return _description; }
bool isDefault () override { return _isDefault; } bool isDefault () override { return _isDefault; }
QString name () override { return _name; } QString name () override { return _name; }
QString shortName () override { return _shortName; }
SelectionType selectionType () override { return _selectionType; } SelectionType selectionType () override { return _selectionType; }
bool selected () override { return _selected; }
void setSelected (bool sel) override { _selected = sel; emit selectedChanged(); }
private: private:
QString _id; QString _id;
QString _description; QString _description;
bool _isDefault; bool _isDefault;
bool _selected;
QString _name; QString _name;
QString _shortName;
SelectionType _selectionType; SelectionType _selectionType;
}; };
......
...@@ -14,6 +14,14 @@ ...@@ -14,6 +14,14 @@
using namespace airmap; using namespace airmap;
//-----------------------------------------------------------------------------
AirMapAdvisory::AirMapAdvisory(QObject* parent)
: AirspaceAdvisory(parent)
, _radius(0.0)
{
}
//-----------------------------------------------------------------------------
AirMapAdvisories::AirMapAdvisories(AirMapSharedState& shared, QObject *parent) AirMapAdvisories::AirMapAdvisories(AirMapSharedState& shared, QObject *parent)
: AirspaceAdvisoryProvider(parent) : AirspaceAdvisoryProvider(parent)
, _valid(false) , _valid(false)
...@@ -21,6 +29,7 @@ AirMapAdvisories::AirMapAdvisories(AirMapSharedState& shared, QObject *parent) ...@@ -21,6 +29,7 @@ AirMapAdvisories::AirMapAdvisories(AirMapSharedState& shared, QObject *parent)
{ {
} }
//-----------------------------------------------------------------------------
void void
AirMapAdvisories::setROI(const QGeoCoordinate& center, double radiusMeters) AirMapAdvisories::setROI(const QGeoCoordinate& center, double radiusMeters)
{ {
...@@ -31,6 +40,17 @@ AirMapAdvisories::setROI(const QGeoCoordinate& center, double radiusMeters) ...@@ -31,6 +40,17 @@ AirMapAdvisories::setROI(const QGeoCoordinate& center, double radiusMeters)
} }
} }
//-----------------------------------------------------------------------------
static bool
adv_sort(QObject* a, QObject* b)
{
AirMapAdvisory* aa = qobject_cast<AirMapAdvisory*>(a);
AirMapAdvisory* bb = qobject_cast<AirMapAdvisory*>(b);
if(!aa || !bb) return false;
return aa->color() > bb->color();
}
//-----------------------------------------------------------------------------
void void
AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double radiusMeters) AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double radiusMeters)
{ {
...@@ -41,8 +61,8 @@ AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double ra ...@@ -41,8 +61,8 @@ AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double ra
emit advisoryChanged(); emit advisoryChanged();
return; return;
} }
_advisories.clear();
_valid = false; _valid = false;
_airspaces.clearAndDeleteContents();
Status::GetStatus::Parameters params; Status::GetStatus::Parameters params;
params.longitude = coordinate.longitude(); params.longitude = coordinate.longitude();
params.latitude = coordinate.latitude(); params.latitude = coordinate.latitude();
...@@ -50,16 +70,27 @@ AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double ra ...@@ -50,16 +70,27 @@ AirMapAdvisories::_requestAdvisories(const QGeoCoordinate& coordinate, double ra
params.buffer = radiusMeters; params.buffer = radiusMeters;
_shared.client()->status().get_status_by_point(params, [this, coordinate](const Status::GetStatus::Result& result) { _shared.client()->status().get_status_by_point(params, [this, coordinate](const Status::GetStatus::Result& result) {
if (result) { if (result) {
qCDebug(AirMapManagerLog) << _advisories.size() << "Advisories Received"; qCDebug(AirMapManagerLog) << "Successful advisory search. Items:" << result.value().advisories.size();
_advisories = result.value().advisories; _airspaceColor = (AirspaceAdvisoryProvider::AdvisoryColor)(int)result.value().advisory_color;
_advisory_color = result.value().advisory_color; const std::vector<Status::Advisory> advisories = result.value().advisories;
if(_advisories.size()) { for (const auto& advisory : advisories) {
_valid = true; AirMapAdvisory* pAdvisory = new AirMapAdvisory(this);
qCDebug(AirMapManagerLog) << "Advisory Info: " << _advisories.size() << _advisories[0].airspace.name().data(); pAdvisory->_id = QString::fromStdString(advisory.airspace.id());
pAdvisory->_name = QString::fromStdString(advisory.airspace.name());
pAdvisory->_type = (AirspaceAdvisory::AdvisoryType)(int)advisory.airspace.type();
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);
qCDebug(AirMapManagerLog) << "Adding advisory" << pAdvisory->name();
} }
//-- Sort in order of color (priority)
std::sort(_airspaces.objectList()->begin(), _airspaces.objectList()->end(), adv_sort);
_valid = true;
} else { } else {
qCDebug(AirMapManagerLog) << "Advisories Request Failed"; qCDebug(AirMapManagerLog) << "Advisories Request Failed";
_valid = false;
} }
emit advisoryChanged(); emit advisoryChanged();
}); });
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#pragma once #pragma once
#include "QmlObjectListModel.h"
#include "LifetimeChecker.h" #include "LifetimeChecker.h"
#include "AirspaceAdvisoryProvider.h" #include "AirspaceAdvisoryProvider.h"
...@@ -23,26 +25,46 @@ ...@@ -23,26 +25,46 @@
* Advisory information provided by AirMap. * Advisory information provided by AirMap.
*/ */
//-----------------------------------------------------------------------------
class AirMapAdvisory : public AirspaceAdvisory
{
Q_OBJECT
friend class AirMapAdvisories;
public:
AirMapAdvisory (QObject* parent = NULL);
QString id () override { return _id; }
QString name () override { return _name; }
AdvisoryType type () override { return _type; }
QGeoCoordinate coordinates () override { return _coordinates; }
qreal radius () override { return _radius; }
AirspaceAdvisoryProvider::AdvisoryColor color () override { return _color; }
private:
QString _id;
QString _name;
AdvisoryType _type;
QGeoCoordinate _coordinates;
qreal _radius;
AirspaceAdvisoryProvider::AdvisoryColor _color;
};
//-----------------------------------------------------------------------------
class AirMapAdvisories : public AirspaceAdvisoryProvider, public LifetimeChecker class AirMapAdvisories : public AirspaceAdvisoryProvider, public LifetimeChecker
{ {
Q_OBJECT Q_OBJECT
public: public:
AirMapAdvisories (AirMapSharedState &shared, QObject *parent = nullptr); AirMapAdvisories (AirMapSharedState &shared, QObject *parent = nullptr);
bool valid () override { return _valid; } bool valid () override { return _valid; }
AdvisoryColor airspaceColor () override { return _airspaceColor; }
QmlObjectListModel* airspaces () override { return &_airspaces; }
void setROI (const QGeoCoordinate& center, double radiusMeters) override; 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:
void _requestAdvisories (const QGeoCoordinate& coordinate, double radiusMeters); void _requestAdvisories (const QGeoCoordinate& coordinate, double radiusMeters);
private: private:
bool _valid; bool _valid;
AirMapSharedState& _shared; AirMapSharedState& _shared;
QGeoCoordinate _lastRoiCenter; QGeoCoordinate _lastRoiCenter;
airmap::Status::Color _advisory_color; QmlObjectListModel _airspaces;
std::vector<airmap::Status::Advisory> _advisories; AdvisoryColor _airspaceColor;
}; };
This diff is collapsed.
...@@ -3,3 +3,4 @@ Module QGroundControl.Airmap ...@@ -3,3 +3,4 @@ Module QGroundControl.Airmap
AirspaceControl 1.0 AirspaceControl.qml AirspaceControl 1.0 AirspaceControl.qml
AirspaceRegulation 1.0 AirspaceRegulation.qml AirspaceRegulation 1.0 AirspaceRegulation.qml
AirspaceWeather 1.0 AirspaceWeather.qml AirspaceWeather 1.0 AirspaceWeather.qml
RuleSelector 1.0 RuleSelector.qml
\ No newline at end of file
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
import QtQml 2.2
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Airmap 1.0
import QGroundControl.SettingsManager 1.0
Rectangle {
height: ScreenTools.defaultFontPixelHeight * 1.25
color: rule && rule.selected ? qgcPal.windowShadeDark : qgcPal.window
property var rule: null
QGCPalette {
id: qgcPal
colorGroupEnabled: enabled
}
Row {
id: ruleRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.right: parent.right
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
Rectangle {
width: ScreenTools.defaultFontPixelWidth * 0.75
height: ScreenTools.defaultFontPixelHeight
color: rule.selected ? qgcPal.colorGreen : qgcPal.window
anchors.verticalCenter: parent.verticalCenter
}
QGCLabel {
text: rule.name === "" ? rule.shortName : rule.name
font.pointSize: ScreenTools.smallFontPointSize
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
anchors.fill: parent
onClicked: {
rule.selected = !rule.selected
}
}
}
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<file alias="QGroundControl/Airmap/AirspaceControl.qml">AirspaceControl.qml</file> <file alias="QGroundControl/Airmap/AirspaceControl.qml">AirspaceControl.qml</file>
<file alias="QGroundControl/Airmap/AirspaceRegulation.qml">AirspaceRegulation.qml</file> <file alias="QGroundControl/Airmap/AirspaceRegulation.qml">AirspaceRegulation.qml</file>
<file alias="QGroundControl/Airmap/AirspaceWeather.qml">AirspaceWeather.qml</file> <file alias="QGroundControl/Airmap/AirspaceWeather.qml">AirspaceWeather.qml</file>
<file alias="QGroundControl/Airmap/RuleSelector.qml">RuleSelector.qml</file>
<file alias="AirmapSettings.qml">AirmapSettings.qml</file> <file alias="AirmapSettings.qml">AirmapSettings.qml</file>
</qresource> </qresource>
<qresource prefix="/json"> <qresource prefix="/json">
......
...@@ -9,7 +9,38 @@ ...@@ -9,7 +9,38 @@
#include "AirspaceAdvisoryProvider.h" #include "AirspaceAdvisoryProvider.h"
AirspaceAdvisory::AirspaceAdvisory(QObject* parent)
: QObject(parent)
{
}
AirspaceAdvisoryProvider::AirspaceAdvisoryProvider(QObject *parent) AirspaceAdvisoryProvider::AirspaceAdvisoryProvider(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
} }
//-- TODO: This enum is a bitmask, which implies an airspace can be any
// combination of these types. However, I have not seen any that this
// was the case.
QString
AirspaceAdvisory::typeStr()
{
switch(type()) {
case Airport: return QString(tr("Airport")); break;
case Controlled_airspace: return QString(tr("Controlled Airspace")); break;
case Special_use_airspace: return QString(tr("Special Use Airspace")); break;
case Tfr: return QString(tr("TFR")); break;
case Wildfire: return QString(tr("Wild Fire")); break;
case Park: return QString(tr("Park")); break;
case Power_plant: return QString(tr("Power Plant")); break;
case Heliport: return QString(tr("Heliport")); break;
case Prison: return QString(tr("Prison")); break;
case School: return QString(tr("School")); break;
case Hospital: return QString(tr("Hospital")); break;
case Fire: return QString(tr("Fire")); break;
case Emergency: return QString(tr("Emergency")); break;
case Invalid: return QString(tr("Invalid")); break;
default: return QString(tr("Unknown")); break;
}
}
...@@ -14,19 +14,36 @@ ...@@ -14,19 +14,36 @@
* Weather information provided by the Airspace Managemement * Weather information provided by the Airspace Managemement
*/ */
#include "QmlObjectListModel.h"
#include <QObject> #include <QObject>
#include <QGeoCoordinate> #include <QGeoCoordinate>
//-----------------------------------------------------------------------------
class AirspaceAdvisoryProvider : public QObject class AirspaceAdvisoryProvider : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
enum AdvisoryColor {
Green,
Yellow,
Orange,
Red
};
Q_ENUM(AdvisoryColor)
AirspaceAdvisoryProvider (QObject *parent = nullptr); AirspaceAdvisoryProvider (QObject *parent = nullptr);
virtual ~AirspaceAdvisoryProvider () {} virtual ~AirspaceAdvisoryProvider () {}
Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged) Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged)
Q_PROPERTY(AdvisoryColor airspaceColor READ airspaceColor NOTIFY advisoryChanged)
Q_PROPERTY(QmlObjectListModel* airspaces READ airspaces NOTIFY advisoryChanged)
virtual bool valid () = 0; ///< Current data is valid virtual bool valid () = 0; ///< Current data is valid
virtual AdvisoryColor airspaceColor () = 0; ///< Aispace overall color
virtual QmlObjectListModel* airspaces () = 0; ///< List of AirspaceAdvisory
/** /**
* Set region of interest that should be queried. When finished, the advisoryChanged() signal will be emmited. * Set region of interest that should be queried. When finished, the advisoryChanged() signal will be emmited.
...@@ -37,3 +54,50 @@ public: ...@@ -37,3 +54,50 @@ public:
signals: signals:
void advisoryChanged (); void advisoryChanged ();
}; };
//-----------------------------------------------------------------------------
class AirspaceAdvisory : public QObject
{
Q_OBJECT
public:
enum AdvisoryType {
Invalid = 0,
Airport = 1 << 0,
Controlled_airspace = 1 << 1,
Special_use_airspace = 1 << 2,
Tfr = 1 << 3,
Wildfire = 1 << 4,
Park = 1 << 5,
Power_plant = 1 << 6,
Heliport = 1 << 7,
Prison = 1 << 8,
School = 1 << 9,
Hospital = 1 << 10,
Fire = 1 << 11,
Emergency = 1 << 12,
};
Q_ENUM(AdvisoryType)
AirspaceAdvisory (QObject* parent = NULL);
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(AdvisoryType type READ type CONSTANT)
Q_PROPERTY(QString typeStr READ typeStr CONSTANT)
Q_PROPERTY(QGeoCoordinate coordinates READ coordinates CONSTANT)
Q_PROPERTY(qreal radius READ radius CONSTANT)
Q_PROPERTY(AirspaceAdvisoryProvider::AdvisoryColor color READ color CONSTANT)
virtual QString id () = 0;
virtual QString name () = 0;
virtual AdvisoryType type () = 0;
virtual QString typeStr ();
virtual QGeoCoordinate coordinates () = 0;
virtual qreal radius () = 0;
virtual AirspaceAdvisoryProvider::AdvisoryColor color () = 0;
};
...@@ -27,9 +27,9 @@ class AirspaceRule : public QObject ...@@ -27,9 +27,9 @@ class AirspaceRule : public QObject
public: public:
enum SelectionType { enum SelectionType {
pickone, ///< One rule from the overall set needs to be picked. Pickone, ///< One rule from the overall set needs to be picked.
required, ///< Satisfying the RuleSet is required. Required, ///< Satisfying the RuleSet is required.
optional ///< Satisfying the RuleSet is not required. Optional ///< Satisfying the RuleSet is not required.
}; };
Q_ENUM(SelectionType) Q_ENUM(SelectionType)
...@@ -38,15 +38,24 @@ public: ...@@ -38,15 +38,24 @@ public:
Q_PROPERTY(QString id READ id CONSTANT) Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT) Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QString shortName READ shortName CONSTANT)
Q_PROPERTY(QString description READ description CONSTANT) Q_PROPERTY(QString description READ description CONSTANT)
Q_PROPERTY(bool isDefault READ isDefault CONSTANT) Q_PROPERTY(bool isDefault READ isDefault CONSTANT)
Q_PROPERTY(SelectionType selectionType READ selectionType CONSTANT) Q_PROPERTY(SelectionType selectionType READ selectionType CONSTANT)
Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectedChanged)
virtual QString id () = 0; virtual QString id () = 0;
virtual QString description () = 0; virtual QString description () = 0;
virtual bool isDefault () = 0; virtual bool isDefault () = 0;
virtual QString name () = 0; virtual QString name () = 0;
virtual QString shortName () = 0;
virtual SelectionType selectionType () = 0; virtual SelectionType selectionType () = 0;
virtual bool selected () = 0;
virtual void setSelected (bool sel) = 0;
signals:
void selectedChanged ();
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
......
...@@ -31,21 +31,22 @@ public: ...@@ -31,21 +31,22 @@ public:
// Property accessors // Property accessors
int count(void) const; int count (void) const;
bool dirty (void) const { return _dirty; }
bool dirty(void) const { return _dirty; } void setDirty (bool dirty);
void setDirty(bool dirty); void append (QObject* object);
QObjectList swapObjectList (const QObjectList& newlist);
void append(QObject* object); void clear (void);
QObjectList swapObjectList(const QObjectList& newlist); QObject* removeAt (int i);
void clear(void); QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); }
QObject* removeAt(int i); void insert (int i, QObject* object);
QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); } QObject* operator[] (int i);
void insert(int i, QObject* object); const QObject* operator[] (int i) const;
QObject* operator[](int i); bool contains (QObject* object) { return _objectList.indexOf(object) != -1; }
const QObject* operator[](int i) const; int indexOf (QObject* object) { return _objectList.indexOf(object); }
bool contains(QObject* object) { return _objectList.indexOf(object) != -1; }
int indexOf(QObject* object) { return _objectList.indexOf(object); } QList<QObject*>* objectList () { return &_objectList; }
template<class T> T value(int index) { return qobject_cast<T>(_objectList[index]); } template<class T> T value(int index) { return qobject_cast<T>(_objectList[index]); }
/// Calls deleteLater on all items and this itself. /// Calls deleteLater on all items and this itself.
...@@ -55,11 +56,11 @@ public: ...@@ -55,11 +56,11 @@ public:
void clearAndDeleteContents(void); void clearAndDeleteContents(void);
signals: signals:
void countChanged(int count); void countChanged (int count);
void dirtyChanged(bool dirtyChanged); void dirtyChanged (bool dirtyChanged);
private slots: private slots:
void _childDirtyChanged(bool dirty); void _childDirtyChanged (bool dirty);
private: private:
// Overrides from QAbstractListModel // Overrides from QAbstractListModel
......
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