diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index cafcedf0a43af094fd2a4d54e10d4d60098ed2d4..38372d2dfeb50bb483ba064e43efed31ef7b0f30 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -413,7 +413,8 @@ HEADERS += \ src/MissionManager/WimaServicePolygon.h \ src/MissionManager/WimaVehicleCorridor.h \ src/MissionManager/WimaVehicleMeasurementPolygon.h \ - src/MissionManager/WimaGlobalMeasurementPolygon.h + src/MissionManager/WimaGlobalMeasurementPolygon.h \ + src/MissionManager/WimaPolygonContainer.h SOURCES += \ src/api/QGCCorePlugin.cc \ @@ -427,7 +428,8 @@ SOURCES += \ src/MissionManager/WimaServicePolygon.cc \ src/MissionManager/WimaVehicleCorridor.cc \ src/MissionManager/WimaVehicleMeasurementPolygon.cc \ - src/MissionManager/WimaGlobalMeasurementPolygon.cc + src/MissionManager/WimaGlobalMeasurementPolygon.cc \ + src/MissionManager/WimaPolygonContainer.cc # # Unit Test specific configuration goes here (requires full debug build with all plugins) diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 6fa6e19efba2e9ec37dbe9ade2db2c656d7a3709..efa4334af940a885e6f889de41f2d47c8acec014 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -45,6 +45,7 @@ public: typedef struct _MissionFlightStatus_t { double maxTelemetryDistance; + void dirtyChanged(); double totalDistance; double totalTime; double hoverDistance; diff --git a/src/MissionManager/WimaController.cc b/src/MissionManager/WimaController.cc index b356e1cade418b5cdffc1abb19f1da6852a63e26..e3e528831d4e78d2f4df868e43e91fd3281ac442 100644 --- a/src/MissionManager/WimaController.cc +++ b/src/MissionManager/WimaController.cc @@ -1,31 +1,32 @@ #include "WimaController.h" #include "MissionController.h" -WimaController::WimaController(QObject *parent) : QObject(parent) -{ - this->_flyArea = new WimaFlyArea(parent); -} +WimaController::WimaController(QObject *parent) : + QObject(parent) + ,_planView(true) -void WimaController::start() { - _flyArea->_init(); + } -void WimaController::recalcMission() -{ -} void WimaController::setMasterController(PlanMasterController *masterC) { _masterController = masterC; - emit masterControllerChanged(_masterController); + emit masterControllerChanged(); } void WimaController::setMissionController(MissionController *missionC) { _missionController = missionC; - emit missionControllerChanged(_missionController); + emit missionControllerChanged(); +} + +void WimaController::addGlobalMeasurementArea() +{ + WimaGlobalMeasurementPolygon* poly = new WimaGlobalMeasurementPolygon(this); + } diff --git a/src/MissionManager/WimaController.h b/src/MissionManager/WimaController.h index 21e87040decc855ae3d1f320951c2cbc5bd919d4..f0db39f6534f8526aa1c43b9b2b687e65d5a4655 100644 --- a/src/MissionManager/WimaController.h +++ b/src/MissionManager/WimaController.h @@ -3,48 +3,68 @@ #include #include "QGCMapPolygon.h" -#include "QmlObjectListModel.h" -#include "WimaFlyArea.h" +#include "WimaPolygon.h" +#include "WimaGlobalMeasurementPolygon.h" +#include "WimaServicePolygon.h" +#include "WimaPolygonContainer.h" + #include "PlanMasterController.h" #include "MissionController.h" + class WimaController : public QObject { Q_OBJECT public: - explicit WimaController(QObject *parent = nullptr); + WimaController(QObject *parent = nullptr); - Q_PROPERTY(WimaFlyArea* flyArea READ flyArea CONSTANT) - Q_PROPERTY(PlanMasterController* masterController READ masterController WRITE setMasterController NOTIFY masterControllerChanged) - Q_PROPERTY(MissionController* missionController READ missionController WRITE setMissionController NOTIFY missionControllerChanged) + Q_PROPERTY(PlanMasterController* masterController READ masterController WRITE setMasterController NOTIFY masterControllerChanged) + Q_PROPERTY(MissionController* missionController READ missionController WRITE setMissionController NOTIFY missionControllerChanged) + Q_PROPERTY(QList visualItems READ visualItems NOTIFY visualItemsChanged) + // Property accessors + PlanMasterController* masterController (void) const { return _masterController;} + MissionController* missionController (void) const { return _missionController;} + QList& visualItems (void) const { return } - //Property Accessors - WimaFlyArea *flyArea (void) { return _flyArea; } - PlanMasterController* masterController (void) { return _masterController; } - MissionController* missionController (void) { return _missionController; } - Q_INVOKABLE void start(void); - Q_INVOKABLE void recalcMission(); + // Property setters + void setMasterController (PlanMasterController* masterController); + void setMissionController (MissionController* missionController); - void setMasterController(PlanMasterController* masterC); - void setMissionController(MissionController* missionC); + Q_INVOKABLE void addGlobalMeasurementArea(); + Q_INVOKABLE void removeGlobalMeasurementArea(int index); + Q_INVOKABLE void addServiceArea(); + Q_INVOKABLE void removeServiceArea(int index); -signals: - void masterControllerChanged(PlanMasterController* masterController); - void missionControllerChanged(MissionController* missionController); + Q_INVOKABLE void recalcVehicleCorridor(); + Q_INVOKABLE void recalcVehicleMeasurementArea(); + + Q_INVOKABLE void startMission(); + Q_INVOKABLE void abortMission(); + Q_INVOKABLE void pauseMission(); + Q_INVOKABLE void resumeMission(); + + Q_INVOKABLE void saveMission(); + Q_INVOKABLE void loadMission(); -public slots: + +signals: + void masterControllerChanged (void); + void missionControllerChanged (void); + void visualItemsChanged (void); + private: - //QmlObjectListModel* _visualItems; - WimaFlyArea * _flyArea; + bool _planView; + WimaPolygonContainer _visualItemsContainer; PlanMasterController* _masterController; MissionController* _missionController; + }; #endif // WIMACONTROLLER_H diff --git a/src/MissionManager/WimaGlobalMeasurementPolygon.cc b/src/MissionManager/WimaGlobalMeasurementPolygon.cc index b1aa4b6989c81b1096409c53c5604e1e3133b793..c08ec4f379c390a3c0c12fc2e19ed827031fc4de 100644 --- a/src/MissionManager/WimaGlobalMeasurementPolygon.cc +++ b/src/MissionManager/WimaGlobalMeasurementPolygon.cc @@ -8,28 +8,34 @@ WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QObject *parent): } +WimaGlobalMeasurementPolygon::WimaGlobalMeasurementPolygon(QGCMapPolygon *other, QObject *parent): + WimaPolygon (other, parent) +{ + +} + void WimaGlobalMeasurementPolygon::addVehicle(Vehicle *vehicle) { if(vehicle != nullptr){ - _vehicleList->append(vehicle); + _vehicleList.append(vehicle); emit vehicleListChanged(_vehicleList); } } void WimaGlobalMeasurementPolygon::removeVehicle(int vehicleIndex) { - if(vehicleIndex >= 0 && vehicleIndex < _vehicleList->count()){ - _vehicleList->removeAt(vehicleIndex); + if(vehicleIndex >= 0 && vehicleIndex < _vehicleList.count()){ + _vehicleList.removeAt(vehicleIndex); emit vehicleListChanged(_vehicleList); } } -void WimaGlobalMeasurementPolygon::recalculateVehiclePolygons() +void WimaGlobalMeasurementPolygon::recalculatesubPolygons() { int vehicleCount = _vehicleList->count(); WimaVehicleMeasurementPolygon* newPolygon = new WimaVehicleMeasurementPolygon(this); - _vehiclePolygons = this->splitPolygonArea(vehicleCount); + _subPolygons = this->splitPolygonArea(vehicleCount); } void WimaGlobalMeasurementPolygon::removeAllVehicles() diff --git a/src/MissionManager/WimaGlobalMeasurementPolygon.h b/src/MissionManager/WimaGlobalMeasurementPolygon.h index fa3bc628fc23b4fee49f4a94092ce63f9dd04f03..5df1622fe6d09f6bca1ed06546a83e583401c228 100644 --- a/src/MissionManager/WimaGlobalMeasurementPolygon.h +++ b/src/MissionManager/WimaGlobalMeasurementPolygon.h @@ -4,6 +4,7 @@ #include #include "WimaPolygon.h" #include "QGCMapPolyline.h" +#include "QGCMapPolygon.h" #include "WimaVehicleMeasurementPolygon.h" class WimaGlobalMeasurementPolygon : public WimaPolygon @@ -11,17 +12,18 @@ class WimaGlobalMeasurementPolygon : public WimaPolygon Q_OBJECT public: WimaGlobalMeasurementPolygon(QObject* parent); + WimaGlobalMeasurementPolygon(QGCMapPolygon* other, QObject* parent); Q_PROPERTY(double bottomLayerAltitude READ bottomLayerAltitude WRITE setBottomLayerAltitude NOTIFY bottomLayerAltitudeChanged) Q_PROPERTY(int numberOfLayers READ numberOfLayers WRITE setNumberOfLayers NOTIFY numberOfLayersChanged) Q_PROPERTY(double layerDistance READ layerDistance WRITE setLayerDistance NOTIFY layerDistanceChanged) - Q_PROPERTY(QmlObjectListModel* vehicleList READ vehicleList NOTIFY vehicleListChanged) + Q_PROPERTY(QList vehicleList READ vehicleList NOTIFY vehicleListChanged) Q_PROPERTY(QGCMapPolyline* entryPolyline READ entryPolyline NOTIFY entryPolylineChanged) - Q_PROPERTY(QmlObjectListModel* vehiclePolygons READ vehiclePolygons NOTIFY vehiclePolygonsChanged) + Q_PROPERTY( QList subPolygons READ subPolygons NOTIFY subPolygonsChanged) Q_INVOKABLE void addVehicle(Vehicle *vehicle); Q_INVOKABLE void removeVehicle(int vehicleIndex); - Q_INVOKABLE void recalculateVehiclePolygons(); + Q_INVOKABLE void recalculatesubPolygons(); Q_INVOKABLE void removeAllVehicles(); @@ -30,35 +32,33 @@ public: QString editorQML (void) const { return "WimaGlobalMeasurementPolygonEditor.qml";} // Property accessors - double bottomLayerAltitude (void) const { return _bottomLayerAltitude;} - int numberOfLayers (void) const { return _numberOfLayers;} - double layerDistance (void) const { return _layerDistance;} - QmlObjectListModel* vehicleList (void) const { return _vehicleList;} - QGCMapPolyline* entryPolyline (void) const { return _entryPolyline;} - QmlObjectListModel* vehiclePolygons (void) const { return _vehiclePolygons;} + double bottomLayerAltitude (void) const { return _bottomLayerAltitude;} + int numberOfLayers (void) const { return _numberOfLayers;} + double layerDistance (void) const { return _layerDistance;} + QList vehicleList (void) const { return _vehicleList;} + QGCMapPolyline* entryPolyline (void) const { return _entryPolyline;} // Property setters - void setBottomLayerAltitude(double altitude); - void setNumberOfLayers(int numberOfLayers); - void setLayerDistance(double distance); + void setBottomLayerAltitude (double altitude); + void setNumberOfLayers (int numberOfLayers); + void setLayerDistance (double distance); signals: - void bottomLayerAltitudeChanged(double altitude); - void numberOfLayersChanged(int numberOfLayers); - void layerDistanceChanged(double distance); - void vehicleListChanged(QmlObjectListModel* vehicleList); - void entryPolylineChanged(QGCMapPolyline* polyline); - void vehiclePolygonsChanged(QmlObjectListModel* vehiclePolygons); + void bottomLayerAltitudeChanged (double altitude); + void numberOfLayersChanged (int numberOfLayers); + void layerDistanceChanged (double distance); + void vehicleListChanged (QList vehicleList); + void entryPolylineChanged (QGCMapPolyline* polyline); + void subPolygonsChanged (QList subPolygons); private: double _bottomLayerAltitude; - int _numberOfLayers; + int _numberOfLayers; double _layerDistance; - QmlObjectListModel* _vehicleList; + QList _vehicleList; QGCMapPolyline* _entryPolyline; - QmlObjectListModel* _vehiclePolygons; }; diff --git a/src/MissionManager/WimaPolygon.cc b/src/MissionManager/WimaPolygon.cc index d8b71257de54d5ad5cd2df621f4a1f9a160c9d8d..dc6b77f7fbd5d65bd7972b468e9ff0eef31c3635 100644 --- a/src/MissionManager/WimaPolygon.cc +++ b/src/MissionManager/WimaPolygon.cc @@ -1,13 +1,20 @@ #include "WimaPolygon.h" WimaPolygon::WimaPolygon(QObject *parent) : - QGCMapPolygon (parent) + QObject (parent) ,_maxAltitude (30) ,_vehicle (nullptr) - ,_polygonFractions (new QmlObjectListModel(this)) + ,_polygon (new QGCMapPolygon(this)) { } +WimaPolygon::WimaPolygon(QGCMapPolygon *other, QObject *parent): + WimaPolygon(parent) +{ + *_polygon = *other; +} + + void WimaPolygon::setMaxAltitude(double alt) { if(alt > 0 && alt != _maxAltitude){ @@ -36,8 +43,4 @@ QmlObjectListModel* WimaPolygon::splitPolygonArea(int numberOfFractions) return nullptr; } -QGCMapPolygon *WimaPolygon::extractQGCPolygon() -{ - QGCMapPolygon* newPolygon = new QGCMapPolygon(this->parent()); -} diff --git a/src/MissionManager/WimaPolygon.h b/src/MissionManager/WimaPolygon.h index 4e762e70b8a070a5b18ca01ee48864b69d6d2d7d..fa595c1bfcfa719af5e4a7d7bfb07601a5acbf4e 100644 --- a/src/MissionManager/WimaPolygon.h +++ b/src/MissionManager/WimaPolygon.h @@ -3,14 +3,16 @@ #include "QGCMapPolygon.h" #include "Vehicle.h" +#include "qobject.h" -class WimaPolygon : public QGCMapPolygon //abstract base class for all WimaPolygons +class WimaPolygon : public QObject //abstract base class for all WimaPolygons { Q_OBJECT public: WimaPolygon(QObject* parent = nullptr); + WimaPolygon(QGCMapPolygon* other, QObject* parent = nullptr); @@ -18,14 +20,17 @@ public: Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT) Q_PROPERTY(QString editorQML READ editorQML CONSTANT) Q_PROPERTY(Vehicle* vehicle READ vehicle WRITE setVehicle NOTIFY vehicleChanged) - Q_PROPERTY(QmlObjectListModel* polygonFractions READ polygonFractions NOTIFY polygonFractionsChanged) + Q_PROPERTY(QGCMapPolygon* polygon READ polygon NOTIFY polygonChanged) //Property accessors - double maxAltitude (void) const { return _maxAltitude;} - Vehicle* vehicle (void) const { return _vehicle;} + double maxAltitude (void) const { return _maxAltitude;} + Vehicle* vehicle (void) const { return _vehicle;} + QGCMapPolygon* polygon (void) const { return _polygon;} - virtual QString mapVisualQML (void) const = 0; - virtual QString editorQML (void) const = 0; + + virtual QString mapVisualQML (void) const = 0; + virtual QString editorQML (void) const = 0; + virtual QList& subPolygons (void) { return _subPolygons;} //Property setters void setMaxAltitude (double alt); @@ -38,11 +43,9 @@ public: Q_INVOKABLE QmlObjectListModel* splitPolygonArea(int numberOfFractions); - signals: void maxAltitudeChanged (double alt); void vehicleChanged (Vehicle* vehicle); - void polygonFractionsChanged (QmlObjectListModel* pfrac); protected: QGCMapPolygon* extractQGCPolygon(void); @@ -52,7 +55,8 @@ private: double _maxAltitude; Vehicle* _vehicle; - QmlObjectListModel* _polygonFractions; + QGCMapPolygon* _polygon; + QList _subPolygons; }; #endif // WIMAPOLYGON_H diff --git a/src/MissionManager/WimaPolygonContainer.cc b/src/MissionManager/WimaPolygonContainer.cc new file mode 100644 index 0000000000000000000000000000000000000000..c659e4457d86abcfb090e06d1342c792a3f6bc1e --- /dev/null +++ b/src/MissionManager/WimaPolygonContainer.cc @@ -0,0 +1,70 @@ +#include "WimaPolygonContainer.h" + +WimaPolygonContainer::WimaPolygonContainer(QObject *parent) : + QObject (parent) + ,_flatListDirty (true) +{ + connect(this, &WimaPolygonContainer::itemListChanged, this, &WimaPolygonContainer::setFlatListDirty); +} + +QList &WimaPolygonContainer::returnItems() +{ + return _itemList; +} + +void WimaPolygonContainer::addItem(WimaPolygon *polygon) +{ + if(polygon != nullptr){ + _itemList.append(polygon); + + emit itemListChanged(); + } + else { + qWarning("Not a valid WimaPolygon!"); + } +} + +void WimaPolygonContainer::removeItem(int itemIndex) +{ + if(itemIndex >= 0 && itemIndex < _itemList.count()){ + _itemList.removeAt(itemIndex); + + emit itemListChanged(); + }else { + qWarning("Invalid item Index. Index must be in 0..%i.", _itemList.count()-1); + } +} + +void WimaPolygonContainer::removeItem(WimaPolygon *polygon) +{ + if(polygon != nullptr){ + _itemList.removeOne(polygon); + + emit itemListChanged(); + } + else { + qWarning("Not a valid WimaPolygon!"); + } +} + +QList& WimaPolygonContainer::returnFlatList() +{ + if(_flatListDirty){ + _flatList.clear(); + + int count = _itemList.count(); + for(int i = 0; i < count; i++){ + WimaPolygon* poly = _itemList.takeAt(i); + _flatList.append(poly); + _flatList.append(poly->subPolygons()); // returns an emptey list, if no sub polygons exist + } + _flatListDirty = false; + } + + return _flatList; +} + +void WimaPolygonContainer::setFlatListDirty(void) +{ + _flatListDirty = true; +} diff --git a/src/MissionManager/WimaPolygonContainer.h b/src/MissionManager/WimaPolygonContainer.h new file mode 100644 index 0000000000000000000000000000000000000000..fd9e27a801919a055a88d04ec347587c34529ae5 --- /dev/null +++ b/src/MissionManager/WimaPolygonContainer.h @@ -0,0 +1,33 @@ +#ifndef WIMAPOLYGONCONTAINER_H +#define WIMAPOLYGONCONTAINER_H + +#include +#include "WimaPolygon.h" + +class WimaPolygonContainer : public QObject +{ + Q_OBJECT +public: + WimaPolygonContainer(QObject *parent = nullptr); + + + QList& returnItems(); + + void addItem(WimaPolygon* polygon); + void removeItem(int itemIndex); + void removeItem(WimaPolygon* polygon); + QList& returnFlatList(); + +signals: + void itemListChanged(void); + +private slots: + void setFlatListDirty(void); + +private: + QList _itemList; + QList _flatList; + bool _flatListDirty; +}; + +#endif // WIMAPOLYGONCONTAINER_H diff --git a/src/MissionManager/WimaServicePolygon.cc b/src/MissionManager/WimaServicePolygon.cc index 8d87c4df11e8c37ed1dd933448ff068b37c95b2c..14753ce29044cd54eed0688e320d668a5e0074eb 100644 --- a/src/MissionManager/WimaServicePolygon.cc +++ b/src/MissionManager/WimaServicePolygon.cc @@ -6,6 +6,12 @@ WimaServicePolygon::WimaServicePolygon(QObject *parent): } +WimaServicePolygon::WimaServicePolygon(QGCMapPolygon *other, QObject *parent): + WimaPolygon (other, parent) +{ + +} + void WimaServicePolygon::setTakeOffPosition(QGeoCoordinate coordinate) { if(_takeOffPosition != coordinate){ diff --git a/src/MissionManager/WimaServicePolygon.h b/src/MissionManager/WimaServicePolygon.h index ef193e55b6512642a915995639736ca31bdb1ab8..22a93cdeb5cdf74fe5d44a9aa6111676be455541 100644 --- a/src/MissionManager/WimaServicePolygon.h +++ b/src/MissionManager/WimaServicePolygon.h @@ -8,7 +8,9 @@ class WimaServicePolygon : public WimaPolygon { Q_OBJECT public: - WimaServicePolygon(QObject* parent); + WimaServicePolygon(QObject* parent = nullptr); + WimaServicePolygon(QGCMapPolygon* other, QObject* parent = nullptr); + Q_PROPERTY(QGeoCoordiante takeOffPosition READ takeOffPosition WRITE setTakeOffPosition NOTIFY takeOffPositionChanged) Q_PROPERTY(QGeoCoordinate landPosition READ landPosition WRITE setLandPosition NOTIFY landPositionChanged) Q_PROPERTY(Vehicle* vehicle READ vehicle WRITE setVehicle NOTIFY vehicleChanged) diff --git a/src/MissionManager/WimaVehicleCorridor.cc b/src/MissionManager/WimaVehicleCorridor.cc index 1d6e52f25205f2cfe8c545845058f585a5bc7dbd..74dc43c39de6641a271050586160786b157f5733 100644 --- a/src/MissionManager/WimaVehicleCorridor.cc +++ b/src/MissionManager/WimaVehicleCorridor.cc @@ -5,3 +5,9 @@ WimaVehicleCorridor::WimaVehicleCorridor(QObject *parent): { } + +WimaVehicleCorridor::WimaVehicleCorridor(QGCMapPolygon *other, QObject *parent): + WimaPolygon (other, parent) +{ + +} diff --git a/src/MissionManager/WimaVehicleCorridor.h b/src/MissionManager/WimaVehicleCorridor.h index 6ade209bb16682491c58b46fee6fb6edc64dc39b..99596ecd0d29df9fc805198ec45b70139633e34b 100644 --- a/src/MissionManager/WimaVehicleCorridor.h +++ b/src/MissionManager/WimaVehicleCorridor.h @@ -9,6 +9,7 @@ class WimaVehicleCorridor : public WimaPolygon Q_OBJECT public: WimaVehicleCorridor(QObject* parent); + WimaVehicleCorridor(QGCMapPolygon* other, QObject* parent); // Overrides from WimaPolygon QString mapVisualQML (void) const { return "WimaVehicleCorridorMapVisal.qml";} diff --git a/src/MissionManager/WimaVehicleMeasurementPolygon.cc b/src/MissionManager/WimaVehicleMeasurementPolygon.cc index 3032b346eaff64109c33ab14b23860fa13fc5bee..b8fd4cf5bc623170e8f7733b663cc87306da99c6 100644 --- a/src/MissionManager/WimaVehicleMeasurementPolygon.cc +++ b/src/MissionManager/WimaVehicleMeasurementPolygon.cc @@ -6,3 +6,9 @@ WimaVehicleMeasurementPolygon::WimaVehicleMeasurementPolygon(QObject *parent): { } + +WimaVehicleMeasurementPolygon::WimaVehicleMeasurementPolygon(QGCMapPolygon *other, QObject *parent): + WimaPolygon (other, parent) +{ + +} diff --git a/src/MissionManager/WimaVehicleMeasurementPolygon.h b/src/MissionManager/WimaVehicleMeasurementPolygon.h index 896e036e79e67595991c45c47228048b94ba2b04..44a5e0c7a7a5ee1370926fa8f0ff0f00298e8549 100644 --- a/src/MissionManager/WimaVehicleMeasurementPolygon.h +++ b/src/MissionManager/WimaVehicleMeasurementPolygon.h @@ -9,6 +9,8 @@ class WimaVehicleMeasurementPolygon : public WimaPolygon Q_OBJECT public: WimaVehicleMeasurementPolygon(QObject* parent); + WimaVehicleMeasurementPolygon(QGCMapPolygon* other, QObject* parent); + // Overrides from WimaPolygon QString mapVisualQML (void) const { return "WimaVehicleMeasurementPolygonMapVisal.qml";} QString editorQML (void) const { return "WimaVehicleMeasurementPolygonEditor.qml";}