LinkManager.h 10.8 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (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.
 *
 ****************************************************************************/
9 10


11 12
/// @file
///     @author Lorenz Meier <mavteam@student.ethz.ch>
pixhawk's avatar
pixhawk committed
13 14 15 16 17

#ifndef _LINKMANAGER_H_
#define _LINKMANAGER_H_

#include <QList>
18
#include <QMultiMap>
19
#include <QMutex>
20

21
#include "LinkConfiguration.h"
22
#include "LinkInterface.h"
Don Gagne's avatar
Don Gagne committed
23
#include "QGCLoggingCategory.h"
24
#include "QGCToolbox.h"
Don Gagne's avatar
Don Gagne committed
25 26
#include "ProtocolInterface.h"
#include "MAVLinkProtocol.h"
dogmaphobic's avatar
dogmaphobic committed
27
#ifndef __mobile__
Don Gagne's avatar
Don Gagne committed
28
#include "LogReplayLink.h"
dogmaphobic's avatar
dogmaphobic committed
29
#endif
Don Gagne's avatar
Don Gagne committed
30
#include "QmlObjectListModel.h"
31

dogmaphobic's avatar
dogmaphobic committed
32
#ifndef __ios__
Don Gagne's avatar
Don Gagne committed
33
    #include "SerialLink.h"
dogmaphobic's avatar
dogmaphobic committed
34
#endif
35

36
#ifdef QT_DEBUG
Don Gagne's avatar
Don Gagne committed
37
    #include "MockLink.h"
38
#endif
39

Don Gagne's avatar
Don Gagne committed
40
class UDPConfiguration;
pixhawk's avatar
pixhawk committed
41

Don Gagne's avatar
Don Gagne committed
42
Q_DECLARE_LOGGING_CATEGORY(LinkManagerLog)
Don Gagne's avatar
Don Gagne committed
43
Q_DECLARE_LOGGING_CATEGORY(LinkManagerVerboseLog)
Don Gagne's avatar
Don Gagne committed
44

45
class QGCApplication;
46

47 48 49 50 51 52
/// 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.

53
class LinkManager : public QGCTool
54
{
pixhawk's avatar
pixhawk committed
55
    Q_OBJECT
56

Don Gagne's avatar
Don Gagne committed
57 58
    /// Unit Test has access to private constructor/destructor
    friend class LinkManagerTest;
59

Don Gagne's avatar
Don Gagne committed
60
public:
61 62
    LinkManager(QGCApplication* app);
    ~LinkManager();
63

Don Gagne's avatar
Don Gagne committed
64 65 66 67
    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
68
    Q_PROPERTY(bool autoconnectRTKGPS                   READ autoconnectRTKGPS                  WRITE setAutoconnectRTKGPS      NOTIFY autoconnectRTKGPSChanged)
69
    Q_PROPERTY(bool autoconnectLibrePilot               READ autoconnectLibrePilot              WRITE setAutoconnectLibrePilot  NOTIFY autoconnectLibrePilotChanged)
dogmaphobic's avatar
dogmaphobic committed
70
    Q_PROPERTY(bool isBluetoothAvailable                READ isBluetoothAvailable               CONSTANT)
71 72

    /// LinkInterface Accessor
73
    Q_PROPERTY(QmlObjectListModel*  links               READ links                              CONSTANT)
74
    /// LinkConfiguration Accessor
75
    Q_PROPERTY(QmlObjectListModel*  linkConfigurations  READ linkConfigurations                                                 NOTIFY linkConfigurationsChanged)
76
    /// List of comm type strings
77
    Q_PROPERTY(QStringList          linkTypeStrings     READ linkTypeStrings                    CONSTANT)
78
    /// List of supported baud rates for serial links
79 80 81
    Q_PROPERTY(QStringList          serialBaudRates     READ serialBaudRates                    CONSTANT)
    /// List of comm ports display names
    Q_PROPERTY(QStringList          serialPortStrings   READ serialPortStrings                                                  NOTIFY commPortStringsChanged)
82
    /// List of comm ports
83 84 85 86 87 88 89 90 91
    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
92 93 94

    // Property accessors

dogmaphobic's avatar
dogmaphobic committed
95 96 97 98
    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
99
    bool autoconnectRTKGPS          (void)  { return _autoconnectRTKGPS; }
100
    bool autoconnectLibrePilot      (void)  { return _autoconnectLibrePilot; }
dogmaphobic's avatar
dogmaphobic committed
101
    bool isBluetoothAvailable       (void);
Don Gagne's avatar
Don Gagne committed
102

103 104 105 106 107
    QmlObjectListModel* links               (void) { return &_links; }
    QmlObjectListModel* linkConfigurations  (void) { return &_linkConfigurations; }
    QStringList         linkTypeStrings     (void) const;
    QStringList         serialBaudRates     (void);
    QStringList         serialPortStrings   (void);
108
    QStringList         serialPorts         (void);
109

110 111 112 113 114 115
    void setAutoconnectUDP        (bool autoconnect);
    void setAutoconnectPixhawk    (bool autoconnect);
    void setAutoconnect3DRRadio   (bool autoconnect);
    void setAutoconnectPX4Flow    (bool autoconnect);
    void setAutoconnectRTKGPS     (bool autoconnect);
    void setAutoconnectLibrePilot (bool autoconnect);
116 117 118 119 120 121 122 123 124 125

    /// 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);

126
    /// Sets the flag to suspend the all new connections
127 128
    ///     @param reason User visible reason to suspend connections
    void setConnectionsSuspended(QString reason);
129

130
    /// Sets the flag to allow new connections to be made
131
    void setConnectionsAllowed(void) { _connectionsSuspended = false; }
132

133
    /// Creates, connects (and adds) a link  based on the given configuration instance.
Don Gagne's avatar
Don Gagne committed
134
    /// Link takes ownership of config.
Don Gagne's avatar
Don Gagne committed
135
    Q_INVOKABLE LinkInterface* createConnectedLink(LinkConfiguration* config);
136

137
    /// Creates, connects (and adds) a link  based on the given configuration name.
Don Gagne's avatar
Don Gagne committed
138
    LinkInterface* createConnectedLink(const QString& name);
139

Don Gagne's avatar
Don Gagne committed
140 141
    /// Disconnects all existing links
    void disconnectAll(void);
142

143 144
    /// Connect the specified link
    bool connectLink(LinkInterface* link);
145

Don Gagne's avatar
Don Gagne committed
146 147
    /// Disconnect the specified link
    Q_INVOKABLE void disconnectLink(LinkInterface* link);
148

149 150 151 152
    // 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);
153

Don Gagne's avatar
Don Gagne committed
154
    // Called to signal app shutdown. Disconnects all links while turning off auto-connect.
Don Gagne's avatar
Don Gagne committed
155
    Q_INVOKABLE void shutdown(void);
Don Gagne's avatar
Don Gagne committed
156

Don Gagne's avatar
Don Gagne committed
157 158 159 160 161
#ifdef QT_DEBUG
    // Only used by unit test tp restart after a shutdown
    void restart(void) { setConnectionsAllowed(); }
#endif

162 163 164
    /// @return true: specified link is an autoconnect link
    bool isAutoconnectLink(LinkInterface* link);

165 166 167
    // Override from QGCTool
    virtual void setToolbox(QGCToolbox *toolbox);

pixhawk's avatar
pixhawk committed
168
signals:
169 170 171 172 173 174 175
    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
176

pixhawk's avatar
pixhawk committed
177
    void newLink(LinkInterface* link);
Don Gagne's avatar
Don Gagne committed
178 179

    // Link has been deleted. You may not necessarily get a linkInactive before the link is deleted.
180
    void linkDeleted(LinkInterface* link);
Don Gagne's avatar
Don Gagne committed
181 182

    // Link has been connected, but no Vehicle seen on link yet.
183
    void linkConnected(LinkInterface* link);
Don Gagne's avatar
Don Gagne committed
184 185

    // Link disconnected, all vehicles on link should be gone as well.
186
    void linkDisconnected(LinkInterface* link);
Don Gagne's avatar
Don Gagne committed
187 188 189 190 191 192 193

    // 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);

194
    void commPortStringsChanged();
195 196
    void commPortsChanged();
    void linkConfigurationsChanged();
197

198 199 200
private slots:
    void _linkConnected(void);
    void _linkDisconnected(void);
201
    void _linkConnectionRemoved(LinkInterface* link);
Don Gagne's avatar
Don Gagne committed
202
#ifndef __ios__
Don Gagne's avatar
Don Gagne committed
203
    void _activeLinkCheck(void);
Don Gagne's avatar
Don Gagne committed
204
#endif
205

206
private:
207
    bool _connectionsSuspendedMsg(void);
Don Gagne's avatar
Don Gagne committed
208
    void _updateAutoConnectLinks(void);
209 210
    void _updateSerialPorts();
    void _fixUnnamed(LinkConfiguration* config);
Don Gagne's avatar
Don Gagne committed
211
    bool _setAutoconnectWorker(bool& currentAutoconnect, bool newAutoconnect, const char* autoconnectKey);
Don Gagne's avatar
Don Gagne committed
212

dogmaphobic's avatar
dogmaphobic committed
213
#ifndef __ios__
Don Gagne's avatar
Don Gagne committed
214
    SerialConfiguration* _autoconnectConfigurationsContainsPort(const QString& portName);
dogmaphobic's avatar
dogmaphobic committed
215
#endif
216 217 218 219 220 221

    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;
222
    uint32_t _mavlinkChannelsUsedBitMask;
223 224

    MAVLinkProtocol*    _mavlinkProtocol;
Don Gagne's avatar
Don Gagne committed
225 226 227 228 229

    QmlObjectListModel  _links;
    QmlObjectListModel  _linkConfigurations;
    QmlObjectListModel  _autoconnectConfigurations;

230
    QMap<QString, int>  _autoconnectWaitList;   ///< key: QGCSerialPortInfo.systemLocation, value: wait count
231
    QStringList _commPortList;
232
    QStringList _commPortDisplayList;
233

Don Gagne's avatar
Don Gagne committed
234 235 236 237
    bool _autoconnectUDP;
    bool _autoconnectPixhawk;
    bool _autoconnect3DRRadio;
    bool _autoconnectPX4Flow;
Don Gagne's avatar
Don Gagne committed
238
    bool _autoconnectRTKGPS;
239
    bool _autoconnectLibrePilot;
Don Gagne's avatar
Don Gagne committed
240
#ifndef __ios__
241 242 243
    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
244
#endif
Don Gagne's avatar
Don Gagne committed
245

246 247 248 249 250
    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
251
    static const char*  _autoconnectRTKGPSKey;
252
    static const char*  _autoconnectLibrePilotKey;
253 254 255
    static const char*  _defaultUPDLinkName;
    static const int    _autoconnectUpdateTimerMSecs;
    static const int    _autoconnectConnectDelayMSecs;
pixhawk's avatar
pixhawk committed
256 257
};

258
#endif