LinkManager.h 3.78 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
/*=====================================================================
2

pixhawk's avatar
pixhawk committed
3
PIXHAWK Micro Air Vehicle Flying Robotics Toolkit
4

pixhawk's avatar
pixhawk committed
5
(c) 2009, 2010 PIXHAWK PROJECT  <http://pixhawk.ethz.ch>
6

pixhawk's avatar
pixhawk committed
7
This file is part of the PIXHAWK project
8

pixhawk's avatar
pixhawk committed
9 10 11 12
    PIXHAWK is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
13

pixhawk's avatar
pixhawk committed
14 15 16 17
    PIXHAWK is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
18

pixhawk's avatar
pixhawk committed
19 20
    You should have received a copy of the GNU General Public License
    along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
21

pixhawk's avatar
pixhawk committed
22
======================================================================*/
23

pixhawk's avatar
pixhawk committed
24 25 26 27 28 29 30 31 32 33 34 35 36
/**
 * @file
 *   @brief Manage communication links
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#ifndef _LINKMANAGER_H_
#define _LINKMANAGER_H_

#include <QThread>
#include <QList>
37
#include <QMultiMap>
38
#include <QMutex>
39 40 41 42 43

#include "LinkInterface.h"
#include "SerialLink.h"
#include "ProtocolInterface.h"
#include "QGCSingleton.h"
pixhawk's avatar
pixhawk committed
44

45 46
class LinkManagerTest;

pixhawk's avatar
pixhawk committed
47 48 49 50 51 52
/**
 * 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 QGCSingleton
54
{
pixhawk's avatar
pixhawk committed
55 56 57
    Q_OBJECT

public:
58 59 60 61 62
    /// @brief Returns the LinkManager singleton
    static LinkManager* instance(void);
    
    virtual void deleteInstance(void);

pixhawk's avatar
pixhawk committed
63 64 65 66
    ~LinkManager();

    QList<LinkInterface*> getLinksForProtocol(ProtocolInterface* protocol);

67 68
    ProtocolInterface* getProtocolForLink(LinkInterface* link);

pixhawk's avatar
pixhawk committed
69 70 71
    /** @brief Get a list of all links */
    const QList<LinkInterface*> getLinks();

72 73 74
    /** @brief Get a list of all serial links */
    const QList<SerialLink*> getSerialLinks();

75
    /** @brief Get a list of all protocols */
76
    const QList<ProtocolInterface*> getProtocols() {
77
        return _protocolLinks.uniqueKeys();
78
    }
79 80 81 82 83 84 85
    
    /// @brief Sets the lag to suspend the all new connections
    ///     @param reason User visible reason to suspend connections
    void setConnectionsSuspended(QString reason);
    
    /// @brief Sets the flag to allow new connections to be made
    void setConnectionsAllowed(void) { _connectionsSuspended = false; }
86 87 88
    
    /// @brief Deletes the specified link. Will disconnect if connected.
    void deleteLink(LinkInterface* link);
89

pixhawk's avatar
pixhawk committed
90
public slots:
91 92
    /// @brief Adds the link to the LinkManager. LinkManager takes ownership of this object. To delete
    //          it, call LinkManager::deleteLink.
pixhawk's avatar
pixhawk committed
93
    void add(LinkInterface* link);
94
    
pixhawk's avatar
pixhawk committed
95 96 97 98 99 100 101 102 103 104
    void addProtocol(LinkInterface* link, ProtocolInterface* protocol);

    bool connectAll();
    bool connectLink(LinkInterface* link);

    bool disconnectAll();
    bool disconnectLink(LinkInterface* link);

signals:
    void newLink(LinkInterface* link);
105
    void linkDeleted(LinkInterface* link);
106 107
    
private:
108
    /// @brief All access to LinkManager is through LinkManager::instance
109
    LinkManager(QObject* parent = NULL, bool registerSingleton = true);
110
    
111 112
    // LinkManager unit test is allowed to new LinkManager objects
    friend class LinkManagerTest;
113
    
114
    static LinkManager* _instance;
Don Gagne's avatar
Don Gagne committed
115
    
116 117 118 119 120 121 122 123
    QList<LinkInterface*> _links;
    QMultiMap<ProtocolInterface*,LinkInterface*> _protocolLinks;
    QMutex _dataMutex;
    
    bool _connectionsSuspendedMsg(void);
    
    bool _connectionsSuspended;              ///< true: all new connections should not be allowed
    QString _connectionsSuspendedReason;     ///< User visible reason for suspension
pixhawk's avatar
pixhawk committed
124 125
};

126
#endif