CircularSurvey.h 4.26 KB
Newer Older
1 2 3 4
#pragma once

#include <QFutureWatcher>
#include <QVector>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
5
#include <memory>
6 7 8 9

#include "SettingsFact.h"
#include "TransectStyleComplexItem.h"

10 11
#include "Geometry/WimaJoinedAreaData.h"
#include "Geometry/WimaMeasurementAreaData.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
12
#include "WimaPlanData.h"
13

14
class RoutingThread;
15
class RoutingData;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
16
class GeneratorBase;
17

18 19
class CircularSurvey : public TransectStyleComplexItem {
  Q_OBJECT
20

Valentin Platzgummer's avatar
Valentin Platzgummer committed
21 22 23 24
  using PtrGenerator = std::shared_ptr<GeneratorBase>;
  using PtrRoutingData = std::shared_ptr<RoutingData>;

public:
25 26 27 28 29 30 31
  /// @param vehicle Vehicle which this is being contructed for
  /// @param flyView true: Created for use in the Fly View, false: Created for
  /// use in the Plan View
  /// @param kmlOrShpFile Polygon comes from this file, empty for default
  /// polygon
  CircularSurvey(Vehicle *vehicle, bool flyView, const QString &kmlOrShpFile,
                 QObject *parent);
32
  ~CircularSurvey();
33

34 35
  Q_PROPERTY(Fact *type READ type CONSTANT)
  Q_PROPERTY(int typeCount READ typeCount CONSTANT)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
36
  Q_PROPERTY(Fact *variant READ variant CONSTANT)
37 38
  Q_PROPERTY(
      QList<QString> variantNames READ variantNames NOTIFY variantNamesChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
39 40 41
  Q_PROPERTY(QList<QString> generatorNameList READ generatorNameList NOTIFY
                 generatorNameListChanged)
  Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
42

43
  Q_INVOKABLE void reverse(void);
44 45

  // Property setters
Valentin Platzgummer's avatar
Valentin Platzgummer committed
46
  void setPlanData(const WimaPlanData &d);
47 48

  // Property getters
49 50
  Fact *type();
  int typeCount() const;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
51
  Fact *variant();
52
  QList<QString> variantNames() const;
53

54
  // Overrides
55
  bool load(const QJsonObject &complexObject, int sequenceNumber,
56 57 58 59
            QString &errorString) override final;
  QString mapVisualQML(void) const override final;
  void save(QJsonArray &planItems) override final;
  bool specifiesCoordinate(void) const override final;
60
  void appendMissionItems(QList<MissionItem *> &items,
61 62 63 64 65 66 67 68
                          QObject *missionItemParent) override final;
  void applyNewAltitude(double newAltitude) override final;
  double timeBetweenShots(void) override final;
  QString commandDescription(void) const override final;
  QString commandName(void) const override final;
  QString abbreviation(void) const override final;
  bool readyForSave(void) const override final;
  double additionalTimeDelay(void) const override final;
69

Valentin Platzgummer's avatar
Valentin Platzgummer committed
70 71 72 73 74 75 76 77
  // Generator
  bool registerGenerator(const QString &name, std::shared_ptr<GeneratorBase> g);
  bool unregisterGenerator(const QString &name);
  bool unregisterGenerator(int index);
  Q_INVOKABLE bool switchToGenerator(const QString &name);
  Q_INVOKABLE bool switchToGenerator(int index);
  QList<QString> generatorNameList();

78
  static const char *settingsGroup;
79
  static const char *typeName;
80
  static const char *variantName;
81 82 83 84
  static const char *CircularSurveyName;

signals:
  void calculatingChanged();
85
  void variantNamesChanged();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
86 87
  void generatorNameListChanged();
  void generatorChanged();
88 89 90 91 92 93

private slots:
  // Overrides from TransectStyleComplexItem
  void _rebuildTransectsPhase1(void) final;
  void _recalcComplexDistance(void) final;
  void _recalcCameraShots(void) final;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
94 95

  // Worker functions.
96
  void _setTransects(PtrRoutingData pRoute);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
97 98 99 100 101
  void _changeVariant();
  void _updateWorker();
  void _changeVariantWorker();
  void _reverseWorker();
  void _storeWorker();
102 103 104 105 106 107

private:
  void _appendLoadedMissionItems(QList<MissionItem *> &items,
                                 QObject *missionItemParent);
  void _buildAndAppendMissionItems(QList<MissionItem *> &items,
                                   QObject *missionItemParent);
108

Valentin Platzgummer's avatar
Valentin Platzgummer committed
109 110 111 112 113 114 115 116 117 118 119
  bool _switchToGenerator(const PtrGenerator &newG);

  // State.
  enum class STATE {
    IDLE,
    STORE,
    REVERSE,
    VARIANT_CHANGE,
    RUN_CHANGE,
  };
  STATE _state;
120 121 122

  // center of the circular lanes, e.g. base station
  QMap<QString, FactMetaData *> _metaDataMap;
123
  SettingsFact _type;
124 125
  SettingsFact _variant;
  QList<QString> _variantNames;
126

127
  // Area data
Valentin Platzgummer's avatar
Valentin Platzgummer committed
128 129 130 131 132 133
  std::shared_ptr<WimaAreaData> _areaData;

  // Generators
  QList<PtrGenerator> _generatorList;
  QList<QString> _generatorNameList;
  PtrGenerator _pGenerator;
134

135
  // Worker
136
  using PtrWorker = std::shared_ptr<RoutingThread>;
137
  PtrWorker _pWorker;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
138
  PtrRoutingData _pRoutingData; // remove this, not necessary.
139

140
  // Routing data.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
141 142
  using Variant = Transects;
  QVector<Variant> _variantVector;
143
};