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);
56 bool deleteFile(uint8_t fromCompId,
const QString& fromURI);
87 void _ackOrNakTimeout(
void);
90 typedef void (
FTPManager::*StateBeginFn) (void);
92 typedef void (
FTPManager::*StateTimeoutFn) (void);
94 struct StateFunctions_t {
96 StateAckNakFn ackNakFn;
97 StateTimeoutFn timeoutFn;
100 struct MissingData_t {
102 uint32_t cBytesMissing;
105 struct DownloadState_t {
107 uint32_t expectedOffset;
108 uint32_t bytesWritten;
109 QList<MissingData_t> rgMissingData;
110 QString fullPathOnVehicle;
118 bool inProgress()
const {
return fileSize > 0; }
126 fullPathOnVehicle.clear();
128 rgMissingData.clear();
133 struct ListDirectoryState_t {
135 uint32_t expectedOffset;
136 QString fullPathOnVehicle;
137 QStringList rgDirectoryList;
141 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
146 fullPathOnVehicle.clear();
147 rgDirectoryList.clear();
157 struct DeleteFileState_t {
158 QString fullPathOnVehicle;
161 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
164 fullPathOnVehicle.clear();
169 struct UploadState_t {
171 uint32_t totalBytesSent;
173 uint32_t lastChunkSize;
175 QString fullPathOnVehicle;
176 QString localFilePath;
180 bool inProgress()
const {
return file.isOpen(); }
189 fullPathOnVehicle.clear();
190 localFilePath.clear();
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);
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);
243 void _terminateSessionBegin (
void);
244 void _terminateSessionAckOrNak (
const MavlinkFTP::Request* ackOrNak);
245 void _terminateSessionTimeout (
void);
246 void _terminateComplete (
void);
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;
260 static const int _ackOrNakTimeoutMsecs = 1000;
261 static const int _maxRetry = 3;