QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
LogRemoteSink.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QChronoTimer>
4#include <QtCore/QList>
5#include <QtCore/QObject>
6#include <QtCore/QString>
7#include <QtQmlIntegration/QtQmlIntegration>
8#include <chrono>
9
10#include "TransportStrategy.h"
11
12struct LogEntry;
13
14class LogRemoteSink : public QObject
15{
16 Q_OBJECT
17 QML_ELEMENT
18 QML_UNCREATABLE("")
19
20 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
21 Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)
22 Q_PROPERTY(quint16 port READ port WRITE setPort NOTIFY portChanged)
23 Q_PROPERTY(QString vehicleId READ vehicleId WRITE setVehicleId NOTIFY vehicleIdChanged)
24
25 Q_PROPERTY(TransportStrategy::Protocol protocol READ protocol WRITE setProtocol NOTIFY protocolChanged)
26 Q_PROPERTY(bool tcpConnected READ tcpConnected NOTIFY tcpConnectedChanged)
27
28 Q_PROPERTY(bool tlsEnabled READ tlsEnabled WRITE setTlsEnabled NOTIFY tlsEnabledChanged)
29 Q_PROPERTY(bool tlsVerifyPeer READ tlsVerifyPeer WRITE setTlsVerifyPeer NOTIFY tlsVerifyPeerChanged)
30
31 Q_PROPERTY(
32 bool compressionEnabled READ compressionEnabled WRITE setCompressionEnabled NOTIFY compressionEnabledChanged)
33 Q_PROPERTY(int compressionLevel READ compressionLevel WRITE setCompressionLevel NOTIFY compressionLevelChanged)
34
35 Q_PROPERTY(quint64 bytesSent READ bytesSent NOTIFY bytesSentChanged)
36 Q_PROPERTY(quint64 droppedEntries READ droppedEntries NOTIFY droppedEntriesChanged)
37 Q_PROPERTY(QString lastError READ lastError NOTIFY lastErrorChanged)
38 Q_PROPERTY(QString lastTlsError READ lastTlsError NOTIFY lastTlsErrorChanged)
39 Q_PROPERTY(int maxPendingEntries READ maxPendingEntries WRITE setMaxPendingEntries NOTIFY maxPendingEntriesChanged)
40
41public:
42 // Re-export for QML access (TransportStrategy isn't a QML type)
43 enum RemoteProtocol
44 {
45 UDP = static_cast<int>(TransportStrategy::Protocol::UDP),
46 TCP = static_cast<int>(TransportStrategy::Protocol::TCP),
47 AutoFallback = static_cast<int>(TransportStrategy::Protocol::AutoFallback),
48 };
49 Q_ENUM(RemoteProtocol)
50 static_assert(AutoFallback == 2, "RemoteProtocol out of sync with TransportStrategy::Protocol");
51
52 explicit LogRemoteSink(QObject* parent = nullptr);
53 ~LogRemoteSink() override;
54
55 bool enabled() const { return _enabled; }
56
57 void setEnabled(bool enabled);
58
59 // Delegated to TransportStrategy — single source of truth
60 QString host() const { return _transport.host(); }
61
62 void setHost(const QString& host);
63
64 quint16 port() const { return _transport.port(); }
65
66 void setPort(quint16 port);
67
68 QString vehicleId() const { return _vehicleId; }
69
70 void setVehicleId(const QString& id);
71
72 TransportStrategy::Protocol protocol() const { return _transport.protocol(); }
73
74 void setProtocol(TransportStrategy::Protocol protocol);
75
76 bool tcpConnected() const { return _transport.tcpConnected(); }
77
78 bool tlsEnabled() const { return _transport.tlsEnabled(); }
79
80 void setTlsEnabled(bool enabled);
81
82 bool tlsVerifyPeer() const { return _transport.tlsVerifyPeer(); }
83
84 void setTlsVerifyPeer(bool verify);
85
86 bool compressionEnabled() const { return _compressionEnabled; }
87
88 void setCompressionEnabled(bool enabled);
89
90 int compressionLevel() const { return _compressionLevel; }
91
92 void setCompressionLevel(int level);
93
94 quint64 bytesSent() const { return _bytesSent; }
95
96 quint64 droppedEntries() const { return _droppedEntries; }
97
98 QString lastError() const { return _lastError; }
99
100 QString lastTlsError() const { return _lastTlsError; }
101
102 Q_INVOKABLE void resetBytesSent();
103 Q_INVOKABLE bool loadTlsCaCertificates(const QString& filePath);
104 Q_INVOKABLE bool loadTlsClientCertificate(const QString& certPath, const QString& keyPath);
105
106 int maxPendingEntries() const { return _maxPendingEntries; }
107
108 void setMaxPendingEntries(int max);
109
110 void send(const LogEntry& entry);
111
112signals:
128 void errorOccurred(const QString& message);
129
130private slots:
131 void _flushBatch();
132
133private:
134 void _setLastError(const QString& error);
135 void _setLastTlsError(const QString& error);
136 QByteArray _formatEntry(const LogEntry& entry) const;
137 QByteArray _maybeCompress(const QByteArray& data) const;
138
139 bool _enabled = false;
140 QString _vehicleId;
141
142 bool _compressionEnabled = false;
143 int _compressionLevel = 6;
144
145 quint64 _bytesSent = 0;
146 quint64 _droppedEntries = 0;
147 QString _lastError;
148 QString _lastTlsError;
149
150 TransportStrategy _transport;
151 QChronoTimer _batchTimer{std::chrono::milliseconds{kBatchIntervalMs}};
152 QList<QByteArray> _batch;
153 int _maxPendingEntries = 1000;
154
155 static constexpr int kBatchSize = 50;
156 static constexpr int kBatchIntervalMs = 200;
157};
Error error
void droppedEntriesChanged()
void protocolChanged()
void vehicleIdChanged()
void errorOccurred(const QString &message)
void enabledChanged()
void bytesSentChanged()
void tcpConnectedChanged()
void tlsEnabledChanged()
void compressionLevelChanged()
void portChanged()
void lastTlsErrorChanged()
void lastErrorChanged()
void compressionEnabledChanged()
void tlsVerifyPeerChanged()
void maxPendingEntriesChanged()
void hostChanged()
Protocol protocol() const
quint16 port() const
QString host() const
bool tlsEnabled() const
bool tlsVerifyPeer() const