33 bool download(uint8_t fromCompId,
const QString& fromURI,
const QString& toDir,
const QString& fileName=
"",
bool checksize =
true);
41 bool upload(uint8_t toCompId,
const QString& toURI,
const QString& fromFile);
49 bool listDirectory(uint8_t fromCompId,
const QString& fromURI);
59 bool deleteFile(uint8_t fromCompId,
const QString& fromURI);
90 void _ackOrNakTimeout(
void);
93 typedef void (
FTPManager::*StateBeginFn) (void);
95 typedef void (
FTPManager::*StateTimeoutFn) (void);
97 struct StateFunctions_t {
99 StateAckNakFn ackNakFn;
100 StateTimeoutFn timeoutFn;
103 struct MissingData_t {
105 uint32_t cBytesMissing;
108 struct DownloadState_t {
110 uint32_t expectedOffset;
111 uint32_t bytesWritten;
112 QList<MissingData_t> rgMissingData;
113 QString fullPathOnVehicle;
120 int sessionReopenCount;
121 int resumeStateIndex;
124 bool inProgress()
const {
return active; }
132 sessionReopenCount = 0;
133 resumeStateIndex = -1;
135 fullPathOnVehicle.clear();
137 rgMissingData.clear();
142 struct ListDirectoryState_t {
144 uint32_t expectedOffset;
145 QString fullPathOnVehicle;
146 QStringList rgDirectoryList;
150 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
155 fullPathOnVehicle.clear();
156 rgDirectoryList.clear();
166 struct DeleteFileState_t {
167 QString fullPathOnVehicle;
170 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
173 fullPathOnVehicle.clear();
178 struct UploadState_t {
180 uint32_t totalBytesSent;
182 uint32_t lastChunkSize;
184 QString fullPathOnVehicle;
185 QString localFilePath;
189 bool inProgress()
const {
return file.isOpen(); }
198 fullPathOnVehicle.clear();
199 localFilePath.clear();
205 void _startStateMachine (
void);
206 void _advanceStateMachine (
void);
207 void _listDirectoryBegin (
void);
208 void _listDirectoryAckOrNak (
const MavlinkFTP::Request* ackOrNak);
209 void _listDirectoryTimeout (
void);
210 void _openFileROBegin (
void);
211 void _openFileROAckOrNak (
const MavlinkFTP::Request* ackOrNak);
212 void _openFileROTimeout (
void);
213 void _burstReadFileBegin (
void);
214 void _burstReadFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
215 void _burstReadFileTimeout (
void);
216 void _fillMissingBlocksBegin (
void);
217 void _fillMissingBlocksAckOrNak (
const MavlinkFTP::Request* ackOrNak);
218 void _fillMissingBlocksTimeout (
void);
219 void _resetSessionsBegin (
void);
220 void _resetSessionsAckOrNak (
const MavlinkFTP::Request* ackOrNak);
221 void _resetSessionsTimeout (
void);
223 void _clearStaleSessionsBegin (
void);
224 void _clearStaleSessionsAckOrNak (
const MavlinkFTP::Request* ackOrNak);
225 void _clearStaleSessionsTimeout (
void);
227 void _sendResetSessionsNoAck (
void);
229 void _setStateMachine (
const StateFunctions_t* rgStates,
size_t cStates);
230 QString _errorMsgFromNak (
const MavlinkFTP::Request* nak);
231 void _sendRequestExpectAck (MavlinkFTP::Request* request);
232 void _downloadCompleteNoError (
void) { _downloadComplete(QString()); }
233 void _downloadComplete (
const QString& errorMsg);
234 void _fillRequestDataWithString(MavlinkFTP::Request* request,
const QString& str);
235 void _fillMissingBlocksWorker (
bool firstRequest);
236 void _burstReadFileWorker (
bool firstRequest);
238 uint8_t _readChunkSize (
void)
const;
240 void _downloadSessionLost (
void);
242 bool _claimMissingRange (uint32_t offset, uint32_t cBytes);
243 void _listDirectoryWorker (
bool firstRequest);
244 bool _parseURI (uint8_t fromCompId,
const QString& uri, QString& parsedURI, uint8_t& compId);
245 void _listDirectoryCompleteNoError(
void) { _listDirectoryComplete(QString()); }
246 void _listDirectoryComplete (
const QString& errorMsg);
247 void _deleteFileBegin (
void);
248 void _deleteFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
249 void _deleteFileTimeout (
void);
250 void _deleteCompleteNoError (
void) { _deleteComplete(QString()); }
251 void _deleteComplete (
const QString& errorMsg);
253 void _createFileBegin (
void);
254 void _createFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
255 void _createFileTimeout (
void);
256 void _writeFileBegin (
void);
257 void _writeFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
258 void _writeFileTimeout (
void);
259 void _writeFileWorker (
bool firstRequest);
260 void _uploadFinalize (
void);
261 void _uploadComplete (
const QString& errorMsg);
262 void _terminateUploadSessionBegin(
void);
263 void _terminateUploadSessionAckOrNak(
const MavlinkFTP::Request* ackOrNak);
264 void _terminateUploadSessionTimeout(
void);
267 uint8_t _ftpCompId = MAV_COMP_ID_AUTOPILOT1;
268 QList<StateFunctions_t> _rgStateMachine;
269 DownloadState_t _downloadState;
270 ListDirectoryState_t _listDirectoryState;
271 DeleteFileState_t _deleteState;
272 UploadState_t _uploadState;
273 QTimer _ackOrNakTimeoutTimer;
274 int _currentStateMachineIndex = -1;
275 int _clearStaleSessionsRetryCount = 0;
276 uint16_t _expectedIncomingSeqNumber = 0;
277 WithTimeSupport_t _listDirWithTimeSupport = WithTimeSupport_t::Unknown;
280 static const int _ackOrNakTimeoutMsecs = 3000;
281 static const int _maxRetry = 3;