Skip to content
Snippets Groups Projects
WimaController.h 13.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • #pragma once
    
    
    #include <QObject>
    
    #include "QGCMapPolygon.h"
    #include "QmlObjectListModel.h"
    
    #include "WimaArea.h"
    
    #include "WimaMeasurementArea.h"
    
    #include "WimaServiceArea.h"
    
    Valentin Platzgummer's avatar
    Valentin Platzgummer committed
    #include "WimaCorridor.h"
    
    #include "WimaDataContainer.h"
    
    #include "WimaMeasurementAreaData.h"
    #include "WimaCorridorData.h"
    #include "WimaServiceAreaData.h"
    
    
    #include "PlanMasterController.h"
    #include "MissionController.h"
    
    #include "SurveyComplexItem.h"
    
    #include "SimpleMissionItem.h"
    #include "MissionSettingsItem.h"
    
    #include "JsonHelper.h"
    #include "QGCApplication.h"
    
    #include "SettingsFact.h"
    
    
    class WimaController : public QObject
    {
    
        enum FileType {WimaFile, PlanFile};
    
    
    public:
    
        WimaController(QObject *parent = nullptr);
    
    
    
        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(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(WimaDataContainer*       dataContainer           READ dataContainer          WRITE setDataContainer          NOTIFY dataContainerChanged)
        Q_PROPERTY(QmlObjectListModel*      missionItems            READ missionItems                                           NOTIFY missionItemsChanged)
        Q_PROPERTY(QmlObjectListModel*      currentMissionItems     READ currentMissionItems                                    NOTIFY currentMissionItemsChanged)
        Q_PROPERTY(QVariantList             waypointPath            READ waypointPath                                           NOTIFY waypointPathChanged)
        Q_PROPERTY(QVariantList             currentWaypointPath     READ currentWaypointPath                                    NOTIFY currentWaypointPathChanged)
        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)
    
        Q_PROPERTY(Fact*                    flightSpeed             READ flightSpeed                                            CONSTANT)
        Q_PROPERTY(Fact*                    altitude                READ altitude                                               CONSTANT)
    
        Q_PROPERTY(bool                     uploadOverrideRequired  READ uploadOverrideRequired WRITE setUploadOverrideRequired NOTIFY uploadOverrideRequiredChanged)
    
        Q_PROPERTY(double                   phaseDistance           READ phaseDistance                                          NOTIFY phaseDistanceChanged)
        Q_PROPERTY(double                   phaseDuration           READ phaseDuration                                          NOTIFY phaseDurationChanged)
    
        Q_PROPERTY(bool                     vehicleHasLowBattery    READ vehicleHasLowBattery                                   NOTIFY vehicleHasLowBatteryChanged)
    
    
    
        // Property accessors
    
        PlanMasterController*       masterController       (void)          { return _masterController; }
        MissionController*          missionController      (void)          { return _missionController; }
    
        QmlObjectListModel*         visualItems            (void);
    
        QString                     currentFile            (void) const    { return _currentFile; }
    
    Valentin Platzgummer's avatar
    Valentin Platzgummer committed
        QStringList                 loadNameFilters        (void) const;
    
        QStringList                 saveNameFilters        (void) const;
    
        QString                     fileExtension          (void) const    { return wimaFileExtension; }
    
    Valentin Platzgummer's avatar
    Valentin Platzgummer committed
        QGCMapPolygon               joinedArea             (void) const;
    
        WimaDataContainer*          dataContainer          (void);
    
        QmlObjectListModel*         missionItems           (void);
    
        QmlObjectListModel*         currentMissionItems    (void);
    
        QVariantList                waypointPath           (void);
    
        QVariantList                currentWaypointPath    (void);
    
        Fact*                       enableWimaController   (void);
        Fact*                       overlapWaypoints       (void);
        Fact*                       maxWaypointsPerPhase   (void);
        Fact*                       startWaypointIndex     (void);
    
        Fact*                       showAllMissionItems    (void);
        Fact*                       showCurrentMissionItems(void);
    
        Fact*                       flightSpeed            (void);
        Fact*                       altitude               (void);
    
        double                      phaseDistance          (void) const;
        double                      phaseDuration          (void) const;
    
        bool                        vehicleHasLowBattery   (void) const;
    
    
    
        // Property setters
        void setMasterController        (PlanMasterController* masterController);
        void setMissionController       (MissionController* missionController);
    
        void setDataContainer           (WimaDataContainer* container);
    
        void setUploadOverrideRequired  (bool overrideRequired);
    
        Q_INVOKABLE void nextPhase();
    
        Q_INVOKABLE void previousPhase();
        Q_INVOKABLE void resetPhase();
    
        Q_INVOKABLE bool uploadToVehicle();
    
        Q_INVOKABLE void removeFromVehicle();    
        Q_INVOKABLE bool checkSmartRTLPreCondition(); // wrapper for _checkSmartRTLPreCondition(QString &errorString)
        Q_INVOKABLE bool calcReturnPath(); // wrapper for _calcReturnPath(QString &errorSring)
    
    
        Q_INVOKABLE void saveToCurrent  ();
        Q_INVOKABLE void saveToFile     (const QString& filename);
    
        Q_INVOKABLE bool loadFromCurrent();
    
        Q_INVOKABLE bool loadFromFile   (const QString& filename);
    
        // static Members
        static const char* wimaFileExtension;
    
        static const char* areaItemsName;
    
        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;
    
        static const char* flightSpeedName;
        static const char* altitudeName;
    
    
        // Member Methodes
    
        QJsonDocument saveToJson(FileType fileType);
    
        bool calcShortestPath(const QGeoCoordinate &start, const QGeoCoordinate &destination, QList<QGeoCoordinate> &path);
        /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList
        bool extractCoordinateList(QmlObjectListModel &missionItems, QList<QGeoCoordinate> &coordinateList);
        /// extracts the coordinates (between startIndex and endIndex) stored in missionItems (list of MissionItems) and stores them in coordinateList.
        bool extractCoordinateList(QmlObjectListModel &missionItems, QList<QGeoCoordinate> &coordinateList, int startIndex, int endIndex);
        /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList
        bool extractCoordinateList(QmlObjectListModel &missionItems, QVariantList &coordinateList);
        /// extracts the coordinates (between startIndex and endIndex) stored in missionItems (list of MissionItems) and stores them in coordinateList.
        bool extractCoordinateList(QmlObjectListModel &missionItems, QVariantList &coordinateList, int startIndex, int endIndex);
    
    
    signals:
    
        void masterControllerChanged        (void);
        void missionControllerChanged       (void);
        void visualItemsChanged             (void);
    
        void currentFileChanged             ();
    
        void dataContainerChanged           ();
    
        void readyForSaveSendChanged        (bool ready);
    
        void missionItemsChanged            (void);
    
        void currentMissionItemsChanged     (void);
    
        void waypointPathChanged            (void);
    
        void currentWaypointPathChanged     (void);
    
        void phaseDistanceChanged           (void);
        void phaseDurationChanged           (void);
    
        void uploadAndExecuteConfirmRequired(void);
        void vehicleHasLowBatteryChanged    (void);
        void returnBatteryLowConfirmRequired(void);
    
        bool fetchContainerData();
        bool calcNextPhase(void);
    
        void updateWaypointPath                 (void);
    
        void updateCurrentPath                  (void);
    
        void updateNextWaypoint                 (void);
    
        void recalcCurrentPhase                 (void);
    
        bool setTakeoffLandPosition             (void);
        void updateSpeed                        (void);
        void updateAltitude                     (void);
    
        void checkBatteryLevel                  (void);
    
    
    private:
        void _setPhaseDistance(double distance);
        void _setPhaseDuration(double duration);
    
        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);
    
    
    
    
        PlanMasterController   *_masterController;
        MissionController      *_missionController;
        QString                 _currentFile; // file for saveing
        WimaDataContainer      *_container; // container for data exchange with WimaController
        QmlObjectListModel      _visualItems; // contains all visible areas
    
        WimaJoinedAreaData      _joinedArea; // joined area fromed by opArea, serArea, _corridor
    
        WimaMeasurementAreaData _measurementArea; // measurement area
        WimaServiceAreaData     _serviceArea; // area for supplying
        WimaCorridorData        _corridor; // corridor connecting opArea and serArea
        bool                    _localPlanDataValid;
    
        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
    
        QVariantList            _waypointPath; // path connecting the items in _missionItems
        QVariantList            _currentWaypointPath; // path connecting the items in _currentMissionItems
    
    
        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
    
        SettingsFact                 _nextPhaseStartWaypointIndex; // index (displayed on the map, -1 to get index of item in _missionItems) of the mission item
    
                                                          // defining the first element of the next phase
    
        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.
    
        SettingsFact                 _flightSpeed; // mission flight speed
        SettingsFact                 _altitude; // mission altitude
    
    
        int                          _endWaypointIndex; // indes of the mission item stored in _missionItems defining the last element
                                                        // (which is not part of the return path) of _currentMissionItem
    
        int                          _startWaypointIndex; // indes of the mission item stored in _missionItems defining the first element
                                                          // (which is not part of the arrival path) of _currentMissionItem
    
        bool                         _lastMissionPhaseReached;
    
        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.
    
        double                       _phaseDistance; // the lenth in meters of the current phase
        double                       _phaseDuration; // the phase duration in seconds
    
    
        QTimer                       _checkBatteryTimer;
        bool                         _vehicleHasLowBattery;
        bool                         _lowBatteryHandlingTriggered;