WimaController.h 5.02 KB
Newer Older
1
#pragma once
2 3

#include <QObject>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
4 5
#include <QScopedPointer>

6
#include "QGCMapPolygon.h"
7
#include "QmlObjectListModel.h"
8

9
#include "Geometry/WimaCorridorData.h"
10
#include "Geometry/WimaMeasurementAreaData.h"
11
#include "Geometry/WimaServiceAreaData.h"
12

13 14
#include "WimaPlanData.h"

15
#include "SettingsFact.h"
16

17
#include "Geometry/GeoPoint3D.h"
18
#include "RoutingThread.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19
#include "Snake/NemoInterface.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
20

21
#include "WaypointManager/EmptyManager.h"
22
#include "WaypointManager/RTLManager.h"
23

Valentin Platzgummer's avatar
Valentin Platzgummer committed
24
#include "utilities.h"
25 26

#include <map>
27

Valentin Platzgummer's avatar
Valentin Platzgummer committed
28 29
typedef std::unique_ptr<rapidjson::Document> JsonDocUPtr;

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
class WimaController : public QObject {
  Q_OBJECT
public:
  WimaController(QObject *parent = nullptr);

  // Controllers.
  Q_PROPERTY(PlanMasterController *masterController READ masterController WRITE
                 setMasterController NOTIFY masterControllerChanged)
  Q_PROPERTY(MissionController *missionController READ missionController WRITE
                 setMissionController NOTIFY missionControllerChanged)
  // Wima Data.
  Q_PROPERTY(QmlObjectListModel *visualItems READ visualItems NOTIFY
                 visualItemsChanged)
  Q_PROPERTY(QmlObjectListModel *missionItems READ missionItems NOTIFY
                 missionItemsChanged)
  Q_PROPERTY(
      QVariantList waypointPath READ waypointPath NOTIFY waypointPathChanged)
  Q_PROPERTY(Fact *enableWimaController READ enableWimaController CONSTANT)
  // Waypoint navigaton.
  Q_PROPERTY(Fact *flightSpeed READ flightSpeed CONSTANT)
  Q_PROPERTY(Fact *altitude READ altitude CONSTANT)

  // Controllers.
  PlanMasterController *masterController(void);
  MissionController *missionController(void);
  // Wima Data
  QmlObjectListModel *visualItems(void);
  QGCMapPolygon joinedArea(void) const;
  // Waypoints.
  QmlObjectListModel *missionItems(void);
  QVariantList waypointPath(void);
  // Settings facts.
  Fact *enableWimaController(void);
  Fact *flightSpeed(void);
  Fact *altitude(void);

  bool uploadOverrideRequired(void) const;
  bool vehicleHasLowBattery(void) const;

  // Property setters
  void setMasterController(PlanMasterController *masterController);
  void setMissionController(MissionController *missionController);
72
  bool setWimaPlanData(QSharedPointer<WimaPlanData> planData);
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

  // Member Methodes
  Q_INVOKABLE WimaController *thisPointer();
  // Smart RTL.
  Q_INVOKABLE void requestSmartRTL();
  Q_INVOKABLE void initSmartRTL();
  Q_INVOKABLE void executeSmartRTL();
  // Other.
  Q_INVOKABLE void removeVehicleTrajectoryHistory();
  Q_INVOKABLE bool upload();
  Q_INVOKABLE bool forceUpload();
  Q_INVOKABLE void removeFromVehicle();

  // static Members
  static const char *areaItemsName;
  static const char *missionItemsName;
  static const char *settingsGroup;
  static const char *enableWimaControllerName;
  static const char *flightSpeedName;
  static const char *altitudeName;
93

94
signals:
95 96 97 98 99 100 101 102 103 104 105 106 107
  // Controllers.
  void masterControllerChanged(void);
  void missionControllerChanged(void);
  // Wima data.
  void visualItemsChanged(void);
  // Waypoints.
  void missionItemsChanged(void);
  void waypointPathChanged(void);
  // Smart RTL.
  void smartRTLRequestConfirm(void);
  void smartRTLPathConfirm(void);
  // Upload.
  void forceUploadConfirm(void);
108

109
private slots:
110

111 112 113 114 115 116 117
  bool _calcShortestPath(const QGeoCoordinate &start,
                         const QGeoCoordinate &destination,
                         QVector<QGeoCoordinate> &path);
  void _updateflightSpeed(void);
  void _updateAltitude(void);
  // SMART RTL
  void _checkBatteryLevel(void);
118
  bool _SRTLPrecondition(QString &errorString);
119 120 121
  void _initSmartRTL();
  void _smartRTLCleanUp(bool flying);
  // Snake.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
122
  void _switchWaypointManager(WaypointManager::ManagerBase &manager);
123 124
  // Periodic tasks.
  void _eventTimerHandler(void);
125 126

private:
127 128 129 130 131 132
  // Controllers.
  PlanMasterController *_masterController;
  MissionController *_missionController;

  // Wima Data.
  QmlObjectListModel _areas; // contains all visible areas
133 134
  // joined area fromed by opArea, serArea, _corridor
  WimaJoinedAreaData _joinedArea;
135 136 137
  WimaMeasurementAreaData _measurementArea; // measurement area
  WimaServiceAreaData _serviceArea;         // area for supplying
  WimaCorridorData _corridor; // corridor connecting opArea and serArea
138
  bool _planDataValid;
139 140 141 142

  // Waypoint Managers.
  WaypointManager::AreaInterface _areaInterface;
  WaypointManager::Settings _WMSettings; // Waypoint Manager Settings
143
  WaypointManager::EmptyManager _emptyWM;
144 145 146 147 148 149 150 151
  WaypointManager::RTLManager _rtlWM;
  WaypointManager::ManagerBase *_currentWM;
  using ManagerList = QList<WaypointManager::ManagerBase *>;
  ManagerList _WMList;

  // Settings Facts.
  QMap<QString, FactMetaData *> _metaDataMap;
  SettingsFact _enableWimaController; // enables or disables the wimaControler
152 153
  // determines the number of overlapping waypoints between two consecutive
  // mission phases
154 155
  SettingsFact _flightSpeed; // mission flight speed
  SettingsFact _altitude;    // mission altitude
156 157 158 159 160 161 162 163

  // Smart RTL.
  QTimer _smartRTLTimer;
  bool _lowBatteryHandlingTriggered;

  // Periodic tasks.
  QTimer _eventTimer;
  EventTicker _batteryLevelTicker;
164
};