MeasurementComplexItem.h 10.2 KB
Newer Older
1 2 3
#pragma once

#include <QFutureWatcher>
4
#include <QJsonArray>
5 6 7
#include <QVector>
#include <memory>

Valentin Platzgummer's avatar
Valentin Platzgummer committed
8 9
#include "ComplexMissionItem.h"
#include "QGCQGeoCoordinate.h"
10 11
#include "SettingsFact.h"

12
#include "AreaData.h"
13
#include "geometry/ProgressArray.h"
14 15

class RoutingThread;
16
class RoutingResult;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
17
class Nemointerface;
18 19 20 21 22

namespace routing {
class GeneratorBase;
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
23
class MeasurementComplexItem : public ComplexMissionItem {
24 25
  Q_OBJECT

26 27
  using PtrGenerator = routing::GeneratorBase *;
  using PtrAreaData = AreaData *;
28
  using PtrRoutingData = std::shared_ptr<RoutingResult>;
29
  using PtrWorker = RoutingThread *;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
30
  using Variant = QVariantList;
31

Valentin Platzgummer's avatar
Valentin Platzgummer committed
32
  enum class STATE { IDLE, ROUTING, EDITING };
33 34

public:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
35 36 37
  MeasurementComplexItem(PlanMasterController *masterController, bool flyView,
                         const QString &kmlOrShpFile, QObject *parent);
  ~MeasurementComplexItem();
38

39 40
  Q_PROPERTY(Fact *variantIndex READ variantIndex CONSTANT)
  Q_PROPERTY(Fact *altitude READ altitude CONSTANT)
41 42 43
  Q_PROPERTY(
      QStringList variantNames READ variantNames NOTIFY variantNamesChanged)
  Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY
44
                 generatorListChanged)
45
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
46
  Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
47 48
  Q_PROPERTY(bool holdProgress READ holdProgress WRITE setHoldProgress NOTIFY
                 holdProgressChanged)
49
  Q_PROPERTY(bool idle READ idle NOTIFY idleChanged)
50 51 52
  Q_PROPERTY(
      routing::GeneratorBase *generator READ generator NOTIFY generatorChanged)
  Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged)
53
  Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
54
  Q_PROPERTY(QVariantList route READ route NOTIFY routeChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
55 56
  Q_PROPERTY(QString nemoError READ nemoError NOTIFY nemoErrorChanged)
  Q_PROPERTY(Fact *nemoCString READ nemoCString CONSTANT)
57

Valentin Platzgummer's avatar
Valentin Platzgummer committed
58
  Q_INVOKABLE void reverseRoute(void);
59

Valentin Platzgummer's avatar
Valentin Platzgummer committed
60 61 62 63
  // Overrides from ComplexMissionItem
  virtual QString patternName(void) const override final;
  virtual double complexDistance(void) const override final;
  virtual int lastSequenceNumber(void) const final;
64 65
  virtual bool load(const QJsonObject &complexObject, int sequenceNumber,
                    QString &errorString) override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
66 67
  virtual double
  greatestDistanceTo(const QGeoCoordinate &other) const override final;
68
  virtual QString mapVisualQML(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
69 70 71 72 73

  // Overrides from VisualMissionItem
  virtual bool dirty(void) const override final;
  virtual bool isSimpleItem(void) const override final;
  virtual bool isStandaloneCoordinate(void) const override final;
74
  virtual bool specifiesCoordinate(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
75 76 77 78 79 80 81 82 83 84 85 86 87
  virtual bool specifiesAltitudeOnly(void) const override final;
  virtual QGeoCoordinate coordinate(void) const override final;
  virtual QGeoCoordinate exitCoordinate(void) const override final;
  virtual int sequenceNumber(void) const override final;
  virtual double specifiedFlightSpeed(void) final override;
  virtual double specifiedGimbalYaw(void) final override;
  virtual double specifiedGimbalPitch(void) final override;
  virtual void appendMissionItems(QList<MissionItem *> &items,
                                  QObject *missionItemParent) final override;
  virtual void setMissionFlightStatus(
      const MissionController::MissionFlightStatus_t &missionFlightStatus)
      final override;
  virtual void applyNewAltitude(double newAltitude) override final;
88
  virtual double additionalTimeDelay(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
89 90 91 92 93
  virtual ReadyForSaveState readyForSaveState(void) const override final;
  virtual bool exitCoordinateSameAsEntry(void) const override final;
  virtual void setDirty(bool dirty) override final;
  virtual void setCoordinate(const QGeoCoordinate &coordinate) override final;
  virtual void setSequenceNumber(int sequenceNumber) override final;
94
  virtual void save(QJsonArray &missionItems) override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
95 96 97 98
  virtual double amslEntryAlt(void) const override final;
  virtual double amslExitAlt(void) const override final;
  virtual double minAMSLAltitude(void) const override final;
  virtual double maxAMSLAltitude(void) const override final;
99 100 101
  virtual QString commandDescription(void) const override final;
  virtual QString commandName(void) const override final;
  virtual QString abbreviation(void) const override final;
102 103

  // Generator
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
  //!
  //! \brief addGenerator Adds a generator.
  //!
  //! Adds a generator. The generator will be added to the generatorList() and
  //! it's name to the generatorNameList(). Generators are identified by index
  //! or name(), hence their name must be unique. A generator can not be added
  //! if name() is already inside generatorNameList(). \param g Pointer to a
  //! generator. \return Returns true if the generator was addes successfully,
  //! false either.
  //!
  bool addGenerator(routing::GeneratorBase *g);
  //!
  //! \brief removeGenerator Removes the generator.
  //! \param name The name of the generator to be removed.
  //! \return Returns true if the generator was removed successfully.
  //! \note The generator will be deleted if this or nullptr is it's parent.
120
  bool removeGenerator(const QString &name);
121 122 123 124 125
  //!
  //! \brief removeGenerator Removes the generator.
  //! \param index The index of the generator to be removed
  //! \return Returns true if the generator was removed successfully.
  //! \note See above.
126
  bool removeGenerator(int index);
127

128 129
  Q_INVOKABLE bool switchToGenerator(const QString &name);
  Q_INVOKABLE bool switchToGenerator(int index);
130 131 132 133
  //!
  //! \brief resetGenerators Resets the generators as they where after creation
  //! of this object.
  //!
134
  Q_INVOKABLE void resetGenerators();
135 136

  QList<PtrGenerator> generatorList() const;
137
  QStringList generatorNameList() const;
138

139
  routing::GeneratorBase *generator();
140 141 142
  const routing::GeneratorBase *generator() const;
  routing::GeneratorBase *generator(int index);
  const routing::GeneratorBase *generator(int index) const;
143 144 145
  //!
  //! \brief generatorIndex
  //! \return Returns the index of the current generator.
146
  int generatorIndex() const;
147 148 149 150 151 152 153
  //!
  //! \brief generatorIndex
  //! \param name
  //! \return Returns the index of the generator with the name \p name, or -1 if
  //! the generator is unknown.
  //!
  int generatorIndex(const QString &name);
154

155 156
  // Editing.
  //!
157
  //! \brief startEditing Starts area data editing.
158
  //!
Valentin Platzgummer's avatar
Valentin Platzgummer committed
159
  //! Starts area data editing. Route will not be updated bewteen a call
160 161
  //! sequence of editingStart() and editingStop().
  //!
162
  Q_INVOKABLE void startEditing();
163
  //!
164
  //! \brief stopEditing Stops area editing.
165 166
  //!
  //! Stops area editing. Will reset area data to the state before
Valentin Platzgummer's avatar
Valentin Platzgummer committed
167
  //! editingStart() if it is invalid. Triggers a route update.
168
  //!
169
  //! \param doUpdate No route update will be triggered if false, route update
170 171 172
  //! will eventually be triggered if true.
  //!
  //!  \return Returns true if a route
173 174 175
  //! update was triggered, false either.
  //!
  Q_INVOKABLE bool stopEditing(bool doUpdate = true);
176 177 178 179 180 181 182
  //!
  //! \brief abortEditing Aborts area editing.
  //!
  //! Will reset area data to the state before
  //! editingStart().
  //!
  Q_INVOKABLE void abortEditing();
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
  //!
  //! \brief reset Resets the areas to the state before startEditing().
  //!
  //! Resets the areas to the state before startEditing(). Does nothing if
  //! editinge() == false.
  //!
  Q_INVOKABLE void reset();

  //!
  //! \brief initialize Initializes the areas in a valid way, such that they
  //! area inside the bounding box. \param bottomLeft bottom left corner of the
  //! bounding box. \param topRight  top right corner of the bounding box. \note
  //! Behavior is undefined, if \p bottomLeft and \p topRight are not the bottom
  //! left and the top right corner of the bounding box. \return Returns true on
  //! succes, false either.
  //!
  Q_INVOKABLE bool initialize(const QGeoCoordinate &bottomLeft,
                              const QGeoCoordinate &topRight);
  //!
  //! \brief initialized Checks if area data is initialized
  //! \return Returns true if area list contains a SafeArea and a
  //! MeasurementArea and both areas have at least three vertices, returns false
  //! either.
  //!
  Q_INVOKABLE bool initialized();
208

Valentin Platzgummer's avatar
Valentin Platzgummer committed
209 210 211
  // Property getters
  const AreaData *areaData() const;
  AreaData *areaData();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
212 213
  QVariantList route();

214
  Fact *variantIndex();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
215
  QStringList variantNames() const;
216
  Fact *altitude();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
217

Valentin Platzgummer's avatar
Valentin Platzgummer committed
218
  bool calculating() const;
219
  bool editing() const; // set to true on creation
220
  bool idle() const;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
221 222
  bool followTerrain() const;

223 224 225 226
  static const char *settingsGroup;
  static const char *jsonComplexItemTypeValue;
  static const QString name;

227 228 229
  bool holdProgress() const;
  void setHoldProgress(bool holdProgress);

Valentin Platzgummer's avatar
Valentin Platzgummer committed
230 231 232 233
  QString nemoError() const;

  Fact *nemoCString();

234 235
signals:
  void variantNamesChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
236

237
  void generatorListChanged();
238
  void generatorChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
239 240

  void calculatingChanged();
241
  void editingChanged();
242
  void idleChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
243

244
  void areaDataChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
245
  void routeChanged();
246
  void holdProgressChanged();
247

Valentin Platzgummer's avatar
Valentin Platzgummer committed
248 249
  void nemoErrorChanged();

250 251 252
private slots:

  // Worker functions.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
253
  void _storeRoutingData(PtrRoutingData pRoute);
254
  void _updateRoute();
255
  void _changeVariantIndex();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
256
  void _reverseRoute();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
257 258
  void _syncTiles();
  void _onNewProgress(const ProgressArray &array);
259 260

private:
261
  bool _setGenerator(PtrGenerator newG);
262
  void _setState(STATE state);
263
  void _setAreaData(PtrAreaData data);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
264 265
  static bool _calculating(STATE state);
  static bool _editing(STATE state);
266
  static bool _idle(STATE state);
267
  void _updateFlightpathSegments();
268
  void _onAltitudeChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
269
  void _setNemoError(const QString &nemoError);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
270 271 272 273

  // Hirarcical stuff.
  int _sequenceNumber;
  bool _followTerrain;
274 275 276 277

  // State.
  STATE _state;

278
  // Facts
279
  QMap<QString, FactMetaData *> _metaDataMap;
280
  SettingsFact _altitude;
281
  SettingsFact _variantIndex;
282 283 284
  QStringList _variantNames;

  // Area data
285 286 287
  PtrAreaData _pAreaData;
  PtrAreaData _pEditorData;
  PtrAreaData _pCurrentData;
288
  bool _holdProgress;
289 290 291 292 293 294 295

  // Generators
  QList<PtrGenerator> _generatorList;
  PtrGenerator _pGenerator;

  // Routing.
  QVector<Variant> _variantVector;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
296
  Variant _route;
297
  PtrWorker _pWorker;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
298 299 300 301 302

  // NemoInterface
  std::shared_ptr<Nemointerface> _pNemointerface;
  QString _nemoError;
  SettingsFact _nemoCString;
303
};