WimaPlaner.h 6.64 KB
Newer Older
1
#pragma once
2

3
#include "QmlObjectListModel.h"
4
#include <QObject>
5
#include <QScopedPointer>
6
#include <QSharedPointer>
7

8 9 10 11
#include "Geometry/WimaCorridor.h"
#include "Geometry/WimaCorridorData.h"
#include "Geometry/WimaJoinedArea.h"
#include "Geometry/WimaJoinedAreaData.h"
12 13 14 15
#include "Geometry/WimaMeasurementArea.h"
#include "Geometry/WimaMeasurementAreaData.h"
#include "Geometry/WimaServiceArea.h"
#include "Geometry/WimaServiceAreaData.h"
16
#include "WimaPlanData.h"
17

18 19
#include "Snake/NemoInterface.h"

20
#include "JsonHelper.h"
21

22 23
class MissionController;
class PlanMasterController;
24

25
namespace wima_planer_detail {
26
class WimaStateMachine;
27 28
}

29 30
class WimaPlaner : public QObject {
  Q_OBJECT
31

32
  enum FileType { WimaFile, PlanFile };
33

34
public:
35
  WimaPlaner(QObject *parent = nullptr);
36
  ~WimaPlaner();
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
  template <class T> WimaPlaner(T t, QObject *parent = nullptr) = delete;
  template <class T> WimaPlaner(T t) = delete;

  Q_PROPERTY(PlanMasterController *masterController READ masterController WRITE
                 setMasterController NOTIFY masterControllerChanged)
  Q_PROPERTY(MissionController *missionController READ missionController WRITE
                 setMissionController NOTIFY missionControllerChanged)
  Q_PROPERTY(QmlObjectListModel *visualItems READ visualItems NOTIFY
                 visualItemsChanged)
  Q_PROPERTY(int currentPolygonIndex READ currentPolygonIndex WRITE
                 setCurrentPolygonIndex NOTIFY currentPolygonIndexChanged)
  Q_PROPERTY(QString currentFile READ currentFile NOTIFY currentFileChanged)
  Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT)
  Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
  Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
  Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT)
53
  Q_PROPERTY(NemoInterface *nemoInterface READ nemoInterface CONSTANT)
54 55
  Q_PROPERTY(bool synchronized READ synchronized NOTIFY synchronizedChanged)
  Q_PROPERTY(bool needsUpdate READ needsUpdate NOTIFY needsUpdateChanged)
56 57
  Q_PROPERTY(bool readyForSynchronization READ readyForSynchronization NOTIFY
                 readyForSynchronizationChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
58
  Q_PROPERTY(bool surveyReady READ surveyReady NOTIFY surveyReadyChanged)
59 60
  Q_PROPERTY(bool progressLocked READ progressLocked WRITE setProgressLocked
                 NOTIFY progressLockedChanged)
61 62

  // Property accessors
63 64
  PlanMasterController *masterController(void);
  MissionController *missionController(void);
65
  QmlObjectListModel *visualItems(void);
66 67
  int currentPolygonIndex(void) const;
  QString currentFile(void) const;
68 69
  QStringList loadNameFilters(void) const;
  QStringList saveNameFilters(void) const;
70
  QString fileExtension(void) const;
71
  QGeoCoordinate joinedAreaCenter(void) const;
72
  NemoInterface *nemoInterface(void);
73 74
  bool synchronized();
  bool needsUpdate();
75
  bool readyForSynchronization();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
76
  bool surveyReady();
77
  bool progressLocked();
78 79 80 81 82 83 84

  // Property setters
  void setMasterController(PlanMasterController *masterController);
  void setMissionController(MissionController *missionController);
  /// Sets the integer index pointing to the current polygon. Current polygon is
  /// set interactive.
  void setCurrentPolygonIndex(int index);
85
  void setProgressLocked(bool l);
86 87 88 89 90 91 92 93 94 95 96

  Q_INVOKABLE bool addMeasurementArea();
  /// Removes an area from _visualItems
  /// @param index Index of the area to be removed
  Q_INVOKABLE void removeArea(int index);
  Q_INVOKABLE bool addServiceArea();
  Q_INVOKABLE bool addCorridor();
  /// Remove all areas from WimaPlaner and all mission items from
  /// MissionController
  Q_INVOKABLE void removeAll();
  /// Recalculates vehicle corridor, flight path, etc.
97
  Q_INVOKABLE void update();
98
  /// Pushes the generated mission data to the wimaController.
99
  Q_INVOKABLE void synchronize();
100 101 102 103 104 105 106 107 108 109 110 111
  Q_INVOKABLE void saveToCurrent();
  Q_INVOKABLE void saveToFile(const QString &filename);
  Q_INVOKABLE bool loadFromCurrent();
  Q_INVOKABLE bool loadFromFile(const QString &filename);
  Q_INVOKABLE void resetAllInteractive(void);
  Q_INVOKABLE void setInteractive(void);

  QJsonDocument saveToJson(FileType fileType);
  // static Members
  static const char *wimaFileExtension;
  static const char *areaItemsName;
  static const char *missionItemsName;
112 113

signals:
114 115 116 117 118 119
  void masterControllerChanged(void);
  void missionControllerChanged(void);
  void visualItemsChanged(void);
  void currentPolygonIndexChanged(int index);
  void currentFileChanged();
  void wimaBridgeChanged();
120 121
  void synchronizedChanged(void);
  void needsUpdateChanged(void);
122
  void readyForSynchronizationChanged(void);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
123
  void surveyReadyChanged(void);
124
  void progressLockedChanged();
125 126

private slots:
127
  void updatePolygonInteractivity(int index);
128 129
  void _update();
  void CSDestroyedHandler();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
130
  void CSVisualTransectPointsChangedHandler();
131 132 133
  void mAreaPathChangedHandler();
  void mAreaTilesChangedHandler();
  void mAreaProgressChangedHandler();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
134
  void mAreaProgressAcceptedHandler();
135
  void mAreaReadyChangedHandler();
136 137 138
  void sAreaPathChangedHandler();
  void corridorPathChangedHandler();
  void depotChangedHandler();
139 140 141 142
  void missionControllerVisualItemsChangedHandler();
  void missionControllerWaypointPathChangedHandler();
  void missionControllerNewItemsFromVehicleHandler();
  void missionControllerMissionItemCountChangedHandler();
143
  void nemoInterfaceProgressChangedHandler();
144

Valentin Platzgummer's avatar
Valentin Platzgummer committed
145
#ifndef NDEBUG
146
  void autoLoadMission(void);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
147
#endif
148

149 150
private:
signals:
151
  void joinedAreaValidChanged();
152
  void stateChanged();
153

154
private:
155
  // Member Functions
156
  bool toPlanData(AreaData &planData);
157 158 159
  bool shortestPath(const QGeoCoordinate &start,
                    const QGeoCoordinate &destination,
                    QVector<QGeoCoordinate> &path);
160
  void setSynchronized(bool s);
161 162 163 164 165 166
  void enableAreaMonitoring();
  void disableAreaMonitoring();
  void enableMissionControllerMonitoring();
  void disableMissionControllerMonitoring();
  bool areasMonitored();
  bool missionControllerMonitored();
167 168 169 170 171

  // Member Variables
  PlanMasterController *_masterController;
  MissionController *_missionController;
  int _currentAreaIndex;
172 173 174 175 176 177
  QString _currentFile;

  WimaMeasurementArea _measurementArea;
  WimaServiceArea _serviceArea;
  WimaCorridor _corridor;
  WimaJoinedArea _joinedArea;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
178
  QmlObjectListModel _visualItems; // all areas
179

180
  CircularSurvey *_survey;
181

Valentin Platzgummer's avatar
Valentin Platzgummer committed
182
#ifndef NDEBUG
183 184
  QTimer _autoLoadTimer; // timer to auto load mission after some time, prevents
                         // seg. faults
Valentin Platzgummer's avatar
Valentin Platzgummer committed
185
#endif
186 187

  NemoInterface _nemoInterface;
188 189

  // State
190
  QScopedPointer<wima_planer_detail::WimaStateMachine> _stateMachine;
191 192
  bool _areasMonitored;
  bool _missionControllerMonitored;
193
  bool _progressLocked;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
194 195
  bool _synchronized; // true if planData is synchronized with
                      // wimaController
196
};