Commit e2ce56dc authored by Don Gagne's avatar Don Gagne

List command is now fully working

Also changes for Ack timeouts and unit testing
parent 1a4a9f4f
This diff is collapsed.
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
#ifndef QGCUASFILEMANAGER_H #ifndef QGCUASFILEMANAGER_H
#define QGCUASFILEMANAGER_H #define QGCUASFILEMANAGER_H
#include <QObject> #include <QObject>
#include "UASInterface.h" #include "UASInterface.h"
class QGCUASFileManager : public QObject class QGCUASFileManager : public QObject
...@@ -9,17 +33,22 @@ class QGCUASFileManager : public QObject ...@@ -9,17 +33,22 @@ class QGCUASFileManager : public QObject
Q_OBJECT Q_OBJECT
public: public:
QGCUASFileManager(QObject* parent, UASInterface* uas); QGCUASFileManager(QObject* parent, UASInterface* uas);
/// These methods are only used for testing purposes.
bool _sendCmdTestAck(void) { return _sendOpcodeOnlyCmd(kCmdNone, kCOAck); };
bool _sendCmdTestNoAck(void) { return _sendOpcodeOnlyCmd(kCmdTestNoAck, kCOAck); };
bool _sendCmdReset(void) { return _sendOpcodeOnlyCmd(kCmdReset, kCOAck); };
signals: signals:
void statusMessage(const QString& msg); void statusMessage(const QString& msg);
void resetStatusMessages(); void resetStatusMessages();
void errorMessage(const QString& ms);
public slots: public slots:
void receiveMessage(LinkInterface* link, mavlink_message_t message); void receiveMessage(LinkInterface* link, mavlink_message_t message);
void nothingMessage(); void nothingMessage();
void listRecursively(const QString &from); void listRecursively(const QString &from);
void downloadPath(const QString& from, const QString& to); void downloadPath(const QString& from, const QString& to);
// void timedOut();
protected: protected:
struct RequestHeader struct RequestHeader
...@@ -30,23 +59,32 @@ protected: ...@@ -30,23 +59,32 @@ protected:
uint8_t size; uint8_t size;
uint32_t crc32; uint32_t crc32;
uint32_t offset; uint32_t offset;
uint8_t data[];
}; };
struct Request
{
struct RequestHeader hdr;
// The entire Request must fit into the data member of the mavlink_encapsulated_data_t structure. We use as many leftover bytes
// after we use up space for the RequestHeader for the data portion of the Request.
uint8_t data[sizeof(((mavlink_encapsulated_data_t*)0)->data) - sizeof(RequestHeader)];
};
enum Opcode enum Opcode
{ {
kCmdNone, // ignored, always acked kCmdNone, // ignored, always acked
kCmdTerminate, // releases sessionID, closes file kCmdTerminate, // releases sessionID, closes file
kCmdReset, // terminates all sessions kCmdReset, // terminates all sessions
kCmdList, // list files in <path> from <offset> kCmdList, // list files in <path> from <offset>
kCmdOpen, // opens <path> for reading, returns <session> kCmdOpen, // opens <path> for reading, returns <session>
kCmdRead, // reads <size> bytes from <offset> in <session> kCmdRead, // reads <size> bytes from <offset> in <session>
kCmdCreate, // creates <path> for writing, returns <session> kCmdCreate, // creates <path> for writing, returns <session>
kCmdWrite, // appends <size> bytes at <offset> in <session> kCmdWrite, // appends <size> bytes at <offset> in <session>
kCmdRemove, // remove file (only if created by server?) kCmdRemove, // remove file (only if created by server?)
kRspAck, kRspAck,
kRspNak kRspNak,
kCmdTestNoAck, // ignored, ack not sent back, for testing only, should timeout waiting for ack
}; };
enum ErrorCode enum ErrorCode
...@@ -61,36 +99,49 @@ protected: ...@@ -61,36 +99,49 @@ protected:
kErrNotAppend, kErrNotAppend,
kErrTooBig, kErrTooBig,
kErrIO, kErrIO,
kErrPerm kErrPerm,
kErrUnknownCommand,
kErrCrc
}; };
enum OperationState enum OperationState
{ {
kCOIdle, // not doing anything kCOIdle, // not doing anything
kCOAck, // waiting for an Ack
kCOList, // waiting for a List response kCOList, // waiting for a List response
}; };
OperationState _current_operation;
unsigned _retry_counter; protected slots:
void _ackTimeout(void);
UASInterface* _mav;
quint16 _encdata_seq; protected:
bool _sendOpcodeOnlyCmd(uint8_t opcode, OperationState newOpState);
unsigned _session_id; // session ID for current session void _setupAckTimeout(void);
unsigned _list_offset; // offset for the current List operation void _clearAckTimeout(void);
QString _list_path; // path for the current List operation void _emitErrorMessage(const QString& msg);
void _sendRequest(Request* request);
void sendTerminate();
void sendReset();
void sendList(); void sendList();
void listDecode(const uint8_t *data, unsigned len); void listDecode(const uint8_t *data, unsigned len);
static quint32 crc32(const uint8_t *src, unsigned len, unsigned state); static quint32 crc32(Request* request, unsigned state = 0);
static QString errorString(uint8_t errorCode); static QString errorString(uint8_t errorCode);
OperationState _currentOperation; ///> Current operation of state machine
QTimer _ackTimer; ///> Used to signal a timeout waiting for an ack
static const int _ackTimerTimeoutMsecs = 1000; ///> Timeout in msecs for ack timer
UASInterface* _mav;
quint16 _encdata_seq;
unsigned _listOffset; // offset for the current List operation
QString _listPath; // path for the current List operation
// We give MockMavlinkFileServer friend access so that it can use the data structures and opcodes
// to build a mock mavlink file server for testing.
friend class MockMavlinkFileServer;
}; };
#endif // QGCUASFILEMANAGER_H #endif // QGCUASFILEMANAGER_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment