MeasurementComplexItem.h 6.27 KB
Newer Older
1 2 3 4 5 6
#pragma once

#include <QFutureWatcher>
#include <QVector>
#include <memory>

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

11
#include "AreaData.h"
12 13 14 15 16 17 18 19

class RoutingThread;
class RoutingData;

namespace routing {
class GeneratorBase;
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
20
class MeasurementComplexItem : public ComplexMissionItem {
21 22
  Q_OBJECT

23 24
  using PtrGenerator = routing::GeneratorBase *;
  using PtrAreaData = AreaData *;
25
  using PtrRoutingData = std::shared_ptr<RoutingData>;
26
  using PtrWorker = RoutingThread *;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
27
  using Variant = QList<QGeoCoordinate>;
28

Valentin Platzgummer's avatar
Valentin Platzgummer committed
29
  enum class STATE { IDLE, ROUTING, REVERT_PATH, CHANGE_VARIANT, EDITING };
30 31

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

  Q_PROPERTY(Fact *variant READ variant CONSTANT)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
37
  Q_PROPERTY(Fact *altitude READ variant CONSTANT)
38 39 40 41 42 43 44 45
  Q_PROPERTY(
      QStringList variantNames READ variantNames NOTIFY variantNamesChanged)
  Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY
                 generatorNameListChanged)
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
  Q_PROPERTY(
      routing::GeneratorBase *generator READ generator NOTIFY generatorChanged)
  Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged)
46 47
  Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
  Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
48 49
  Q_PROPERTY(QVariantList visualTransectPoints READ visualTransectPoints NOTIFY
                 visualTransectPointsChanged)
50

51
  Q_INVOKABLE void revertPath(void);
52

Valentin Platzgummer's avatar
Valentin Platzgummer committed
53 54 55 56
  // Overrides from ComplexMissionItem
  virtual QString patternName(void) const override final;
  virtual double complexDistance(void) const override final;
  virtual int lastSequenceNumber(void) const final;
57 58
  virtual bool load(const QJsonObject &complexObject, int sequenceNumber,
                    QString &errorString) override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
59 60
  virtual double
  greatestDistanceTo(const QGeoCoordinate &other) const override final;
61
  virtual QString mapVisualQML(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
62 63 64 65 66

  // Overrides from VisualMissionItem
  virtual bool dirty(void) const override final;
  virtual bool isSimpleItem(void) const override final;
  virtual bool isStandaloneCoordinate(void) const override final;
67
  virtual bool specifiesCoordinate(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
68 69 70 71 72 73 74 75 76 77 78 79 80
  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;
81
  virtual double additionalTimeDelay(void) const override final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
82 83 84 85 86 87 88 89 90 91
  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;
  virtual void save(QJsonArray &missionItems) override final;
  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;
92 93

  // Generator
94
  bool registerGenerator(const QString &name, routing::GeneratorBase *g);
95 96 97 98 99 100 101 102
  bool unregisterGenerator(const QString &name);
  bool unregisterGenerator(int index);
  Q_INVOKABLE bool switchToGenerator(const QString &name);
  Q_INVOKABLE bool switchToGenerator(int index);
  QStringList generatorNameList();
  routing::GeneratorBase *generator();
  int generatorIndex();

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
  // Editing.
  //!
  //! \brief editingStart Starts area data editing.
  //!
  //! Starts area data editing. Transects will not be updated bewteen a call
  //! sequence of editingStart() and editingStop().
  //!
  void editingStart();
  //!
  //! \brief editingStop Stops area editing.
  //!
  //! Stops area editing. Will reset area data to the state before
  //! editingStart() if it is invalid. Triggers a transect update.
  //!
  void editingStop();

Valentin Platzgummer's avatar
Valentin Platzgummer committed
119 120 121 122 123 124 125 126 127 128
  // Property getters
  const AreaData *areaData() const;
  AreaData *areaData();
  Fact *variant();
  Fact *altitude();
  QStringList variantNames() const;
  bool calculating() const;
  bool editing() const;
  bool followTerrain() const;

129 130
  static const char *settingsGroup;
  static const char *variantName;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
131
  static const char *altitudeName;
132 133 134 135 136 137 138 139
  static const char *jsonComplexItemTypeValue;
  static const QString name;

signals:
  void calculatingChanged();
  void variantNamesChanged();
  void generatorNameListChanged();
  void generatorChanged();
140 141
  void editingChanged();
  void areaDataChanged();
142 143 144

private slots:
  // Overrides from TransectStyleComplexItem
Valentin Platzgummer's avatar
Valentin Platzgummer committed
145
  void _update(void);
146 147 148 149

  // Worker functions.
  void _setTransects(PtrRoutingData pRoute);
  void _changeVariant();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
150
  bool _updateRouteWorker();
151 152 153 154
  void _changeVariantWorker();
  void _reverseWorker();

private:
155
  bool _setGenerator(PtrGenerator newG);
156
  void _setState(STATE state);
157
  void _setAreaData(PtrAreaData data);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
158 159 160 161 162 163 164 165
  static bool _calculating(STATE state);
  static bool _editing(STATE state);

  // Hirarcical stuff.
  PlanMasterController *_masterController;
  int _sequenceNumber;
  bool _followTerrain;
  SettingsFact *_altitude;
166 167 168 169

  // State.
  STATE _state;

170
  // Facts
171 172 173 174 175
  QMap<QString, FactMetaData *> _metaDataMap;
  SettingsFact _variant;
  QStringList _variantNames;

  // Area data
176 177 178
  PtrAreaData _areaData;
  PtrAreaData _editorData;
  PtrAreaData _currentData;
179 180 181 182 183 184 185 186

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

  // Routing.
  QVector<Variant> _variantVector;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
187
  Variant _route;
188 189
  PtrWorker _pWorker;
};