QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
OnboardLogController.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QElapsedTimer>
4#include <QtCore/QObject>
5#include <QtCore/QQueue>
6#include <QtCore/QStringList>
7#include <QtQmlIntegration/QtQmlIntegration>
8
12class QTimer;
13class QThread;
14class Vehicle;
15class OnboardLogDownloadTest;
16class OnboardLogFtpDownloadTest;
17
18class OnboardLogController : public QObject
19{
20 Q_OBJECT
21 QML_ELEMENT
22 QML_SINGLETON
23
24 Q_MOC_INCLUDE("Vehicle.h")
25 Q_MOC_INCLUDE("QmlObjectListModel.h")
26
27 Q_PROPERTY(QmlObjectListModel *model READ _getModel CONSTANT)
28 Q_PROPERTY(bool requestingList READ _getRequestingList NOTIFY requestingListChanged)
29 Q_PROPERTY(bool downloadingLogs READ _getDownloadingLogs NOTIFY downloadingLogsChanged)
30 Q_PROPERTY(bool allLogsSelected READ allLogsSelected NOTIFY selectionChanged)
31 Q_PROPERTY(int selectedCount READ selectedCount NOTIFY selectionChanged)
32 Q_PROPERTY(bool sortAscending READ sortAscending WRITE setSortAscending NOTIFY sortAscendingChanged)
33 Q_PROPERTY(bool compressLogs READ compressLogs WRITE setCompressLogs NOTIFY compressLogsChanged)
34 Q_PROPERTY(bool compressing READ compressing NOTIFY compressingChanged)
36 Q_PROPERTY(QString transport READ transport NOTIFY transportChanged)
37
40
41public:
42 explicit OnboardLogController(QObject *parent = nullptr);
44
45 Q_INVOKABLE void refresh();
46 Q_INVOKABLE void download(const QString &path = QString());
47 Q_INVOKABLE void eraseAll();
48 Q_INVOKABLE void eraseSelected();
49 Q_INVOKABLE void cancel();
50 Q_INVOKABLE void selectAll(bool select);
51 int selectedCount() const;
52 Q_INVOKABLE void toggleSortByDate();
53
54 bool compressLogs() const { return _compressLogs; }
55 void setCompressLogs(bool compress);
56 bool compressing() const { return _compressing; }
57 float compressionProgress() const { return _compressionProgress; }
58 bool allLogsSelected() const;
59 bool sortAscending() const { return _sortAscending; }
60 void setSortAscending(bool ascending);
61
63 QString transport() const { return (_transport == Transport::Ftp) ? QStringLiteral("ftp") : QStringLiteral("messages"); }
64
66 Q_INVOKABLE bool compressLogFile(const QString &logPath);
67
69 Q_INVOKABLE void cancelCompression();
70
71signals:
80 void compressionComplete(const QString &outputPath, const QString &error);
81
82private slots:
83 void _setActiveVehicle(Vehicle *vehicle);
84
85 void _logEntry(uint32_t time_utc, uint32_t size, uint16_t id, uint16_t num_logs, uint16_t last_log_num);
86 void _logData(uint32_t ofs, uint16_t id, uint8_t count, const uint8_t *data);
87 void _processDownload();
88 void _handleCompressionProgress(qreal progress);
89 void _handleCompressionFinished(bool success);
90
91 void _ftpListDirComplete(const QStringList &dirList, const QString &errorMsg);
92 void _ftpDownloadComplete(const QString &file, const QString &errorMsg);
93 void _ftpDownloadProgress(float value);
94 void _ftpDeleteComplete(const QString &file, const QString &errorMsg);
95
96private:
97 enum class Transport { Messages, Ftp };
98 enum class FtpListState { Idle, ListingRoot, ListingSubdir };
99
100 QmlObjectListModel *_getModel() const { return _logEntriesModel; }
101 bool _getRequestingList() const { return _requestingLogEntries; }
102 bool _getDownloadingLogs() const { return _downloadingLogs; }
103
104 bool _chunkComplete() const;
105 bool _entriesComplete() const;
106 bool _logComplete() const;
107 bool _prepareLogDownload();
108 void _downloadToDirectory(const QString &dir);
109 void _findMissingData();
110 void _findMissingEntries();
111 void _receivedAllData();
112 void _receivedAllEntries();
113 void _requestLogData(uint16_t id, uint32_t offset, uint32_t count, int retryCount = 0);
114 void _requestLogList(uint32_t start, uint32_t end);
115 void _requestLogEnd();
116 void _resetSelection(bool canceled = false);
117 void _setDownloading(bool active);
118 void _setListing(bool active);
119 void _updateDataRate();
120
121 void _sortEntriesByTimestamp();
122
123 void _setTransport(Transport transport);
124 void _ftpStartListing();
125 void _ftpListRoot();
126 void _ftpListNextSubdir();
127 uint _ftpProcessFileEntries(const QStringList &dirList, const QString &subdir);
128 void _ftpFinishListing();
129 void _ftpFallbackToMessages();
130 void _ftpDownloadToDirectory(const QString &dir);
131 void _ftpDownloadEntry(QGCOnboardLogEntry *entry);
132 void _ftpDownloadQueueNext();
133 void _ftpDeleteNext();
134
135 QGCOnboardLogEntry *_getNextSelected() const;
136
137 QTimer *_timer = nullptr;
138 QmlObjectListModel *_logEntriesModel = nullptr;
139
140 bool _downloadingLogs = false;
141 bool _requestingLogEntries = false;
142 int _apmOffset = 0;
143 int _retries = 0;
144 std::unique_ptr<OnboardLogDownloadData> _downloadData;
145 QString _downloadPath;
146 Vehicle *_vehicle = nullptr;
147 bool _compressLogs = false;
148 bool _compressing = false;
149 float _compressionProgress = 0.0F;
150 bool _sortAscending = false;
151
152 Transport _transport = Transport::Messages;
153 bool _ftpDisabled = false;
154 FtpListState _ftpListState = FtpListState::Idle;
155 QString _ftpLogRoot;
156 bool _ftpTriedFallbackRoot = false;
157 QStringList _ftpDirsToList;
158 uint _ftpLogIdCounter = 0;
159 QQueue<QGCOnboardLogEntry*> _ftpDownloadQueue;
160 QQueue<QGCOnboardLogEntry*> _ftpDeleteQueue;
161 bool _ftpDeleting = false;
162 QGCOnboardLogEntry *_ftpCurrentDownloadEntry = nullptr;
163 bool _ftpDownloadHadError = false;
164 QElapsedTimer _ftpDownloadElapsed;
165 size_t _ftpDownloadBytesAtLastUpdate = 0;
166 qreal _ftpDownloadRateAvg = 0.;
167
168 static constexpr uint32_t kTimeOutMs = 500;
169 static constexpr uint32_t kGUIRateMs = 500;
170 static constexpr uint32_t kRequestLogListTimeoutMs = 5000;
171};
Error error
QString transport() const
Transport currently used to list/download logs: "messages" (LOG_* messages) or "ftp" (MAVLink FTP)
Q_INVOKABLE void selectAll(bool select)
Q_INVOKABLE void eraseAll()
Q_INVOKABLE void eraseSelected()
Q_INVOKABLE void download(const QString &path=QString())
void compressionComplete(const QString &outputPath, const QString &error)
void compressionProgressChanged()
Q_INVOKABLE void toggleSortByDate()
float compressionProgress() const
void setCompressLogs(bool compress)
void setSortAscending(bool ascending)
friend class OnboardLogDownloadTest
Q_INVOKABLE bool compressLogFile(const QString &logPath)
Compress a single log file.
friend class OnboardLogFtpDownloadTest
Q_INVOKABLE void cancelCompression()
Cancel compression.