LogDownloadController.h 6.26 KB
Newer Older
1 2
/****************************************************************************
 *
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
dogmaphobic's avatar
dogmaphobic committed
9 10 11 12 13 14 15 16


#ifndef LogDownloadController_H
#define LogDownloadController_H

#include <QObject>
#include <QTimer>
#include <QAbstractListModel>
17
#include <QLocale>
18
#include <QElapsedTimer>
dogmaphobic's avatar
dogmaphobic committed
19 20 21 22 23 24

#include <memory>

#include "UASInterface.h"
#include "AutoPilotPlugin.h"

25 26 27 28
class  MultiVehicleManager;
class  UASInterface;
class  Vehicle;
class  QGCLogEntry;
29
struct LogDownloadData;
dogmaphobic's avatar
dogmaphobic committed
30 31 32 33 34 35 36 37 38 39 40 41 42

Q_DECLARE_LOGGING_CATEGORY(LogDownloadLog)

//-----------------------------------------------------------------------------
class QGCLogModel : public QAbstractListModel
{
    Q_OBJECT
public:

    enum QGCLogModelRoles {
        ObjectRole = Qt::UserRole + 1
    };

43
    QGCLogModel(QObject *parent = nullptr);
dogmaphobic's avatar
dogmaphobic committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

    Q_PROPERTY(int count READ count NOTIFY countChanged)
    Q_INVOKABLE QGCLogEntry* get(int index);

    int         count           (void) const;
    void        append          (QGCLogEntry* entry);
    void        clear           (void);
    QGCLogEntry*operator[]      (int i);

    int         rowCount        (const QModelIndex & parent = QModelIndex()) const;
    QVariant    data            (const QModelIndex & index, int role = Qt::DisplayRole) const;

signals:
    void        countChanged    ();

protected:
    QHash<int, QByteArray> roleNames() const;
private:
    QList<QGCLogEntry*> _logEntries;
};

//-----------------------------------------------------------------------------
class QGCLogEntry : public QObject {
    Q_OBJECT
    Q_PROPERTY(uint         id          READ id                             CONSTANT)
    Q_PROPERTY(QDateTime    time        READ time                           NOTIFY timeChanged)
    Q_PROPERTY(uint         size        READ size                           NOTIFY sizeChanged)
71
    Q_PROPERTY(QString      sizeStr     READ sizeStr                        NOTIFY sizeChanged)
dogmaphobic's avatar
dogmaphobic committed
72 73 74 75 76 77 78 79 80
    Q_PROPERTY(bool         received    READ received                       NOTIFY receivedChanged)
    Q_PROPERTY(bool         selected    READ selected   WRITE setSelected   NOTIFY selectedChanged)
    Q_PROPERTY(QString      status      READ status                         NOTIFY statusChanged)

public:
    QGCLogEntry(uint logId, const QDateTime& dateTime = QDateTime(), uint logSize = 0, bool received = false);

    uint        id          () const { return _logID; }
    uint        size        () const { return _logSize; }
81
    QString     sizeStr     () const;
dogmaphobic's avatar
dogmaphobic committed
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
    QDateTime   time        () const { return _logTimeUTC; }
    bool        received    () const { return _received; }
    bool        selected    () const { return _selected; }
    QString     status      () const { return _status; }

    void        setId       (uint id_)          { _logID = id_; }
    void        setSize     (uint size_)        { _logSize = size_;     emit sizeChanged(); }
    void        setTime     (QDateTime date_)   { _logTimeUTC = date_;  emit timeChanged(); }
    void        setReceived (bool rec_)         { _received = rec_;     emit receivedChanged(); }
    void        setSelected (bool sel_)         { _selected = sel_;     emit selectedChanged(); }
    void        setStatus   (QString stat_)     { _status = stat_;      emit statusChanged(); }

signals:
    void        idChanged       ();
    void        timeChanged     ();
    void        sizeChanged     ();
    void        receivedChanged ();
    void        selectedChanged ();
    void        statusChanged   ();

private:
    uint        _logID;
    uint        _logSize;
    QDateTime   _logTimeUTC;
    bool        _received;
    bool        _selected;
    QString     _status;
};

//-----------------------------------------------------------------------------
112
class LogDownloadController : public QObject
dogmaphobic's avatar
dogmaphobic committed
113 114 115
{
    Q_OBJECT

116 117
public:
    LogDownloadController(void);
dogmaphobic's avatar
dogmaphobic committed
118 119 120 121 122 123 124 125 126 127

    Q_PROPERTY(QGCLogModel* model           READ model              NOTIFY modelChanged)
    Q_PROPERTY(bool         requestingList  READ requestingList     NOTIFY requestingListChanged)
    Q_PROPERTY(bool         downloadingLogs READ downloadingLogs    NOTIFY downloadingLogsChanged)

    QGCLogModel*    model                   () { return &_logEntriesModel; }
    bool            requestingList          () { return _requestingLogEntries; }
    bool            downloadingLogs         () { return _downloadingLogs; }

    Q_INVOKABLE void refresh                ();
128
    Q_INVOKABLE void download               (QString path = QString());
dogmaphobic's avatar
dogmaphobic committed
129 130 131
    Q_INVOKABLE void eraseAll               ();
    Q_INVOKABLE void cancel                 ();

132 133
    void downloadToDirectory(const QString& dir);

dogmaphobic's avatar
dogmaphobic committed
134 135 136 137 138 139 140 141 142 143 144 145 146 147
signals:
    void requestingListChanged  ();
    void downloadingLogsChanged ();
    void modelChanged           ();
    void selectionChanged       ();

private slots:
    void _setActiveVehicle  (Vehicle* vehicle);
    void _logEntry          (UASInterface *uas, uint32_t time_utc, uint32_t size, uint16_t id, uint16_t num_logs, uint16_t last_log_num);
    void _logData           (UASInterface *uas, uint32_t ofs, uint16_t id, uint8_t count, const uint8_t *data);
    void _processDownload   ();

private:
    bool _entriesComplete   ();
148 149
    bool _chunkComplete     () const;
    bool _logComplete       () const;
dogmaphobic's avatar
dogmaphobic committed
150 151 152
    void _findMissingEntries();
    void _receivedAllEntries();
    void _receivedAllData   ();
dogmaphobic's avatar
dogmaphobic committed
153
    void _resetSelection    (bool canceled = false);
dogmaphobic's avatar
dogmaphobic committed
154
    void _findMissingData   ();
dogmaphobic's avatar
dogmaphobic committed
155
    void _requestLogList    (uint32_t start, uint32_t end);
156
    void _requestLogData    (uint16_t id, uint32_t offset, uint32_t count, int retryCount = 0);
dogmaphobic's avatar
dogmaphobic committed
157
    bool _prepareLogDownload();
158
    void _setDownloading    (bool active);
dogmaphobic's avatar
dogmaphobic committed
159
    void _setListing        (bool active);
160
    void _updateDataRate    ();
dogmaphobic's avatar
dogmaphobic committed
161 162 163 164 165 166 167 168 169 170 171

    QGCLogEntry* _getNextSelected();

    UASInterface*       _uas;
    LogDownloadData*    _downloadData;
    QTimer              _timer;
    QGCLogModel         _logEntriesModel;
    Vehicle*            _vehicle;
    bool                _requestingLogEntries;
    bool                _downloadingLogs;
    int                 _retries;
dogmaphobic's avatar
dogmaphobic committed
172
    int                 _apmOneBased;
dogmaphobic's avatar
dogmaphobic committed
173 174 175 176
    QString             _downloadPath;
};

#endif