133 lines
5.4 KiB
C++
133 lines
5.4 KiB
C++
/****************************************************************************
|
|
*
|
|
* (c) 2009-2020 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#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;
|
|
void managerVehicleChanged (Vehicle* managerVehicle) 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<QGCFencePolygon>& polygons, const QList<QGCFenceCircle>& circles);
|
|
void _setReturnPointFromManager (QGeoCoordinate breachReturnPoint);
|
|
void _managerLoadComplete (void);
|
|
void _updateContainsItems (void);
|
|
void _managerSendComplete (bool error);
|
|
void _managerRemoveAllComplete (bool error);
|
|
void _parametersReady (void);
|
|
|
|
private:
|
|
void _init(void);
|
|
|
|
GeoFenceManager* _geoFenceManager;
|
|
bool _dirty;
|
|
QmlObjectListModel _polygons;
|
|
QmlObjectListModel _circles;
|
|
QGeoCoordinate _breachReturnPoint;
|
|
Fact _breachReturnAltitudeFact;
|
|
double _breachReturnDefaultAltitude;
|
|
bool _itemsRequested;
|
|
Fact* _px4ParamCircularFenceFact;
|
|
|
|
static QMap<QString, FactMetaData*> _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
|