QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MockLinkFTP.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QByteArray>
4#include <QtCore/QFile>
5#include <QtCore/QHash>
6#include <QtCore/QObject>
7#include <QtCore/QStringList>
8
9#include "MAVLinkFTP.h"
10
11class MockLink;
12
15class MockLinkFTP : public QObject
16{
17 Q_OBJECT
18
19public:
20 MockLinkFTP(uint8_t systemIdServer, uint8_t componentIdServer, MockLink *mockLink);
22
25 void setFileList(const QStringList &fileList) { _fileList = fileList; }
26
28 struct LogFile {
29 QString name;
30 int size = 0;
31 uint32_t mtime = 0;
32 };
33
36 void setLogFiles(const QList<LogFile> &logFiles);
37
39 QList<LogFile> logFiles() const { return _logFiles; }
40
43 QByteArray logFileContents(const QString &name) const;
44
47 void setBurstReadDelayMs(int delayMs) { _burstReadDelayMs = delayMs; }
48
50 void mavlinkMessageReceived(const mavlink_message_t &message);
51
52 void enableRandomDrops(bool enable) { _randomDropsEnabled = enable; }
53
55 QStringList uploadedFiles() const { return _uploadedFiles.keys(); }
56
58 QByteArray uploadedFileContents(const QString& remotePath) const { return _uploadedFiles.value(remotePath); }
59
61 void clearUploadedFiles() { _uploadedFiles.clear(); }
62
73
75 void setErrorMode(ErrorMode_t errMode) { _errMode = errMode; };
76
79 void setListDirectoryWithTimeSupported(bool supported) { _listDirectoryWithTimeSupported = supported; }
80
91
93 static constexpr const size_t cFailureModes = std::size(MockLinkFTP::rgFailureModes);
94
95 static constexpr const char *sizeFilenamePrefix = "mocklink-size-";
96
99 static constexpr uint32_t kMockModificationTime = 1700000000;
100
101signals:
104
107
108private:
110 void _sendAck(uint8_t targetSystemId, uint8_t targetComponentId, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
111 void _sendNak(uint8_t targetSystemId, uint8_t targetComponentId, MavlinkFTP::ErrorCode_t error, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
112 void _sendNakErrno(uint8_t targetSystemId, uint8_t targetComponentId, uint8_t nakErrno, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
114 void _sendResponse(uint8_t targetSystemId, uint8_t targetComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
117 void _listCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber, bool withTime);
118 void _openCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
119 void _createFileCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
120 void _openFileWOCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
121 void _readCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
122 void _burstReadCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
123 void _removeFileCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
124 void _terminateCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
125 void _resetCommand(uint8_t senderSystemId, uint8_t senderComponentId, uint16_t seqNumber);
126 void _writeCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
127 void _finalizeActiveUpload();
130 uint16_t _nextSeqNumber(uint16_t seqNumber) const;
131 static QString _createTestTempFile(int size);
132 QString _generateParamPck(bool withDefaults);
133 QString _logFileTempPath(const QString &name);
134 static QByteArray _generateLogFileContents(const QString &name, int size);
135
137 static void ensureNullTemination(MavlinkFTP::Request *request);
138
139 const uint8_t _systemIdServer;
140 const uint8_t _componentIdServer;
141 MockLink *_mockLink;
142
143 bool _lastReplyValid = false;
144 bool _randomDropsEnabled = false;
145 int _burstReadDelayMs = 0;
146 ErrorMode_t _errMode = errModeNone;
147 bool _listDirectoryWithTimeSupported = true;
148 mavlink_message_t _lastReply{};
149 QFile _currentFile;
150 QString _paramPckTempFile;
151 struct UploadSession {
152 bool active = false;
153 QString remotePath;
154 QByteArray buffer;
155
156 void reset() {
157 active = false;
158 remotePath.clear();
159 buffer.clear();
160 }
161 };
162 UploadSession _uploadSession;
163 QHash<QString, QByteArray> _uploadedFiles;
164 QStringList _fileList;
165 QList<LogFile> _logFiles;
166 QHash<QString, QString> _logFileTempPaths;
167 uint16_t _lastReplySequence = 0;
168
169 static constexpr uint8_t _sessionId = 1;
170};
Error error
struct __mavlink_message mavlink_message_t
ErrorCode_t
Error codes returned in Nak response PayloadHeader.data[0].
Definition MAVLinkFTP.h:62
Mock implementation of Mavlink FTP server.
Definition MockLinkFTP.h:16
void enableRandomDrops(bool enable)
Definition MockLinkFTP.h:52
void resetCommandReceived()
You can connect to this signal to be notified when the server receives a Reset command.
void setFileList(const QStringList &fileList)
Definition MockLinkFTP.h:25
static constexpr uint32_t kMockModificationTime
Definition MockLinkFTP.h:99
void terminateCommandReceived()
You can connect to this signal to be notified when the server receives a Terminate command.
QList< LogFile > logFiles() const
Returns the log files served from the @MAV_LOG virtual directory.
Definition MockLinkFTP.h:39
void setLogFiles(const QList< LogFile > &logFiles)
void setBurstReadDelayMs(int delayMs)
Definition MockLinkFTP.h:47
void setListDirectoryWithTimeSupported(bool supported)
Definition MockLinkFTP.h:79
static constexpr const char * sizeFilenamePrefix
Definition MockLinkFTP.h:95
void mavlinkMessageReceived(const mavlink_message_t &message)
Called to handle an FTP message.
QByteArray logFileContents(const QString &name) const
static constexpr const ErrorMode_t rgFailureModes[]
Definition MockLinkFTP.h:84
ErrorMode_t
By calling setErrorMode with one of these modes you can cause the server to simulate an error.
Definition MockLinkFTP.h:64
@ errModeBadSequence
Return response with bad sequence number.
Definition MockLinkFTP.h:71
@ errModeNoSecondResponseAllowRetry
No response to subsequent request to initial command, error will be cleared after this so retry will ...
Definition MockLinkFTP.h:69
@ errModeNakSecondResponse
Nak subsequent request to initial command.
Definition MockLinkFTP.h:70
@ errModeNoResponse
No response to any request, client should eventually time out with no Ack.
Definition MockLinkFTP.h:66
@ errModeNone
No error, respond correctly.
Definition MockLinkFTP.h:65
@ errModeNoSecondResponse
No response to subsequent request to initial command.
Definition MockLinkFTP.h:68
@ errModeNakResponse
Nak all requests.
Definition MockLinkFTP.h:67
QStringList uploadedFiles() const
Returns the list of remote paths which have been uploaded in this session.
Definition MockLinkFTP.h:55
static constexpr const size_t cFailureModes
The number of ErrorModes in the rgFailureModes array.
Definition MockLinkFTP.h:93
void clearUploadedFiles()
Clears the stored uploaded file contents.
Definition MockLinkFTP.h:61
void setErrorMode(ErrorMode_t errMode)
Sets the error mode for command responses. This allows you to simulate various server errors.
Definition MockLinkFTP.h:75
QByteArray uploadedFileContents(const QString &remotePath) const
Returns the contents of an uploaded file. Empty if the path is unknown.
Definition MockLinkFTP.h:58
Describes a simulated onboard log file served from the @MAV_LOG virtual directory.
Definition MockLinkFTP.h:28
int size
File size in bytes.
Definition MockLinkFTP.h:30
QString name
File name, e.g. "log_1.ulg".
Definition MockLinkFTP.h:29
uint32_t mtime
Modification time (seconds since UNIX epoch UTC)
Definition MockLinkFTP.h:31