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;
121 bool inProgress()
const {
return fileSize > 0; }
129 fullPathOnVehicle.clear();
131 rgMissingData.clear();
136 struct ListDirectoryState_t {
138 uint32_t expectedOffset;
139 QString fullPathOnVehicle;
140 QStringList rgDirectoryList;
144 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
149 fullPathOnVehicle.clear();
150 rgDirectoryList.clear();
160 struct DeleteFileState_t {
161 QString fullPathOnVehicle;
164 bool inProgress()
const {
return !fullPathOnVehicle.isEmpty(); }
167 fullPathOnVehicle.clear();
172 struct UploadState_t {
174 uint32_t totalBytesSent;
176 uint32_t lastChunkSize;
178 QString fullPathOnVehicle;
179 QString localFilePath;
183 bool inProgress()
const {
return file.isOpen(); }
192 fullPathOnVehicle.clear();
193 localFilePath.clear();
199 void _startStateMachine (
void);
200 void _advanceStateMachine (
void);
201 void _listDirectoryBegin (
void);
202 void _listDirectoryAckOrNak (
const MavlinkFTP::Request* ackOrNak);
203 void _listDirectoryTimeout (
void);
204 void _openFileROBegin (
void);
205 void _openFileROAckOrNak (
const MavlinkFTP::Request* ackOrNak);
206 void _openFileROTimeout (
void);
207 void _burstReadFileBegin (
void);
208 void _burstReadFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
209 void _burstReadFileTimeout (
void);
210 void _fillMissingBlocksBegin (
void);
211 void _fillMissingBlocksAckOrNak (
const MavlinkFTP::Request* ackOrNak);
212 void _fillMissingBlocksTimeout (
void);
213 void _resetSessionsBegin (
void);
214 void _resetSessionsAckOrNak (
const MavlinkFTP::Request* ackOrNak);
215 void _resetSessionsTimeout (
void);
216 QString _errorMsgFromNak (
const MavlinkFTP::Request* nak);
217 void _sendRequestExpectAck (MavlinkFTP::Request* request);
218 void _downloadCompleteNoError (
void) { _downloadComplete(QString()); }
219 void _downloadComplete (
const QString& errorMsg);
220 void _fillRequestDataWithString(MavlinkFTP::Request* request,
const QString& str);
221 void _fillMissingBlocksWorker (
bool firstRequest);
222 void _burstReadFileWorker (
bool firstRequest);
223 void _listDirectoryWorker (
bool firstRequest);
224 bool _parseURI (uint8_t fromCompId,
const QString& uri, QString& parsedURI, uint8_t& compId);
225 void _listDirectoryCompleteNoError(
void) { _listDirectoryComplete(QString()); }
226 void _listDirectoryComplete (
const QString& errorMsg);
227 void _deleteFileBegin (
void);
228 void _deleteFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
229 void _deleteFileTimeout (
void);
230 void _deleteCompleteNoError (
void) { _deleteComplete(QString()); }
231 void _deleteComplete (
const QString& errorMsg);
233 void _createFileBegin (
void);
234 void _createFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
235 void _createFileTimeout (
void);
236 void _writeFileBegin (
void);
237 void _writeFileAckOrNak (
const MavlinkFTP::Request* ackOrNak);
238 void _writeFileTimeout (
void);
239 void _writeFileWorker (
bool firstRequest);
240 void _uploadFinalize (
void);
241 void _uploadComplete (
const QString& errorMsg);
242 void _terminateUploadSessionBegin(
void);
243 void _terminateUploadSessionAckOrNak(
const MavlinkFTP::Request* ackOrNak);
244 void _terminateUploadSessionTimeout(
void);
246 void _terminateSessionBegin (
void);
247 void _terminateSessionAckOrNak (
const MavlinkFTP::Request* ackOrNak);
248 void _terminateSessionTimeout (
void);
249 void _terminateComplete (
void);
252 uint8_t _ftpCompId = MAV_COMP_ID_AUTOPILOT1;
253 QList<StateFunctions_t> _rgStateMachine;
254 DownloadState_t _downloadState;
255 ListDirectoryState_t _listDirectoryState;
256 DeleteFileState_t _deleteState;
257 UploadState_t _uploadState;
258 QTimer _ackOrNakTimeoutTimer;
259 int _currentStateMachineIndex = -1;
260 uint16_t _expectedIncomingSeqNumber = 0;
261 WithTimeSupport_t _listDirWithTimeSupport = WithTimeSupport_t::Unknown;
263 static const int _ackOrNakTimeoutMsecs = 1000;
264 static const int _maxRetry = 3;