MockLink.h 5.29 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1
/*=====================================================================
2

Don Gagne's avatar
Don Gagne committed
3
 QGroundControl Open Source Ground Control Station
4

Don Gagne's avatar
Don Gagne committed
5
 (c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
6

Don Gagne's avatar
Don Gagne committed
7
 This file is part of the QGROUNDCONTROL project
8

Don Gagne's avatar
Don Gagne committed
9
10
11
12
 QGROUNDCONTROL 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

Don Gagne's avatar
Don Gagne committed
14
15
16
17
 QGROUNDCONTROL 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

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

Don Gagne's avatar
Don Gagne committed
22
23
24
25
26
27
 ======================================================================*/

#ifndef MOCKLINK_H
#define MOCKLINK_H

#include <QMap>
28
#include <QLoggingCategory>
Don Gagne's avatar
Don Gagne committed
29
30

#include "MockLinkMissionItemHandler.h"
Don Gagne's avatar
Don Gagne committed
31
#include "MockLinkFileServer.h"
32
#include "LinkManager.h"
33
34
35
#include "QGCMAVLink.h"

Q_DECLARE_LOGGING_CATEGORY(MockLinkLog)
Don Gagne's avatar
Don Gagne committed
36
37
38
39
40
41

/// @file
///     @brief Mock implementation of a Link.
///
///     @author Don Gagne <don@thegagnes.com>

42
43
44
45
46
47
48
49
50
51
52
53
54
class MockConfiguration : public LinkConfiguration
{
public:

    MockConfiguration(const QString& name) : LinkConfiguration(name) {}
    MockConfiguration(MockConfiguration* source) : LinkConfiguration(source) {}
    int  type() { return LinkConfiguration::TypeMock; }
    void copyFrom(LinkConfiguration* source) { LinkConfiguration::copyFrom(source); }
    void loadSettings(QSettings& settings, const QString& root) { Q_UNUSED(settings); Q_UNUSED(root); }
    void saveSettings(QSettings& settings, const QString& root) { Q_UNUSED(settings); Q_UNUSED(root); }
    void updateSettings() {}
};

Don Gagne's avatar
Don Gagne committed
55
56
57
class MockLink : public LinkInterface
{
    Q_OBJECT
58

Don Gagne's avatar
Don Gagne committed
59
public:
60
61
    // LinkConfiguration is optional for MockLink
    MockLink(MockConfiguration* config = NULL);
Don Gagne's avatar
Don Gagne committed
62
    ~MockLink(void);
63

Don Gagne's avatar
Don Gagne committed
64
65
66
67
68
69
    // Virtuals from LinkInterface
    virtual QString getName(void) const { return _name; }
    virtual void requestReset(void){ }
    virtual bool isConnected(void) const { return _connected; }
    virtual qint64 getConnectionSpeed(void) const { return 100000000; }
    virtual qint64 bytesAvailable(void) { return 0; }
70

71
72
73
    // MockLink methods
    MAV_AUTOPILOT getAutopilotType(void) { return _autopilotType; }
    void setAutopilotType(MAV_AUTOPILOT autopilot) { _autopilotType = autopilot; }
Don Gagne's avatar
Don Gagne committed
74
    void emitRemoteControlChannelRawChanged(int channel, uint16_t raw);
Don Gagne's avatar
Don Gagne committed
75
76
77
78
79
    
    /// Sends the specified mavlink message to QGC
    void respondWithMavlinkMessage(const mavlink_message_t& msg);
    
    MockLinkFileServer* getFileServer(void) { return _fileServer; }
80

81
82
83
84
    // These are left unimplemented in order to cause linker errors which indicate incorrect usage of
    // connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager.
    bool connect(void);
    bool disconnect(void);
85
86
87

    LinkConfiguration* getLinkConfiguration() { return _config; }

Don Gagne's avatar
Don Gagne committed
88
89
90
signals:
    /// @brief Used internally to move data to the thread.
    void _incomingBytes(const QByteArray bytes);
91

Don Gagne's avatar
Don Gagne committed
92
93
public slots:
    virtual void writeBytes(const char *bytes, qint64 cBytes);
94

Don Gagne's avatar
Don Gagne committed
95
96
97
protected slots:
    // FIXME: This should not be part of LinkInterface. It is an internal link implementation detail.
    virtual void readBytes(void);
98

Don Gagne's avatar
Don Gagne committed
99
100
101
102
private slots:
    void _run1HzTasks(void);
    void _run10HzTasks(void);
    void _run50HzTasks(void);
103

Don Gagne's avatar
Don Gagne committed
104
private:
105
106
107
    // From LinkInterface
    virtual bool _connect(void);
    virtual bool _disconnect(void);
108

Don Gagne's avatar
Don Gagne committed
109
110
    // QThread override
    virtual void run(void);
111

Don Gagne's avatar
Don Gagne committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
    // MockLink methods
    void _sendHeartBeat(void);
    void _handleIncomingBytes(const QByteArray bytes);
    void _handleIncomingNSHBytes(const char* bytes, int cBytes);
    void _handleIncomingMavlinkBytes(const uint8_t* bytes, int cBytes);
    void _loadParams(void);
    void _handleHeartBeat(const mavlink_message_t& msg);
    void _handleSetMode(const mavlink_message_t& msg);
    void _handleParamRequestList(const mavlink_message_t& msg);
    void _handleParamSet(const mavlink_message_t& msg);
    void _handleParamRequestRead(const mavlink_message_t& msg);
    void _handleMissionRequestList(const mavlink_message_t& msg);
    void _handleMissionRequest(const mavlink_message_t& msg);
    void _handleMissionItem(const mavlink_message_t& msg);
Don Gagne's avatar
Don Gagne committed
126
    void _handleFTP(const mavlink_message_t& msg);
127
128
    float _floatUnionForParam(int componentId, const QString& paramName);
    void _setParamFloatUnionIntoMap(int componentId, const QString& paramName, float paramFloat);
129

Don Gagne's avatar
Don Gagne committed
130
    MockLinkMissionItemHandler* _missionItemHandler;
131

Don Gagne's avatar
Don Gagne committed
132
133
    QString _name;
    bool    _connected;
134

Don Gagne's avatar
Don Gagne committed
135
136
    uint8_t _vehicleSystemId;
    uint8_t _vehicleComponentId;
137

Don Gagne's avatar
Don Gagne committed
138
139
    bool    _inNSH;
    bool    _mavlinkStarted;
140

141
142
    QMap<int, QMap<QString, QVariant> > _mapParamName2Value;
    QMap<QString, MAV_PARAM_TYPE>       _mapParamName2MavParamType;
143

Don Gagne's avatar
Don Gagne committed
144
145
    typedef QMap<uint16_t, mavlink_mission_item_t>   MissionList_t;
    MissionList_t   _missionItems;
146

Don Gagne's avatar
Don Gagne committed
147
148
    uint8_t _mavBaseMode;
    uint8_t _mavCustomMode;
Don Gagne's avatar
Don Gagne committed
149
    uint8_t _mavState;
150
151

    MockConfiguration* _config;
152
    MAV_AUTOPILOT _autopilotType;
Don Gagne's avatar
Don Gagne committed
153
154
    
    MockLinkFileServer* _fileServer;
Don Gagne's avatar
Don Gagne committed
155
156
157
};

#endif