/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #ifndef GeoFenceController_H #define GeoFenceController_H #include "PlanElementController.h" #include "GeoFenceManager.h" #include "QGCFencePolygon.h" #include "QGCFenceCircle.h" #include "Vehicle.h" #include "MultiVehicleManager.h" #include "QGCLoggingCategory.h" Q_DECLARE_LOGGING_CATEGORY(GeoFenceControllerLog) class GeoFenceManager; class GeoFenceController : public PlanElementController { Q_OBJECT public: GeoFenceController(PlanMasterController* masterController, QObject* parent = nullptr); ~GeoFenceController(); Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT) Q_PROPERTY(QmlObjectListModel* circles READ circles CONSTANT) Q_PROPERTY(QGeoCoordinate breachReturnPoint READ breachReturnPoint WRITE setBreachReturnPoint NOTIFY breachReturnPointChanged) Q_PROPERTY(Fact* breachReturnAltitude READ breachReturnAltitude CONSTANT) // Hack to expose PX4 circular fence controlled by GF_MAX_HOR_DIST Q_PROPERTY(double paramCircularFence READ paramCircularFence NOTIFY paramCircularFenceChanged) /// Add a new inclusion polygon to the fence /// @param topLeft: Top left coordinate or map viewport /// @param bottomRight: Bottom right left coordinate or map viewport Q_INVOKABLE void addInclusionPolygon(QGeoCoordinate topLeft, QGeoCoordinate bottomRight); /// Add a new inclusion circle to the fence /// @param topLeft: Top left coordinate or map viewport /// @param bottomRight: Bottom right left coordinate or map viewport Q_INVOKABLE void addInclusionCircle(QGeoCoordinate topLeft, QGeoCoordinate bottomRight); /// Deletes the specified polygon from the polygon list /// @param index: Index of poygon to delete Q_INVOKABLE void deletePolygon(int index); /// Deletes the specified circle from the circle list /// @param index: Index of circle to delete Q_INVOKABLE void deleteCircle(int index); /// Clears the interactive bit from all fence items Q_INVOKABLE void clearAllInteractive(void); double paramCircularFence (void); Fact* breachReturnAltitude(void) { return &_breachReturnAltitudeFact; } // Overrides from PlanElementController bool supported (void) const final; void start (bool flyView) final; void save (QJsonObject& json) final; bool load (const QJsonObject& json, QString& errorString) final; void loadFromVehicle (void) final; void sendToVehicle (void) final; void removeAll (void) final; void removeAllFromVehicle (void) final; bool syncInProgress (void) const final; bool dirty (void) const final; void setDirty (bool dirty) final; bool containsItems (void) const final; bool showPlanFromManagerVehicle (void) final; QmlObjectListModel* polygons (void) { return &_polygons; } QmlObjectListModel* circles (void) { return &_circles; } QGeoCoordinate breachReturnPoint (void) const { return _breachReturnPoint; } void setBreachReturnPoint (const QGeoCoordinate& breachReturnPoint); bool isEmpty (void) const; signals: void breachReturnPointChanged (QGeoCoordinate breachReturnPoint); void editorQmlChanged (QString editorQml); void loadComplete (void); void paramCircularFenceChanged (void); private slots: void _polygonDirtyChanged (bool dirty); void _setDirty (void); void _setFenceFromManager (const QList& polygons, const QList& circles); void _setReturnPointFromManager (QGeoCoordinate breachReturnPoint); void _managerLoadComplete (void); void _updateContainsItems (void); void _managerSendComplete (bool error); void _managerRemoveAllComplete (bool error); void _parametersReady (void); void _managerVehicleChanged (Vehicle* managerVehicle); private: void _init(void); Vehicle* _managerVehicle = nullptr; GeoFenceManager* _geoFenceManager = nullptr; bool _dirty = false; QmlObjectListModel _polygons; QmlObjectListModel _circles; QGeoCoordinate _breachReturnPoint; Fact _breachReturnAltitudeFact; double _breachReturnDefaultAltitude = qQNaN(); bool _itemsRequested = false; Fact* _px4ParamCircularFenceFact = nullptr; static QMap _metaDataMap; static const char* _px4ParamCircularFence; static const int _jsonCurrentVersion = 2; static const char* _jsonFileTypeValue; static const char* _jsonBreachReturnKey; static const char* _jsonPolygonsKey; static const char* _jsonCirclesKey; static const char* _breachReturnAltitudeFactName; }; #endif