Skip to content
Snippets Groups Projects
LinkManager.h 10.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (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.
     *
     ****************************************************************************/
    
    /// @file
    ///     @author Lorenz Meier <mavteam@student.ethz.ch>
    
    pixhawk's avatar
    pixhawk committed
    
    #ifndef _LINKMANAGER_H_
    #define _LINKMANAGER_H_
    
    #include <QList>
    
    #include <QMultiMap>
    
    #include "LinkInterface.h"
    
    Don Gagne's avatar
    Don Gagne committed
    #include "QGCLoggingCategory.h"
    
    #include "QGCToolbox.h"
    
    Don Gagne's avatar
    Don Gagne committed
    #include "ProtocolInterface.h"
    #include "MAVLinkProtocol.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    Don Gagne's avatar
    Don Gagne committed
    #include "LogReplayLink.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    Don Gagne's avatar
    Don Gagne committed
    #include "QmlObjectListModel.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __ios__
    
    Don Gagne's avatar
    Don Gagne committed
        #include "SerialLink.h"
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    #ifdef QT_DEBUG
    
    Don Gagne's avatar
    Don Gagne committed
        #include "MockLink.h"
    
    Don Gagne's avatar
    Don Gagne committed
    class UDPConfiguration;
    
    pixhawk's avatar
    pixhawk committed
    
    
    Don Gagne's avatar
    Don Gagne committed
    Q_DECLARE_LOGGING_CATEGORY(LinkManagerLog)
    
    Don Gagne's avatar
    Don Gagne committed
    Q_DECLARE_LOGGING_CATEGORY(LinkManagerVerboseLog)
    
    class QGCApplication;
    
    /// Manage communication links
    ///
    /// The Link Manager organizes the physical Links. It can manage arbitrary
    /// links and takes care of connecting them as well assigning the correct
    /// protocol instance to transport the link data into the application.
    
    
    class LinkManager : public QGCTool
    
    pixhawk's avatar
    pixhawk committed
        Q_OBJECT
    
    Don Gagne's avatar
    Don Gagne committed
        /// Unit Test has access to private constructor/destructor
        friend class LinkManagerTest;
    
    Don Gagne's avatar
    Don Gagne committed
    public:
    
        LinkManager(QGCApplication* app);
        ~LinkManager();
    
    Don Gagne's avatar
    Don Gagne committed
        Q_PROPERTY(bool autoconnectUDP                      READ autoconnectUDP                     WRITE setAutoconnectUDP         NOTIFY autoconnectUDPChanged)
        Q_PROPERTY(bool autoconnectPixhawk                  READ autoconnectPixhawk                 WRITE setAutoconnectPixhawk     NOTIFY autoconnectPixhawkChanged)
        Q_PROPERTY(bool autoconnect3DRRadio                 READ autoconnect3DRRadio                WRITE setAutoconnect3DRRadio    NOTIFY autoconnect3DRRadioChanged)
        Q_PROPERTY(bool autoconnectPX4Flow                  READ autoconnectPX4Flow                 WRITE setAutoconnectPX4Flow     NOTIFY autoconnectPX4FlowChanged)
    
    Don Gagne's avatar
    Don Gagne committed
        Q_PROPERTY(bool autoconnectRTKGPS                   READ autoconnectRTKGPS                  WRITE setAutoconnectRTKGPS      NOTIFY autoconnectRTKGPSChanged)
    
        Q_PROPERTY(bool autoconnectLibrePilot               READ autoconnectLibrePilot              WRITE setAutoconnectLibrePilot  NOTIFY autoconnectLibrePilotChanged)
    
    dogmaphobic's avatar
    dogmaphobic committed
        Q_PROPERTY(bool isBluetoothAvailable                READ isBluetoothAvailable               CONSTANT)
    
    
        /// LinkInterface Accessor
    
        Q_PROPERTY(QmlObjectListModel*  links               READ links                              CONSTANT)
    
        /// LinkConfiguration Accessor
    
        Q_PROPERTY(QmlObjectListModel*  linkConfigurations  READ linkConfigurations                                                 NOTIFY linkConfigurationsChanged)
    
        /// List of comm type strings
    
        Q_PROPERTY(QStringList          linkTypeStrings     READ linkTypeStrings                    CONSTANT)
    
        /// List of supported baud rates for serial links
    
        Q_PROPERTY(QStringList          serialBaudRates     READ serialBaudRates                    CONSTANT)
        /// List of comm ports display names
        Q_PROPERTY(QStringList          serialPortStrings   READ serialPortStrings                                                  NOTIFY commPortStringsChanged)
    
        /// List of comm ports
    
        Q_PROPERTY(QStringList          serialPorts         READ serialPorts                                                        NOTIFY commPortsChanged)
    
        // Create/Edit Link Configuration
        Q_INVOKABLE LinkConfiguration*  createConfiguration         (int type, const QString& name);
        Q_INVOKABLE LinkConfiguration*  startConfigurationEditing   (LinkConfiguration* config);
        Q_INVOKABLE void                cancelConfigurationEditing  (LinkConfiguration* config) { delete config; }
        Q_INVOKABLE bool                endConfigurationEditing     (LinkConfiguration* config, LinkConfiguration* editedConfig);
        Q_INVOKABLE bool                endCreateConfiguration      (LinkConfiguration* config);
        Q_INVOKABLE void                removeConfiguration         (LinkConfiguration* config);
    
    Don Gagne's avatar
    Don Gagne committed
    
        // Property accessors
    
    
    dogmaphobic's avatar
    dogmaphobic committed
        bool autoconnectUDP             (void)  { return _autoconnectUDP; }
        bool autoconnectPixhawk         (void)  { return _autoconnectPixhawk; }
        bool autoconnect3DRRadio        (void)  { return _autoconnect3DRRadio; }
        bool autoconnectPX4Flow         (void)  { return _autoconnectPX4Flow; }
    
    Don Gagne's avatar
    Don Gagne committed
        bool autoconnectRTKGPS          (void)  { return _autoconnectRTKGPS; }
    
        bool autoconnectLibrePilot      (void)  { return _autoconnectLibrePilot; }
    
    dogmaphobic's avatar
    dogmaphobic committed
        bool isBluetoothAvailable       (void);
    
    Don Gagne's avatar
    Don Gagne committed
    
    
        QmlObjectListModel* links               (void) { return &_links; }
        QmlObjectListModel* linkConfigurations  (void) { return &_linkConfigurations; }
        QStringList         linkTypeStrings     (void) const;
        QStringList         serialBaudRates     (void);
        QStringList         serialPortStrings   (void);
    
        QStringList         serialPorts         (void);
    
        void setAutoconnectUDP        (bool autoconnect);
        void setAutoconnectPixhawk    (bool autoconnect);
        void setAutoconnect3DRRadio   (bool autoconnect);
        void setAutoconnectPX4Flow    (bool autoconnect);
        void setAutoconnectRTKGPS     (bool autoconnect);
        void setAutoconnectLibrePilot (bool autoconnect);
    
    
        /// Load list of link configurations from disk
        void loadLinkConfigurationList();
    
        /// Save list of link configurations from disk
        void saveLinkConfigurationList();
    
        /// Suspend automatic confguration updates (during link maintenance for instance)
        void suspendConfigurationUpdates(bool suspend);
    
    
        /// Sets the flag to suspend the all new connections
    
        ///     @param reason User visible reason to suspend connections
        void setConnectionsSuspended(QString reason);
    
        /// Sets the flag to allow new connections to be made
    
        void setConnectionsAllowed(void) { _connectionsSuspended = false; }
    
        /// Creates, connects (and adds) a link  based on the given configuration instance.
    
    Don Gagne's avatar
    Don Gagne committed
        /// Link takes ownership of config.
    
    Don Gagne's avatar
    Don Gagne committed
        Q_INVOKABLE LinkInterface* createConnectedLink(LinkConfiguration* config);
    
        /// Creates, connects (and adds) a link  based on the given configuration name.
    
    Don Gagne's avatar
    Don Gagne committed
        LinkInterface* createConnectedLink(const QString& name);
    
    Don Gagne's avatar
    Don Gagne committed
        /// Disconnects all existing links
        void disconnectAll(void);
    
        /// Connect the specified link
        bool connectLink(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
        /// Disconnect the specified link
        Q_INVOKABLE void disconnectLink(LinkInterface* link);
    
        // The following APIs are public but should not be called in normal use. The are mainly exposed
        // here for unit test code.
        void _deleteLink(LinkInterface* link);
        void _addLink(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
        // Called to signal app shutdown. Disconnects all links while turning off auto-connect.
    
    Don Gagne's avatar
    Don Gagne committed
        Q_INVOKABLE void shutdown(void);
    
    Don Gagne's avatar
    Don Gagne committed
    
    
    Don Gagne's avatar
    Don Gagne committed
    #ifdef QT_DEBUG
        // Only used by unit test tp restart after a shutdown
        void restart(void) { setConnectionsAllowed(); }
    #endif
    
    
        /// @return true: specified link is an autoconnect link
        bool isAutoconnectLink(LinkInterface* link);
    
    
        // Override from QGCTool
        virtual void setToolbox(QGCToolbox *toolbox);
    
    
    pixhawk's avatar
    pixhawk committed
    signals:
    
        void autoconnectUDPChanged        (bool autoconnect);
        void autoconnectPixhawkChanged    (bool autoconnect);
        void autoconnect3DRRadioChanged   (bool autoconnect);
        void autoconnectPX4FlowChanged    (bool autoconnect);
        void autoconnectRTKGPSChanged     (bool autoconnect);
        void autoconnectLibrePilotChanged (bool autoconnect);
    
    
    Don Gagne's avatar
    Don Gagne committed
    
    
    pixhawk's avatar
    pixhawk committed
        void newLink(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
    
        // Link has been deleted. You may not necessarily get a linkInactive before the link is deleted.
    
        void linkDeleted(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
    
        // Link has been connected, but no Vehicle seen on link yet.
    
        void linkConnected(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
    
        // Link disconnected, all vehicles on link should be gone as well.
    
        void linkDisconnected(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
    
        // New vehicle has been seen on the link.
        void linkActive(LinkInterface* link, int vehicleId, int vehicleFirmwareType, int vehicleType);
    
        // No longer hearing from any vehicles on this link.
        void linkInactive(LinkInterface* link);
    
    
        void commPortStringsChanged();
    
        void commPortsChanged();
        void linkConfigurationsChanged();
    
    private slots:
        void _linkConnected(void);
        void _linkDisconnected(void);
    
        void _linkConnectionRemoved(LinkInterface* link);
    
    Don Gagne's avatar
    Don Gagne committed
    #ifndef __ios__
    
    Don Gagne's avatar
    Don Gagne committed
        void _activeLinkCheck(void);
    
    Don Gagne's avatar
    Don Gagne committed
    #endif
    
        bool _connectionsSuspendedMsg(void);
    
    Don Gagne's avatar
    Don Gagne committed
        void _updateAutoConnectLinks(void);
    
        void _updateSerialPorts();
        void _fixUnnamed(LinkConfiguration* config);
    
    Don Gagne's avatar
    Don Gagne committed
        bool _setAutoconnectWorker(bool& currentAutoconnect, bool newAutoconnect, const char* autoconnectKey);
    
    Don Gagne's avatar
    Don Gagne committed
    
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __ios__
    
    Don Gagne's avatar
    Don Gagne committed
        SerialConfiguration* _autoconnectConfigurationsContainsPort(const QString& portName);
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    
        bool    _configUpdateSuspended;                     ///< true: stop updating configuration list
        bool    _configurationsLoaded;                      ///< true: Link configurations have been loaded
        bool    _connectionsSuspended;                      ///< true: all new connections should not be allowed
        QString _connectionsSuspendedReason;                ///< User visible reason for suspension
        QTimer  _portListTimer;
    
        uint32_t _mavlinkChannelsUsedBitMask;
    
    
        MAVLinkProtocol*    _mavlinkProtocol;
    
    Don Gagne's avatar
    Don Gagne committed
    
        QmlObjectListModel  _links;
        QmlObjectListModel  _linkConfigurations;
        QmlObjectListModel  _autoconnectConfigurations;
    
    
        QMap<QString, int>  _autoconnectWaitList;   ///< key: QGCSerialPortInfo.systemLocation, value: wait count
    
        QStringList _commPortList;
    
        QStringList _commPortDisplayList;
    
    Don Gagne's avatar
    Don Gagne committed
        bool _autoconnectUDP;
        bool _autoconnectPixhawk;
        bool _autoconnect3DRRadio;
        bool _autoconnectPX4Flow;
    
    Don Gagne's avatar
    Don Gagne committed
        bool _autoconnectRTKGPS;
    
    Don Gagne's avatar
    Don Gagne committed
    #ifndef __ios__
    
        QTimer              _activeLinkCheckTimer;                  ///< Timer which checks for a vehicle showing up on a usb direct link
        QList<SerialLink*>  _activeLinkCheckList;                   ///< List of links we are waiting for a vehicle to show up on
        static const int    _activeLinkCheckTimeoutMSecs = 15000;   ///< Amount of time to wait for a heatbeat. Keep in mind ArduPilot stack heartbeat is slow to come.
    
    Don Gagne's avatar
    Don Gagne committed
    #endif
    
        static const char*  _settingsGroup;
        static const char*  _autoconnectUDPKey;
        static const char*  _autoconnectPixhawkKey;
        static const char*  _autoconnect3DRRadioKey;
        static const char*  _autoconnectPX4FlowKey;
    
    Don Gagne's avatar
    Don Gagne committed
        static const char*  _autoconnectRTKGPSKey;
    
        static const char*  _autoconnectLibrePilotKey;
    
        static const char*  _defaultUPDLinkName;
        static const int    _autoconnectUpdateTimerMSecs;
        static const int    _autoconnectConnectDelayMSecs;
    
    pixhawk's avatar
    pixhawk committed
    };