QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FTPManager.h
Go to the documentation of this file.
1#pragma once
2
3#include "MAVLinkFTP.h"
4
5#include <QtCore/QObject>
6#include <QtCore/QDir>
7#include <QtCore/QFile>
8#include <QtCore/QTimer>
9class Vehicle;
10
11class FTPManager : public QObject
12{
13 Q_OBJECT
14
15 friend class Vehicle;
16
17public:
18 FTPManager(Vehicle* vehicle);
19
33 bool download(uint8_t fromCompId, const QString& fromURI, const QString& toDir, const QString& fileName="", bool checksize = true);
34
41 bool upload(uint8_t toCompId, const QString& toURI, const QString& fromFile);
42
49 bool listDirectory(uint8_t fromCompId, const QString& fromURI);
50
56 bool deleteFile(uint8_t fromCompId, const QString& fromURI);
57
60 void cancelDownload();
61
65
68 void cancelDelete();
69
72 void cancelUpload();
73
74 static constexpr const char* mavlinkFTPScheme = "mftp";
75
76signals:
77 void downloadComplete (const QString& file, const QString& errorMsg);
78 void uploadComplete (const QString& file, const QString& errorMsg);
79 void listDirectoryComplete (const QStringList& dirList, const QString& errorMsg);
80 void deleteComplete (const QString& file, const QString& errorMsg);
81
84 void commandProgress(float value);
85
86private slots:
87 void _ackOrNakTimeout(void);
88
89private:
90 typedef void (FTPManager::*StateBeginFn) (void);
91 typedef void (FTPManager::*StateAckNakFn) (const MavlinkFTP::Request* ackOrNak);
92 typedef void (FTPManager::*StateTimeoutFn) (void);
93
94 struct StateFunctions_t {
95 StateBeginFn beginFn;
96 StateAckNakFn ackNakFn;
97 StateTimeoutFn timeoutFn;
98 };
99
100 struct MissingData_t {
101 uint32_t offset;
102 uint32_t cBytesMissing;
103 };
104
105 struct DownloadState_t {
106 uint8_t sessionId;
107 uint32_t expectedOffset;
108 uint32_t bytesWritten;
109 QList<MissingData_t> rgMissingData;
110 QString fullPathOnVehicle;
111 QDir toDir;
112 QString fileName;
113 uint32_t fileSize;
114 QFile file;
115 int retryCount;
116 bool checksize;
117
118 bool inProgress() const { return fileSize > 0; }
119
120 void reset() {
121 sessionId = 0;
122 expectedOffset = 0;
123 bytesWritten = 0;
124 retryCount = 0;
125 fileSize = 0;
126 fullPathOnVehicle.clear();
127 fileName.clear();
128 rgMissingData.clear();
129 file.close();
130 }
131 };
132
133 struct ListDirectoryState_t {
134 uint8_t sessionId;
135 uint32_t expectedOffset;
136 QString fullPathOnVehicle;
137 QStringList rgDirectoryList;
138 int retryCount;
139 MavlinkFTP::OpCode_t opCode;
140
141 bool inProgress() const { return !fullPathOnVehicle.isEmpty(); }
142
143 void reset() {
144 sessionId = 0;
145 expectedOffset = 0;
146 fullPathOnVehicle.clear();
147 rgDirectoryList.clear();
148 retryCount = 0;
150 }
151 };
152
155 enum class WithTimeSupport_t { Unknown, Supported, Unsupported };
156
157 struct DeleteFileState_t {
158 QString fullPathOnVehicle;
159 int retryCount = 0;
160
161 bool inProgress() const { return !fullPathOnVehicle.isEmpty(); }
162
163 void reset() {
164 fullPathOnVehicle.clear();
165 retryCount = 0;
166 }
167 };
168
169 struct UploadState_t {
170 uint8_t sessionId;
171 uint32_t totalBytesSent;
172 uint32_t fileSize;
173 uint32_t lastChunkSize;
174 QFile file;
175 QString fullPathOnVehicle;
176 QString localFilePath;
177 int retryCount;
178 bool cancelled;
179
180 bool inProgress() const { return file.isOpen(); }
181
182 void reset() {
183 sessionId = 0;
184 totalBytesSent = 0;
185 fileSize = 0;
186 lastChunkSize = 0;
187 retryCount = 0;
188 cancelled = false;
189 fullPathOnVehicle.clear();
190 localFilePath.clear();
191 file.close();
192 }
193 };
194
195 void _mavlinkMessageReceived (const mavlink_message_t& message);
196 void _startStateMachine (void);
197 void _advanceStateMachine (void);
198 void _listDirectoryBegin (void);
199 void _listDirectoryAckOrNak (const MavlinkFTP::Request* ackOrNak);
200 void _listDirectoryTimeout (void);
201 void _openFileROBegin (void);
202 void _openFileROAckOrNak (const MavlinkFTP::Request* ackOrNak);
203 void _openFileROTimeout (void);
204 void _burstReadFileBegin (void);
205 void _burstReadFileAckOrNak (const MavlinkFTP::Request* ackOrNak);
206 void _burstReadFileTimeout (void);
207 void _fillMissingBlocksBegin (void);
208 void _fillMissingBlocksAckOrNak (const MavlinkFTP::Request* ackOrNak);
209 void _fillMissingBlocksTimeout (void);
210 void _resetSessionsBegin (void);
211 void _resetSessionsAckOrNak (const MavlinkFTP::Request* ackOrNak);
212 void _resetSessionsTimeout (void);
213 QString _errorMsgFromNak (const MavlinkFTP::Request* nak);
214 void _sendRequestExpectAck (MavlinkFTP::Request* request);
215 void _downloadCompleteNoError (void) { _downloadComplete(QString()); }
216 void _downloadComplete (const QString& errorMsg);
217 void _fillRequestDataWithString(MavlinkFTP::Request* request, const QString& str);
218 void _fillMissingBlocksWorker (bool firstRequest);
219 void _burstReadFileWorker (bool firstRequest);
220 void _listDirectoryWorker (bool firstRequest);
221 bool _parseURI (uint8_t fromCompId, const QString& uri, QString& parsedURI, uint8_t& compId);
222 void _listDirectoryCompleteNoError(void) { _listDirectoryComplete(QString()); }
223 void _listDirectoryComplete (const QString& errorMsg);
224 void _deleteFileBegin (void);
225 void _deleteFileAckOrNak (const MavlinkFTP::Request* ackOrNak);
226 void _deleteFileTimeout (void);
227 void _deleteCompleteNoError (void) { _deleteComplete(QString()); }
228 void _deleteComplete (const QString& errorMsg);
229
230 void _createFileBegin (void);
231 void _createFileAckOrNak (const MavlinkFTP::Request* ackOrNak);
232 void _createFileTimeout (void);
233 void _writeFileBegin (void);
234 void _writeFileAckOrNak (const MavlinkFTP::Request* ackOrNak);
235 void _writeFileTimeout (void);
236 void _writeFileWorker (bool firstRequest);
237 void _uploadFinalize (void);
238 void _uploadComplete (const QString& errorMsg);
239 void _terminateUploadSessionBegin(void);
240 void _terminateUploadSessionAckOrNak(const MavlinkFTP::Request* ackOrNak);
241 void _terminateUploadSessionTimeout(void);
242
243 void _terminateSessionBegin (void);
244 void _terminateSessionAckOrNak (const MavlinkFTP::Request* ackOrNak);
245 void _terminateSessionTimeout (void);
246 void _terminateComplete (void);
247
248 Vehicle* _vehicle;
249 uint8_t _ftpCompId = MAV_COMP_ID_AUTOPILOT1;
250 QList<StateFunctions_t> _rgStateMachine;
251 DownloadState_t _downloadState;
252 ListDirectoryState_t _listDirectoryState;
253 DeleteFileState_t _deleteState;
254 UploadState_t _uploadState;
255 QTimer _ackOrNakTimeoutTimer;
256 int _currentStateMachineIndex = -1;
257 uint16_t _expectedIncomingSeqNumber = 0;
258 WithTimeSupport_t _listDirWithTimeSupport = WithTimeSupport_t::Unknown;
259
260 static const int _ackOrNakTimeoutMsecs = 1000;
261 static const int _maxRetry = 3;
262
263public:
265 static constexpr int kTestAckTimeoutMs = 10;
267 static constexpr int kTestOperationMaxWaitMs = 5000;
268};
struct __mavlink_message mavlink_message_t
static constexpr int kTestAckTimeoutMs
Ack timeout used in unit tests (much shorter for faster tests)
Definition FTPManager.h:265
void cancelDownload()
bool listDirectory(uint8_t fromCompId, const QString &fromURI)
bool deleteFile(uint8_t fromCompId, const QString &fromURI)
bool upload(uint8_t toCompId, const QString &toURI, const QString &fromFile)
Definition FTPManager.cc:85
static constexpr const char * mavlinkFTPScheme
Definition FTPManager.h:74
void uploadComplete(const QString &file, const QString &errorMsg)
void cancelUpload()
static constexpr int kTestOperationMaxWaitMs
Maximum wait time for FTP operations in unit tests (generous for multi-packet transfers)
Definition FTPManager.h:267
void commandProgress(float value)
void downloadComplete(const QString &file, const QString &errorMsg)
void cancelListDirectory()
void deleteComplete(const QString &file, const QString &errorMsg)
void cancelDelete()
bool download(uint8_t fromCompId, const QString &fromURI, const QString &toDir, const QString &fileName="", bool checksize=true)
Definition FTPManager.cc:30
void listDirectoryComplete(const QStringList &dirList, const QString &errorMsg)
@ kCmdListDirectory
List files in <path> from <offset>
Definition MAVLinkFTP.h:42
@ Unsupported
Definition ADSB.h:28