QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SerialLink.h
Go to the documentation of this file.
1#pragma once
2
3#include "LinkConfiguration.h"
4#include "LinkInterface.h"
5
6#include <QtCore/QLoggingCategory>
7#include <QtCore/QString>
8#ifdef Q_OS_ANDROID
9#include "qserialport.h"
10#else
11#include <QtSerialPort/QSerialPort>
12#endif
13
14#include <atomic>
15
16class QThread;
17class QTimer;
18
19Q_DECLARE_LOGGING_CATEGORY(SerialLinkLog)
20
21/*===========================================================================*/
22
24{
25 Q_OBJECT
26 Q_PROPERTY(qint32 baud READ baud WRITE setBaud NOTIFY baudChanged)
27 Q_PROPERTY(QSerialPort::DataBits dataBits READ dataBits WRITE setDataBits NOTIFY dataBitsChanged)
28 Q_PROPERTY(QSerialPort::FlowControl flowControl READ flowControl WRITE setFlowControl NOTIFY flowControlChanged)
29 Q_PROPERTY(QSerialPort::StopBits stopBits READ stopBits WRITE setStopBits NOTIFY stopBitsChanged)
30 Q_PROPERTY(QSerialPort::Parity parity READ parity WRITE setParity NOTIFY parityChanged)
31 Q_PROPERTY(QString portName READ portName WRITE setPortName NOTIFY portNameChanged)
32 Q_PROPERTY(QString portDisplayName READ portDisplayName NOTIFY portDisplayNameChanged)
33 Q_PROPERTY(bool usbDirect READ usbDirect WRITE setUsbDirect NOTIFY usbDirectChanged)
34 Q_PROPERTY(bool dtrForceLow READ dtrForceLow WRITE setdtrForceLow NOTIFY dtrForceLowChanged)
35
36public:
37 explicit SerialConfiguration(const QString &name, QObject *parent = nullptr);
38 explicit SerialConfiguration(const SerialConfiguration *copy, QObject *parent = nullptr);
39 virtual ~SerialConfiguration();
40
41 LinkType type() const override { return LinkConfiguration::TypeSerial; }
42 void copyFrom(const LinkConfiguration *source) override;
43 void loadSettings(QSettings &settings, const QString &root) override;
44 void saveSettings(QSettings &settings, const QString &root) const override;
45 QString settingsURL() const override { return QStringLiteral("SerialSettings.qml"); }
46 QString settingsTitle() const override { return tr("Serial Link Settings"); }
47
48 qint32 baud() const { return _baud; }
49 void setBaud(qint32 baud) { if (baud != _baud) { _baud = baud; emit baudChanged(); } }
50
51 QSerialPort::DataBits dataBits() const { return _dataBits; }
52 void setDataBits(QSerialPort::DataBits databits) { if (databits != _dataBits) { _dataBits = databits; emit dataBitsChanged(); } }
53
54 QSerialPort::FlowControl flowControl() const { return _flowControl; }
55 void setFlowControl(QSerialPort::FlowControl flowControl) { if (flowControl != _flowControl) { _flowControl = flowControl; emit flowControlChanged(); } }
56
57 QSerialPort::StopBits stopBits() const { return _stopBits; }
58 void setStopBits(QSerialPort::StopBits stopBits) { if (stopBits != _stopBits) { _stopBits = stopBits; emit stopBitsChanged(); } }
59
60 QSerialPort::Parity parity() const { return _parity; }
61 void setParity(QSerialPort::Parity parity) { if (parity != _parity) { _parity = parity; emit parityChanged(); } }
62
63 QString portName() const { return _portName; }
64 void setPortName(const QString &name);
65
66 QString portDisplayName() const { return _portDisplayName; }
67 void setPortDisplayName(const QString &portDisplayName) { if (portDisplayName != _portDisplayName) { _portDisplayName = portDisplayName; emit portDisplayNameChanged(); } }
68
69 bool usbDirect() const { return _usbDirect; }
70 void setUsbDirect(bool usbDirect) { if (usbDirect != _usbDirect) { _usbDirect = usbDirect; emit usbDirectChanged(); } }
71
72 bool dtrForceLow() const { return _dtrForceLow; }
73 void setdtrForceLow(bool dtrForceLow) { if (dtrForceLow != _dtrForceLow) { _dtrForceLow = dtrForceLow; emit dtrForceLowChanged(); } }
74
75 static QStringList supportedBaudRates();
76 static QString cleanPortDisplayName(const QString &name);
77
78signals:
88
89private:
90 qint32 _baud = QSerialPort::Baud57600;
95 QString _portName;
96 QString _portDisplayName;
97 bool _usbDirect = false;
98 bool _dtrForceLow = false;
99};
100
101/*===========================================================================*/
102
103class SerialWorker : public QObject
104{
105 Q_OBJECT
106
107public:
108 explicit SerialWorker(const SerialConfiguration *config, QObject *parent = nullptr);
110
111 bool isConnected() const;
112 const QSerialPort *port() const { return _port; }
113
114signals:
115 void connected();
117 void dataReceived(const QByteArray &data);
118 void dataSent(const QByteArray &data);
119 void errorOccurred(const QString &errorString);
120
121public slots:
122 void setupPort();
123 void connectToPort();
124 void disconnectFromPort();
125 void writeData(const QByteArray &data);
126
127private slots:
128 void _onPortConnected();
129 void _onPortDisconnected();
130 void _onPortReadyRead();
131 void _onPortBytesWritten(qint64 bytes) const;
132 void _onPortErrorOccurred(QSerialPort::SerialPortError portError);
133 void _checkPortAvailability();
134
135private:
136 const SerialConfiguration *_serialConfig = nullptr;
137 QSerialPort *_port = nullptr;
138 QTimer *_timer = nullptr;
139 bool _errorEmitted = false;
140};
141
142/*===========================================================================*/
143
145{
146 Q_OBJECT
147
148public:
149 explicit SerialLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
150 virtual ~SerialLink();
151
152 bool isConnected() const override;
153 bool isSecureConnection() const override { return _serialConfig->usbDirect(); }
154
155 const QSerialPort *port() const { return _worker->port(); }
156
157public slots:
158 void disconnect() override;
159
160private slots:
161 void _onConnected();
162 void _onDisconnected();
163 void _onDataReceived(const QByteArray &data);
164 void _onDataSent(const QByteArray &data);
165 void _onErrorOccurred(const QString &errorString);
166
167private:
168 bool _connect() override;
169 void _writeBytes(const QByteArray &data) override;
170
171 const SerialConfiguration *_serialConfig = nullptr;
172 SerialWorker *_worker = nullptr;
173 QThread *_workerThread = nullptr;
174 std::atomic<bool> _disconnectedEmitted{false};
175};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
QString errorString
Interface holding link specific settings.
The link interface defines the interface for all links used to communicate with the ground station ap...
Provides functions to access serial ports.
Definition qserialport.h:17
void portDisplayNameChanged()
void connectToPort()
void dataReceived(const QByteArray &data)
void disconnectFromPort()
void connected()
void dataSent(const QByteArray &data)
void disconnected()
void writeData(const QByteArray &data)
const QSerialPort * port() const
Definition SerialLink.h:112
void setupPort()
void errorOccurred(const QString &errorString)
bool isConnected() const