MockLink.h 6.24 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
Q_DECLARE_LOGGING_CATEGORY(MockLinkVerboseLog)
Don Gagne's avatar
Don Gagne committed
37
38
39
40
41
42

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

43
44
45
46
47
48
49
50
51
52
53
54
55
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
56
57
58
class MockLink : public LinkInterface
{
    Q_OBJECT
59

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

65
    // MockLink methods
Don Gagne's avatar
Don Gagne committed
66
    int vehicleId(void) { return _vehicleSystemId; }
67
68
    MAV_AUTOPILOT getAutopilotType(void) { return _autopilotType; }
    void setAutopilotType(MAV_AUTOPILOT autopilot) { _autopilotType = autopilot; }
Don Gagne's avatar
Don Gagne committed
69
    void emitRemoteControlChannelRawChanged(int channel, uint16_t raw);
Don Gagne's avatar
Don Gagne committed
70
71
72
73
74
    
    /// Sends the specified mavlink message to QGC
    void respondWithMavlinkMessage(const mavlink_message_t& msg);
    
    MockLinkFileServer* getFileServer(void) { return _fileServer; }
75

Don Gagne's avatar
Don Gagne committed
76
77
78
79
80
81
82
    // 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; }

83
84
85
86
    // 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);
87
88

    LinkConfiguration* getLinkConfiguration() { return _config; }
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
    
    /// Sets a failure mode for unit testing
    ///     @param failureMode Type of failure to simulate
    ///     @param firstTimeOnly true: fail first call, success subsequent calls, false: fail all calls
    void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, bool firstTimeOnly);
    
    /// Called to send a MISSION_ACK message while the MissionManager is in idle state
    void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) { _missionItemHandler.sendUnexpectedMissionAck(ackType); }
    
    /// Called to send a MISSION_ITEM message while the MissionManager is in idle state
    void sendUnexpectedMissionItem(void) { _missionItemHandler.sendUnexpectedMissionItem(); }
    
    /// Called to send a MISSION_REQUEST message while the MissionManager is in idle state
    void sendUnexpectedMissionRequest(void) { _missionItemHandler.sendUnexpectedMissionRequest(); }
    
    /// Reset the state of the MissionItemHandler to no items, no transactions in progress.
    void resetMissionItemHandler(void) { _missionItemHandler.reset(); }
106

Don Gagne's avatar
Don Gagne committed
107
108
109
signals:
    /// @brief Used internally to move data to the thread.
    void _incomingBytes(const QByteArray bytes);
110

Don Gagne's avatar
Don Gagne committed
111
112
public slots:
    virtual void writeBytes(const char *bytes, qint64 cBytes);
113

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

Don Gagne's avatar
Don Gagne committed
118
119
120
121
private slots:
    void _run1HzTasks(void);
    void _run10HzTasks(void);
    void _run50HzTasks(void);
122

Don Gagne's avatar
Don Gagne committed
123
private:
124
125
126
    // From LinkInterface
    virtual bool _connect(void);
    virtual bool _disconnect(void);
127

Don Gagne's avatar
Don Gagne committed
128
129
    // QThread override
    virtual void run(void);
130

Don Gagne's avatar
Don Gagne committed
131
132
133
134
135
136
137
138
139
140
141
    // 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);
Don Gagne's avatar
Don Gagne committed
142
    void _handleFTP(const mavlink_message_t& msg);
143
    void _handleCommandLong(const mavlink_message_t& msg);
144
145
    float _floatUnionForParam(int componentId, const QString& paramName);
    void _setParamFloatUnionIntoMap(int componentId, const QString& paramName, float paramFloat);
146

147
    MockLinkMissionItemHandler  _missionItemHandler;
148

Don Gagne's avatar
Don Gagne committed
149
150
    QString _name;
    bool    _connected;
151

Don Gagne's avatar
Don Gagne committed
152
153
    uint8_t _vehicleSystemId;
    uint8_t _vehicleComponentId;
154

Don Gagne's avatar
Don Gagne committed
155
156
    bool    _inNSH;
    bool    _mavlinkStarted;
157

158
159
    QMap<int, QMap<QString, QVariant> > _mapParamName2Value;
    QMap<QString, MAV_PARAM_TYPE>       _mapParamName2MavParamType;
160

161
162
163
    uint8_t     _mavBaseMode;
    uint32_t    _mavCustomMode;
    uint8_t     _mavState;
164
165

    MockConfiguration* _config;
166
    MAV_AUTOPILOT _autopilotType;
Don Gagne's avatar
Don Gagne committed
167
168
    
    MockLinkFileServer* _fileServer;
Don Gagne's avatar
Don Gagne committed
169
170
171
};

#endif