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 void mavlinkMessageReceived(const mavlink_message_t &message);
29
30 void enableRandomDrops(bool enable) { _randomDropsEnabled = enable; }
31
33 QStringList uploadedFiles() const { return _uploadedFiles.keys(); }
34
36 QByteArray uploadedFileContents(const QString& remotePath) const { return _uploadedFiles.value(remotePath); }
37
39 void clearUploadedFiles() { _uploadedFiles.clear(); }
40
51
53 void setErrorMode(ErrorMode_t errMode) { _errMode = errMode; };
54
57 void setListDirectoryWithTimeSupported(bool supported) { _listDirectoryWithTimeSupported = supported; }
58
69
71 static constexpr const size_t cFailureModes = std::size(MockLinkFTP::rgFailureModes);
72
73 static constexpr const char *sizeFilenamePrefix = "mocklink-size-";
74
77 static constexpr uint32_t kMockModificationTime = 1700000000;
78
79signals:
82
85
86private:
88 void _sendAck(uint8_t targetSystemId, uint8_t targetComponentId, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
89 void _sendNak(uint8_t targetSystemId, uint8_t targetComponentId, MavlinkFTP::ErrorCode_t error, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
90 void _sendNakErrno(uint8_t targetSystemId, uint8_t targetComponentId, uint8_t nakErrno, uint16_t seqNumber, MavlinkFTP::OpCode_t reqOpCode);
92 void _sendResponse(uint8_t targetSystemId, uint8_t targetComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
95 void _listCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber, bool withTime);
96 void _openCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
97 void _createFileCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
98 void _openFileWOCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
99 void _readCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
100 void _burstReadCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
101 void _terminateCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
102 void _resetCommand(uint8_t senderSystemId, uint8_t senderComponentId, uint16_t seqNumber);
103 void _writeCommand(uint8_t senderSystemId, uint8_t senderComponentId, MavlinkFTP::Request *request, uint16_t seqNumber);
104 void _finalizeActiveUpload();
107 uint16_t _nextSeqNumber(uint16_t seqNumber) const;
108 static QString _createTestTempFile(int size);
109 QString _generateParamPck(bool withDefaults);
110
112 static void ensureNullTemination(MavlinkFTP::Request *request);
113
114 const uint8_t _systemIdServer;
115 const uint8_t _componentIdServer;
116 MockLink *_mockLink;
117
118 bool _lastReplyValid = false;
119 bool _randomDropsEnabled = false;
120 ErrorMode_t _errMode = errModeNone;
121 bool _listDirectoryWithTimeSupported = true;
122 mavlink_message_t _lastReply{};
123 QFile _currentFile;
124 QString _paramPckTempFile;
125 struct UploadSession {
126 bool active = false;
127 QString remotePath;
128 QByteArray buffer;
129
130 void reset() {
131 active = false;
132 remotePath.clear();
133 buffer.clear();
134 }
135 };
136 UploadSession _uploadSession;
137 QHash<QString, QByteArray> _uploadedFiles;
138 QStringList _fileList;
139 uint16_t _lastReplySequence = 0;
140
141 static constexpr uint8_t _sessionId = 1;
142};
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:30
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:77
void terminateCommandReceived()
You can connect to this signal to be notified when the server receives a Terminate command.
void setListDirectoryWithTimeSupported(bool supported)
Definition MockLinkFTP.h:57
static constexpr const char * sizeFilenamePrefix
Definition MockLinkFTP.h:73
void mavlinkMessageReceived(const mavlink_message_t &message)
Called to handle an FTP message.
static constexpr const ErrorMode_t rgFailureModes[]
Definition MockLinkFTP.h:62
ErrorMode_t
By calling setErrorMode with one of these modes you can cause the server to simulate an error.
Definition MockLinkFTP.h:42
@ errModeBadSequence
Return response with bad sequence number.
Definition MockLinkFTP.h:49
@ errModeNoSecondResponseAllowRetry
No response to subsequent request to initial command, error will be cleared after this so retry will ...
Definition MockLinkFTP.h:47
@ errModeNakSecondResponse
Nak subsequent request to initial command.
Definition MockLinkFTP.h:48
@ errModeNoResponse
No response to any request, client should eventually time out with no Ack.
Definition MockLinkFTP.h:44
@ errModeNone
No error, respond correctly.
Definition MockLinkFTP.h:43
@ errModeNoSecondResponse
No response to subsequent request to initial command.
Definition MockLinkFTP.h:46
@ errModeNakResponse
Nak all requests.
Definition MockLinkFTP.h:45
QStringList uploadedFiles() const
Returns the list of remote paths which have been uploaded in this session.
Definition MockLinkFTP.h:33
static constexpr const size_t cFailureModes
The number of ErrorModes in the rgFailureModes array.
Definition MockLinkFTP.h:71
void clearUploadedFiles()
Clears the stored uploaded file contents.
Definition MockLinkFTP.h:39
void setErrorMode(ErrorMode_t errMode)
Sets the error mode for command responses. This allows you to simulate various server errors.
Definition MockLinkFTP.h:53
QByteArray uploadedFileContents(const QString &remotePath) const
Returns the contents of an uploaded file. Empty if the path is unknown.
Definition MockLinkFTP.h:36