WimaPlaner.h 6.64 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
#pragma once

#include "QmlObjectListModel.h"
#include <QObject>
#include <QScopedPointer>
#include <QSharedPointer>

#include "Geometry/WimaCorridor.h"
#include "Geometry/WimaCorridorData.h"
#include "Geometry/WimaJoinedArea.h"
#include "Geometry/WimaJoinedAreaData.h"
#include "Geometry/WimaMeasurementArea.h"
#include "Geometry/WimaMeasurementAreaData.h"
#include "Geometry/WimaServiceArea.h"
#include "Geometry/WimaServiceAreaData.h"
#include "WimaPlanData.h"

#include "Snake/NemoInterface.h"

#include "JsonHelper.h"

class MissionController;
class PlanMasterController;

namespace wima_planer_detail {
class WimaStateMachine;
}

class WimaPlaner : public QObject {
  Q_OBJECT

  enum FileType { WimaFile, PlanFile };

public:
  WimaPlaner(QObject *parent = nullptr);
  ~WimaPlaner();
  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)
  Q_PROPERTY(NemoInterface *nemoInterface READ nemoInterface CONSTANT)
  Q_PROPERTY(bool synchronized READ synchronized NOTIFY synchronizedChanged)
  Q_PROPERTY(bool needsUpdate READ needsUpdate NOTIFY needsUpdateChanged)
  Q_PROPERTY(bool readyForSynchronization READ readyForSynchronization NOTIFY
                 readyForSynchronizationChanged)
  Q_PROPERTY(bool surveyReady READ surveyReady NOTIFY surveyReadyChanged)
  Q_PROPERTY(bool progressLocked READ progressLocked WRITE setProgressLocked
                 NOTIFY progressLockedChanged)

  // Property accessors
  PlanMasterController *masterController(void);
  MissionController *missionController(void);
  QmlObjectListModel *visualItems(void);
  int currentPolygonIndex(void) const;
  QString currentFile(void) const;
  QStringList loadNameFilters(void) const;
  QStringList saveNameFilters(void) const;
  QString fileExtension(void) const;
  QGeoCoordinate joinedAreaCenter(void) const;
  NemoInterface *nemoInterface(void);
  bool synchronized();
  bool needsUpdate();
  bool readyForSynchronization();
  bool surveyReady();
  bool progressLocked();

  // 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);
  void setProgressLocked(bool l);

  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.
  Q_INVOKABLE void update();
  /// Pushes the generated mission data to the wimaController.
  Q_INVOKABLE void synchronize();
  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;

signals:
  void masterControllerChanged(void);
  void missionControllerChanged(void);
  void visualItemsChanged(void);
  void currentPolygonIndexChanged(int index);
  void currentFileChanged();
  void wimaBridgeChanged();
  void synchronizedChanged(void);
  void needsUpdateChanged(void);
  void readyForSynchronizationChanged(void);
  void surveyReadyChanged(void);
  void progressLockedChanged();

private slots:
  void updatePolygonInteractivity(int index);
  void _update();
  void CSDestroyedHandler();
  void CSVisualTransectPointsChangedHandler();
  void mAreaPathChangedHandler();
  void mAreaTilesChangedHandler();
  void mAreaProgressChangedHandler();
  void mAreaProgressAcceptedHandler();
  void mAreaReadyChangedHandler();
  void sAreaPathChangedHandler();
  void corridorPathChangedHandler();
  void depotChangedHandler();
  void missionControllerVisualItemsChangedHandler();
  void missionControllerWaypointPathChangedHandler();
  void missionControllerNewItemsFromVehicleHandler();
  void missionControllerMissionItemCountChangedHandler();
  void nemoInterfaceProgressChangedHandler();

#ifndef NDEBUG
  void autoLoadMission(void);
#endif

private:
signals:
  void joinedAreaValidChanged();
  void stateChanged();

private:
  // Member Functions
  bool toPlanData(AreaData &planData);
  bool shortestPath(const QGeoCoordinate &start,
                    const QGeoCoordinate &destination,
                    QVector<QGeoCoordinate> &path);
  void setSynchronized(bool s);
  void enableAreaMonitoring();
  void disableAreaMonitoring();
  void enableMissionControllerMonitoring();
  void disableMissionControllerMonitoring();
  bool areasMonitored();
  bool missionControllerMonitored();

  // Member Variables
  PlanMasterController *_masterController;
  MissionController *_missionController;
  int _currentAreaIndex;
  QString _currentFile;

  WimaMeasurementArea _measurementArea;
  WimaServiceArea _serviceArea;
  WimaCorridor _corridor;
  WimaJoinedArea _joinedArea;
  QmlObjectListModel _visualItems; // all areas

  CircularSurvey *_survey;

#ifndef NDEBUG
  QTimer _autoLoadTimer; // timer to auto load mission after some time, prevents
                         // seg. faults
#endif

  NemoInterface _nemoInterface;

  // State
  QScopedPointer<wima_planer_detail::WimaStateMachine> _stateMachine;
  bool _areasMonitored;
  bool _missionControllerMonitored;
  bool _progressLocked;
  bool _synchronized; // true if planData is synchronized with
                      // wimaController
};