WimaController.h 22.5 KB
Newer Older
1
#pragma once
2 3

#include <QObject>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
4 5
#include <QScopedPointer>

6
#include "QGCMapPolygon.h"
7
#include "QmlObjectListModel.h"
8 9

#include "WimaArea.h"
10
#include "WimaMeasurementArea.h"
11
#include "WimaServiceArea.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
12
#include "WimaCorridor.h"
13
#include "WimaDataContainer.h"
14 15 16
#include "WimaMeasurementAreaData.h"
#include "WimaCorridorData.h"
#include "WimaServiceAreaData.h"
17 18 19

#include "PlanMasterController.h"
#include "MissionController.h"
20
#include "SurveyComplexItem.h"
21 22
#include "SimpleMissionItem.h"
#include "MissionSettingsItem.h"
23 24
#include "JsonHelper.h"
#include "QGCApplication.h"
25
#include "SettingsFact.h"
26 27
#include "WimaSettings.h"
#include "SettingsManager.h"
28

Valentin Platzgummer's avatar
Valentin Platzgummer committed
29
#include "snake.h"
30
#include "SnakeWorker.h"
31 32
#include "SnakeTiles.h"
#include "SnakeTilesLocal.h"
33
#include "GeoPoint3D.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
34
#include "QNemoProgress.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
35

Valentin Platzgummer's avatar
Valentin Platzgummer committed
36 37
#include "ros_bridge/include/ROSBridge.h"

Valentin Platzgummer's avatar
Valentin Platzgummer committed
38 39
#define CHECK_BATTERY_INTERVAL 1000 // ms
#define SMART_RTL_MAX_ATTEMPTS 3 // times
40
#define SMART_RTL_ATTEMPT_INTERVAL 200 // ms
Valentin Platzgummer's avatar
Valentin Platzgummer committed
41
#define EVENT_TIMER_INTERVAL 50 // ms
42
#define SNAKE_EVENT_LOOP_INTERVAL 5000 // ms
43

44

Valentin Platzgummer's avatar
Valentin Platzgummer committed
45 46
using namespace snake;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
47 48
typedef std::unique_ptr<rapidjson::Document> JsonDocUPtr;

49 50
class WimaController : public QObject
{
51 52
    Q_OBJECT

53 54
    enum FileType {WimaFile, PlanFile};

Valentin Platzgummer's avatar
Valentin Platzgummer committed
55 56
    typedef QScopedPointer<ROSBridge::ROSBridge> ROSBridgePtr;

57
public:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
58 59 60 61

    enum SnakeConnectionStatus {Connected = 1, NotConnected = 0};


62 63 64
    WimaController(QObject *parent = nullptr);


65 66
    Q_PROPERTY(PlanMasterController*    masterController        READ masterController       WRITE setMasterController       NOTIFY masterControllerChanged)
    Q_PROPERTY(MissionController*       missionController       READ missionController      WRITE setMissionController      NOTIFY missionControllerChanged)
67
    Q_PROPERTY(QmlObjectListModel*      visualItems             READ visualItems                                            NOTIFY visualItemsChanged)
68 69 70 71
//    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)
72
    Q_PROPERTY(WimaDataContainer*       dataContainer           READ dataContainer          WRITE setDataContainer          NOTIFY dataContainerChanged)
73 74
    Q_PROPERTY(QmlObjectListModel*      missionItems            READ missionItems                                           NOTIFY missionItemsChanged)
    Q_PROPERTY(QmlObjectListModel*      currentMissionItems     READ currentMissionItems                                    NOTIFY currentMissionItemsChanged)
75
    Q_PROPERTY(QVariantList             waypointPath            READ waypointPath                                           NOTIFY waypointPathChanged)
76
    Q_PROPERTY(QVariantList             currentWaypointPath     READ currentWaypointPath                                    NOTIFY currentWaypointPathChanged)
77 78 79 80 81 82
    Q_PROPERTY(Fact*                    enableWimaController    READ enableWimaController                                   CONSTANT)
    Q_PROPERTY(Fact*                    overlapWaypoints        READ overlapWaypoints                                       CONSTANT)
    Q_PROPERTY(Fact*                    maxWaypointsPerPhase    READ maxWaypointsPerPhase                                   CONSTANT)
    Q_PROPERTY(Fact*                    startWaypointIndex      READ startWaypointIndex                                     CONSTANT)
    Q_PROPERTY(Fact*                    showAllMissionItems     READ showAllMissionItems                                    CONSTANT)
    Q_PROPERTY(Fact*                    showCurrentMissionItems READ showCurrentMissionItems                                CONSTANT)
83 84
    Q_PROPERTY(Fact*                    flightSpeed             READ flightSpeed                                            CONSTANT)
    Q_PROPERTY(Fact*                    altitude                READ altitude                                               CONSTANT)
85
    Q_PROPERTY(Fact*                    arrivalReturnSpeed      READ arrivalReturnSpeed                                     CONSTANT)
86
    Q_PROPERTY(Fact*                    reverse                 READ reverse                                                CONSTANT)
87
    Q_PROPERTY(bool                     uploadOverrideRequired  READ uploadOverrideRequired WRITE setUploadOverrideRequired NOTIFY uploadOverrideRequiredChanged)
88 89
    Q_PROPERTY(double                   phaseDistance           READ phaseDistance                                          NOTIFY phaseDistanceChanged)
    Q_PROPERTY(double                   phaseDuration           READ phaseDuration                                          NOTIFY phaseDurationChanged)
90
    Q_PROPERTY(bool                     vehicleHasLowBattery    READ vehicleHasLowBattery                                   NOTIFY vehicleHasLowBatteryChanged)
91

Valentin Platzgummer's avatar
Valentin Platzgummer committed
92
    // Snake
93 94 95 96 97 98 99 100 101 102
    Q_PROPERTY(Fact*                    enableSnake                 READ enableSnake                CONSTANT)
    Q_PROPERTY(long                     snakeConnectionStatus       READ snakeConnectionStatus      NOTIFY snakeConnectionStatusChanged)
    Q_PROPERTY(bool                     snakeCalcInProgress         READ snakeCalcInProgress        NOTIFY snakeCalcInProgressChanged)
    Q_PROPERTY(Fact*                    snakeTileWidth              READ snakeTileWidth             CONSTANT)
    Q_PROPERTY(Fact*                    snakeTileHeight             READ snakeTileHeight            CONSTANT)
    Q_PROPERTY(Fact*                    snakeMinTileArea            READ snakeMinTileArea           CONSTANT)
    Q_PROPERTY(Fact*                    snakeLineDistance           READ snakeLineDistance          CONSTANT)
    Q_PROPERTY(Fact*                    snakeMinTransectLength      READ snakeMinTransectLength     CONSTANT)
    Q_PROPERTY(QmlObjectListModel*      snakeTiles                  READ snakeTiles                 NOTIFY snakeTilesChanged)
    Q_PROPERTY(QVariantList             snakeTileCenterPoints       READ snakeTileCenterPoints      NOTIFY snakeTileCenterPointsChanged)
103
    Q_PROPERTY(QVector<int>             nemoProgress                READ nemoProgress               NOTIFY nemoProgressChanged)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
104

105 106 107


    // Property accessors
108 109 110
    PlanMasterController*       masterController       (void)           { return _masterController; }
    MissionController*          missionController      (void)           { return _missionController; }
    QmlObjectListModel*         visualItems            (void)           { return &_visualItems; }
111 112 113 114
//    QString                     currentFile            (void) const     { return _currentFile; }
//    QStringList                 loadNameFilters        (void) const;
//    QStringList                 saveNameFilters        (void) const;
//    QString                     fileExtension          (void) const     { return wimaFileExtension; }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
115
    QGCMapPolygon               joinedArea             (void) const;
116 117 118 119 120 121 122 123 124 125 126 127
    WimaDataContainer*          dataContainer          (void)           { return _container; }
    QmlObjectListModel*         missionItems           (void)           { return &_missionItems; }
    QmlObjectListModel*         currentMissionItems    (void)           { return &_currentMissionItems; }
    QVariantList                waypointPath           (void)           { return _waypointPath; }
    QVariantList                currentWaypointPath    (void)           { return _currentWaypointPath; }
    Fact*                       enableWimaController   (void)           { return &_enableWimaController; }
    Fact*                       overlapWaypoints       (void)           { return &_overlapWaypoints; }
    Fact*                       maxWaypointsPerPhase   (void)           { return &_maxWaypointsPerPhase; }
    Fact*                       startWaypointIndex     (void)           { return &_nextPhaseStartWaypointIndex; }
    Fact*                       showAllMissionItems    (void)           { return &_showAllMissionItems; }
    Fact*                       showCurrentMissionItems(void)           { return &_showCurrentMissionItems; }
    Fact*                       flightSpeed            (void)           { return &_flightSpeed; }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
128
    Fact*                       arrivalReturnSpeed     (void)           { return &_arrivalReturnSpeed; }
129 130 131 132 133 134 135 136 137
    Fact*                       altitude               (void)           { return &_altitude; }
    Fact*                       reverse                (void)           { return &_reverse; }

    Fact*                       enableSnake            (void)           { return &_enableSnake; }
    Fact*                       snakeTileWidth         (void)           { return &_snakeTileWidth;}
    Fact*                       snakeTileHeight        (void)           { return &_snakeTileHeight;}
    Fact*                       snakeMinTileArea       (void)           { return &_snakeMinTileArea;}
    Fact*                       snakeLineDistance      (void)           { return &_snakeLineDistance;}
    Fact*                       snakeMinTransectLength (void)           { return &_snakeMinTransectLength;}
138
    QmlObjectListModel*         snakeTiles             (void)           { return _snakeTiles.QmlObjectListModel();}
139
    QVariantList                snakeTileCenterPoints  (void)           { return _snakeTileCenterPoints;}
140
    QVector<int>                nemoProgress           (void)           { return _nemoProgress.progress();}
141

142
    bool                        uploadOverrideRequired (void) const;
143 144
    double                      phaseDistance          (void) const;
    double                      phaseDuration          (void) const;
145
    bool                        vehicleHasLowBattery   (void) const;
146

Valentin Platzgummer's avatar
Valentin Platzgummer committed
147 148 149
    long                        snakeConnectionStatus (void) const;
    bool                        snakeCalcInProgress   (void) const;

150 151 152 153

    // Property setters
    void setMasterController        (PlanMasterController* masterController);
    void setMissionController       (MissionController* missionController);
154
    void setDataContainer           (WimaDataContainer* container);
155
    void setUploadOverrideRequired  (bool overrideRequired);
156

157
    // Member Methodes
158
    Q_INVOKABLE void nextPhase();
159 160
    Q_INVOKABLE void previousPhase();
    Q_INVOKABLE void resetPhase();
161
    Q_INVOKABLE bool uploadToVehicle();
162
    Q_INVOKABLE bool forceUploadToVehicle();
163 164
    Q_INVOKABLE void removeFromVehicle();    
    Q_INVOKABLE bool checkSmartRTLPreCondition(); // wrapper for _checkSmartRTLPreCondition(QString &errorString)
165
    Q_INVOKABLE bool calcReturnPath(); // wrapper for _calcReturnPath(QString &errorSring)#
166 167
    Q_INVOKABLE void executeSmartRTL(); // wrapper for _executeSmartRTL(QString &errorSring)
    Q_INVOKABLE void initSmartRTL();
168
    Q_INVOKABLE void removeVehicleTrajectoryHistory();
169

170

171 172 173 174
//    Q_INVOKABLE void saveToCurrent  ();
//    Q_INVOKABLE void saveToFile     (const QString& filename);
//    Q_INVOKABLE bool loadFromCurrent();
//    Q_INVOKABLE bool loadFromFile   (const QString& filename);
175 176


177
    // static Members
178
//    static const char* wimaFileExtension;
179
    static const char* areaItemsName;
180 181 182 183 184 185 186 187 188
    static const char* missionItemsName;    
    static const char* settingsGroup;
    static const char* endWaypointIndexName;
    static const char* enableWimaControllerName;
    static const char* overlapWaypointsName;
    static const char* maxWaypointsPerPhaseName;
    static const char* startWaypointIndexName;
    static const char* showAllMissionItemsName;
    static const char* showCurrentMissionItemsName;
189
    static const char* flightSpeedName;
190
    static const char* arrivalReturnSpeedName;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
191
    static const char* altitudeName;
192
    static const char* reverseName;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
193 194 195 196 197
    static const char* snakeTileWidthName;
    static const char* snakeTileHeightName;
    static const char* snakeMinTileAreaName;
    static const char* snakeLineDistanceName;
    static const char* snakeMinTransectLengthName;
198 199

    // Member Methodes
200
    QJsonDocument saveToJson(FileType fileType);
201

202
    bool calcShortestPath(const QGeoCoordinate &start, const QGeoCoordinate &destination, QVector<QGeoCoordinate> &path);
203
    /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList
204
    bool extractCoordinateList(QmlObjectListModel &missionItems, QVector<QGeoCoordinate> &coordinateList);
205
    /// extracts the coordinates (between startIndex and endIndex) stored in missionItems (list of MissionItems) and stores them in coordinateList.
206
    bool extractCoordinateList(QmlObjectListModel &missionItems, QVector<QGeoCoordinate> &coordinateList, int startIndex, int endIndex);
207
    /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList
208
    bool extractCoordinateList(QmlObjectListModel &missionItems, QVariantList &coordinateList);
209
    /// extracts the coordinates (between startIndex and endIndex) stored in missionItems (list of MissionItems) and stores them in coordinateList.
210
    bool extractCoordinateList(QmlObjectListModel &missionItems, QVariantList &coordinateList, int startIndex, int endIndex);
211

212
signals:
213 214 215
    void masterControllerChanged            (void);
    void missionControllerChanged           (void);
    void visualItemsChanged                 (void);
216
//    void currentFileChanged                 ();
217 218 219 220 221 222 223 224 225 226 227 228
    void dataContainerChanged               ();
    void readyForSaveSendChanged            (bool ready);
    void missionItemsChanged                (void);
    void currentMissionItemsChanged         (void);
    void waypointPathChanged                (void);
    void currentWaypointPathChanged         (void);
    void uploadOverrideRequiredChanged      (void);
    void phaseDistanceChanged               (void);
    void phaseDurationChanged               (void);
    void vehicleHasLowBatteryChanged        (void);
    void returnBatteryLowConfirmRequired    (void);
    void returnUserRequestConfirmRequired   (void);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
229 230
    void snakeConnectionStatusChanged       (void);
    void snakeCalcInProgressChanged         (void);
231
    void snakeTilesChanged                  (void);
232
    void snakeTileCenterPointsChanged       (void);
233
    void nemoProgressChanged                (void);
234 235
private:
    enum SRTL_Reason {BatteryLow, UserRequest};
236
private slots:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
    bool _fetchContainerData();
    bool _calcNextPhase(void);
    void _updateWaypointPath                 (void);
    void _updateCurrentPath                  (void);
    void _updateNextWaypoint                 (void);
    void _recalcCurrentPhase                 (void);
    bool _setTakeoffLandPosition             (void);
    void _updateflightSpeed                  (void);
    void _updateArrivalReturnSpeed           (void);
    void _updateAltitude                     (void);
    void _checkBatteryLevel                  (void);
    void _eventTimerHandler                  (void);
    void _smartRTLCleanUp                    (bool flying); // cleans up after successfull smart RTL
    void _enableDisableLowBatteryHandling    (QVariant enable);
    void _reverseChangedHandler              ();
    void _initSmartRTL                       ();
    void _executeSmartRTL                    ();
    void _setSnakeConnectionStatus           (SnakeConnectionStatus status);
    void _setSnakeCalcInProgress             (bool inProgress);
    bool _verifyScenarioDefined                    (void);
    bool _verifyScenarioDefinedWithErrorMessage    (void);
258
    void _snakeStoreWorkerResults            ();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
259
    void _startStopRosBridge                 ();
260
    void _initStartSnakeWorker               ();
261 262 263 264

private:
    void _setPhaseDistance(double distance);
    void _setPhaseDuration(double duration);
265 266 267
    bool _checkSmartRTLPreCondition(QString &errorString); // should be called from gui, befor calcReturnPath()
    bool _calcReturnPath(QString &errorSring); // Calculates return path (destination: service area center) for a flying vehicle
    void _setVehicleHasLowBattery(bool batteryLow);
268 269
    void _loadCurrentMissionItemsFromBuffer();
    void _saveCurrentMissionItemsToBuffer();
270

271 272 273
    void _progressFromJson(JsonDocUPtr pDoc,
                           QNemoProgress &progress);

274 275
    PlanMasterController   *_masterController;
    MissionController      *_missionController;
276
//    QString                 _currentFile; // file for saveing
277
    WimaDataContainer      *_container; // container for data exchange with WimaController
278
    QmlObjectListModel      _visualItems; // contains all visible areas
279
    WimaJoinedAreaData      _joinedArea; // joined area fromed by opArea, serArea, _corridor
280 281 282 283
    WimaMeasurementAreaData _measurementArea; // measurement area
    WimaServiceAreaData     _serviceArea; // area for supplying
    WimaCorridorData        _corridor; // corridor connecting opArea and serArea
    bool                    _localPlanDataValid;
284 285 286 287
    QmlObjectListModel      _missionItems; // all mission itmes (Mission Items) generaded by wimaPlaner, displayed in flightView
    QmlObjectListModel      _currentMissionItems; // contains the current mission items, which are a sub set of _missionItems,
                                                  // _currentMissionItems contains a number of mission items which can be worked off with a single battery chrage
    QmlObjectListModel      _missionItemsBuffer; // Buffer to store mission items, e.g. for storing _currentMissionItems when smartRTL() is invoked
288
    QVariantList            _waypointPath; // path connecting the items in _missionItems
289
    QVariantList            _currentWaypointPath; // path connecting the items in _currentMissionItems
290
    QGeoCoordinate          _takeoffLandPostion;
291

292 293 294 295 296

    QMap<QString, FactMetaData*> _metaDataMap;
    SettingsFact                 _enableWimaController; // enables or disables the wimaControler
    SettingsFact                 _overlapWaypoints; // determines the number of overlapping waypoints between two consecutive mission phases
    SettingsFact                 _maxWaypointsPerPhase; // determines the maximum number waypoints per phase
297
    SettingsFact                 _nextPhaseStartWaypointIndex; // index (displayed on the map, -1 to get index of item in _missionItems) of the mission item
298
                                                      // defining the first element of the next phase
299 300
    SettingsFact                 _showAllMissionItems; // bool value, Determines whether the mission items of the overall mission are displayed or not.
    SettingsFact                 _showCurrentMissionItems; // bool value, Determines whether the mission items of the current mission phase are displayed or not.
301
    SettingsFact                 _flightSpeed; // mission flight speed
302
    SettingsFact                 _arrivalReturnSpeed; // arrival and return path speed
303
    SettingsFact                 _altitude; // mission altitude
304
    SettingsFact                 _reverse; // Reverses the phase direction. Phases go from high to low waypoint numbers, if true.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
305
    SettingsFact                 _enableSnake; // Enable Snake (see snake.h)
306

307
    int                          _endWaypointIndex; // index of the mission item stored in _missionItems defining the last element
308
                                                    // (which is not part of the return path) of _currentMissionItem
309
    int                          _startWaypointIndex; // index of the mission item stored in _missionItems defining the first element
310
                                                      // (which is not part of the arrival path) of _currentMissionItem
311 312
    bool                         _uploadOverrideRequired; // Is set to true if uploadToVehicle() did not suceed because the vehicle is not inside the service area.
                                                          // The user can override the upload lock with a slider, this will reset this variable to false.
313 314 315
    double                       _measurementPathLength; // the lenght of the phase in meters
    double                       _arrivalPathLength; // the length of the arrival and return path in meters
    double                       _returnPathLength; // the length of the arrival and return path in meters
316 317
    double                       _phaseDistance; // the lenth in meters of the current phase
    double                       _phaseDuration; // the phase duration in seconds
318 319
    double                       _phaseDistanceBuffer; // buffer for storing _phaseDistance when doing smart RTL
    double                       _phaseDurationBuffer; // buffer for storing _phaseDuration when doing smart RTL
320

Valentin Platzgummer's avatar
Valentin Platzgummer committed
321
    QTimer                       _eventTimer;
322 323 324
    QTimer                       _smartRTLAttemptTimer;
    SRTL_Reason                  _srtlReason;

325 326
    bool                         _vehicleHasLowBattery;
    bool                         _lowBatteryHandlingTriggered;
327 328
    bool                         _executingSmartRTL;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
329 330 331 332 333 334 335 336 337 338 339 340
    // Snake
    SnakeConnectionStatus        _snakeConnectionStatus;
    bool                         _snakeCalcInProgress;
    bool                         _snakeRecalcNecessary;
    bool                         _scenarioDefinedBool;
    SnakeWorker                  _snakeWorker;
    Scenario                     _scenario;
    SettingsFact                 _snakeTileWidth;
    SettingsFact                 _snakeTileHeight;
    SettingsFact                 _snakeMinTileArea;
    SettingsFact                 _snakeLineDistance;
    SettingsFact                 _snakeMinTransectLength;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
341
    ::GeoPoint3D                 _snakeOrigin;
342
    SnakeTiles                   _snakeTiles; // tiles
343
    SnakeTilesLocal              _snakeTilesLocal; // tiles local coordinate system
344
    QVariantList                 _snakeTileCenterPoints;
345
    QNemoProgress                _nemoProgress; // measurement progress
Valentin Platzgummer's avatar
Valentin Platzgummer committed
346

Valentin Platzgummer's avatar
Valentin Platzgummer committed
347
    ROSBridgePtr                 _pRosBridge;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
348

349
};
350

351 352
/*
 * The following explains the structure of
Valentin Platzgummer's avatar
Valentin Platzgummer committed
353
 * _missionController.visualItems().
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
 *
 * Index        Description
 * --------------------------------------------
 * 0            MissionSettingsItem
 * 1            Takeoff Command
 * 2            Speed Command: arrivalReturnSpeed
 * 3            Arrival Path Waypoint 0
 * ...
 * 3+n-1        Arrival Path Waypoint n-1
 * 3+n          Speed Command: flightSpeed
 * 3+n+1        Circular Survey Waypoint 0
 * ...
 * 3+n+m        Circular Survey Waypoint m-1
 * 3+n+m+1      Speed Command: arrivalReturnSpeed
 * 3+n+m+2      Return Path Waypoint 0
 * ...
 * 3+n+m+2+l    Return Path Waypoint l-1
 * 3+n+m+2+l+1  Land command
 *
373 374 375
 * _currentMissionItems is equal to
 * _missionController.visualItems() except that it
 * is missing the MissionSettingsItem
376 377
 */

378