PlanMasterController.h 6.56 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#pragma once

#include <QObject>

#include "MissionController.h"
#include "GeoFenceController.h"
#include "RallyPointController.h"
#include "Vehicle.h"
#include "MultiVehicleManager.h"
DonLakeFlyer's avatar
DonLakeFlyer committed
19 20 21
#include "QGCLoggingCategory.h"

Q_DECLARE_LOGGING_CATEGORY(PlanMasterControllerLog)
22 23 24 25 26 27 28 29 30 31 32 33 34 35

/// Master controller for mission, fence, rally
class PlanMasterController : public QObject
{
    Q_OBJECT
    
public:
    PlanMasterController(QObject* parent = NULL);
    ~PlanMasterController();
    
    Q_PROPERTY(MissionController*       missionController       READ missionController      CONSTANT)
    Q_PROPERTY(GeoFenceController*      geoFenceController      READ geoFenceController     CONSTANT)
    Q_PROPERTY(RallyPointController*    rallyPointController    READ rallyPointController   CONSTANT)

36 37 38 39 40
    Q_PROPERTY(Vehicle*     controllerVehicle   MEMBER _controllerVehicle               CONSTANT)
    Q_PROPERTY(bool         offline             READ offline                            NOTIFY offlineEditingChanged)   ///< true: controller is not connected to an active vehicle
    Q_PROPERTY(bool         containsItems       READ containsItems                      NOTIFY containsItemsChanged)    ///< true: Elemement is non-empty
    Q_PROPERTY(bool         syncInProgress      READ syncInProgress                     NOTIFY syncInProgressChanged)   ///< true: Information is currently being saved/sent, false: no active save/send in progress
    Q_PROPERTY(bool         dirty               READ dirty              WRITE setDirty  NOTIFY dirtyChanged)            ///< true: Unsaved/sent changes are present, false: no changes since last save/send
Patrick José Pereira's avatar
Patrick José Pereira committed
41
    Q_PROPERTY(QString      fileExtension       READ fileExtension                      CONSTANT)                       ///< File extension for missions
42 43
    Q_PROPERTY(QString      kmlFileExtension    READ kmlFileExtension                   CONSTANT)
    ///< kml file extension for missions
44 45
    Q_PROPERTY(QStringList  loadNameFilters     READ loadNameFilters                    CONSTANT)                       ///< File filter list loading plan files
    Q_PROPERTY(QStringList  saveNameFilters     READ saveNameFilters                    CONSTANT)                       ///< File filter list saving plan files
46
    Q_PROPERTY(QStringList  saveKmlFilters      READ saveKmlFilters                     CONSTANT)                       ///< File filter list saving KML files
47 48 49

    /// Should be called immediately upon Component.onCompleted.
    ///     @param editMode true: controller being used in Plan view, false: controller being used in Fly view
50
    Q_INVOKABLE void start(bool editMode);
51 52

    /// Starts the controller using a single static active vehicle. Will not track global active vehicle changes.
53 54 55 56 57
    Q_INVOKABLE void startStaticActiveVehicle(Vehicle* vehicle);

    /// Determines if the plan has all data needed to be saved or sent to the vehicle. Currently the only case where this
    /// would return false is when it is still waiting on terrain data to determine correct altitudes.
    Q_INVOKABLE bool readyForSaveSend(void) const { return _missionController.readyForSaveSend(); }
58 59 60 61 62 63 64 65 66 67

    /// Sends a plan to the specified file
    ///     @param[in] vehicle Vehicle we are sending a plan to
    ///     @param[in] filename Plan file to load
    static void sendPlanToVehicle(Vehicle* vehicle, const QString& filename);

    Q_INVOKABLE void loadFromVehicle(void);
    Q_INVOKABLE void sendToVehicle(void);
    Q_INVOKABLE void loadFromFile(const QString& filename);
    Q_INVOKABLE void saveToFile(const QString& filename);
68
    Q_INVOKABLE void saveToKml(const QString& filename);
69 70 71 72 73 74 75
    Q_INVOKABLE void removeAll(void);                       ///< Removes all from controller only, synce required to remove from vehicle
    Q_INVOKABLE void removeAllFromVehicle(void);            ///< Removes all from vehicle and controller

    MissionController*      missionController(void)     { return &_missionController; }
    GeoFenceController*     geoFenceController(void)    { return &_geoFenceController; }
    RallyPointController*   rallyPointController(void)  { return &_rallyPointController; }

76
    bool        offline         (void) const { return _offline; }
77
    bool        containsItems   (void) const;
DonLakeFlyer's avatar
DonLakeFlyer committed
78
    bool        syncInProgress  (void) const { return _syncInProgress; }
79 80 81
    bool        dirty           (void) const;
    void        setDirty        (bool dirty);
    QString     fileExtension   (void) const;
82
    QString     kmlFileExtension(void) const;
83 84
    QStringList loadNameFilters (void) const;
    QStringList saveNameFilters (void) const;
85
    QStringList saveKmlFilters  (void) const;
86

Gus Grubba's avatar
Gus Grubba committed
87 88
    QJsonDocument saveToJson    ();

89 90
    Vehicle* controllerVehicle(void) { return _controllerVehicle; }
    Vehicle* managerVehicle(void) { return _managerVehicle; }
91 92 93 94 95 96

signals:
    void containsItemsChanged   (bool containsItems);
    void syncInProgressChanged  (bool syncInProgress);
    void dirtyChanged           (bool dirty);
    void vehicleChanged         (Vehicle* vehicle);
97
    void offlineEditingChanged  (bool offlineEditing);
98 99 100

private slots:
    void _activeVehicleChanged(Vehicle* activeVehicle);
DonLakeFlyer's avatar
DonLakeFlyer committed
101 102 103 104 105 106
    void _loadMissionComplete(void);
    void _loadGeoFenceComplete(void);
    void _loadRallyPointsComplete(void);
    void _sendMissionComplete(void);
    void _sendGeoFenceComplete(void);
    void _sendRallyPointsComplete(void);
107 108

private:
DonLakeFlyer's avatar
DonLakeFlyer committed
109 110
    void _showPlanFromManagerVehicle(void);

111
    MultiVehicleManager*    _multiVehicleMgr;
112 113
    Vehicle*                _controllerVehicle; ///< Offline controller vehicle
    Vehicle*                _managerVehicle;    ///< Either active vehicle or _controllerVehicle if none
114
    bool                    _editMode;
115
    bool                    _offline;
116 117 118
    MissionController       _missionController;
    GeoFenceController      _geoFenceController;
    RallyPointController    _rallyPointController;
119 120 121 122
    bool                    _loadGeoFence;
    bool                    _loadRallyPoints;
    bool                    _sendGeoFence;
    bool                    _sendRallyPoints;
DonLakeFlyer's avatar
DonLakeFlyer committed
123
    bool                    _syncInProgress;
124 125 126 127 128 129 130

    static const int    _planFileVersion;
    static const char*  _planFileType;
    static const char*  _jsonMissionObjectKey;
    static const char*  _jsonGeoFenceObjectKey;
    static const char*  _jsonRallyPointsObjectKey;
};