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/QString>
7#ifdef Q_OS_ANDROID
8#include "qserialport.h"
9#else
10#include <QtSerialPort/QSerialPort>
11#endif
12
13#include <atomic>
14
15class QThread;
16class QTimer;
17
18/*===========================================================================*/
19
21{
22 Q_OBJECT
23 Q_PROPERTY(qint32 baud READ baud WRITE setBaud NOTIFY baudChanged)
27 Q_PROPERTY(QSerialPort::Parity parity READ parity WRITE setParity NOTIFY parityChanged)
28 Q_PROPERTY(QString portName READ portName WRITE setPortName NOTIFY portNameChanged)
29 Q_PROPERTY(QString portDisplayName READ portDisplayName NOTIFY portDisplayNameChanged)
30 Q_PROPERTY(bool usbDirect READ usbDirect WRITE setUsbDirect NOTIFY usbDirectChanged)
31 Q_PROPERTY(bool dtrForceLow READ dtrForceLow WRITE setdtrForceLow NOTIFY dtrForceLowChanged)
32
33public:
34 explicit SerialConfiguration(const QString &name, QObject *parent = nullptr);
35 explicit SerialConfiguration(const SerialConfiguration *copy, QObject *parent = nullptr);
36 virtual ~SerialConfiguration();
37
38 LinkType type() const override { return LinkConfiguration::TypeSerial; }
39 void copyFrom(const LinkConfiguration *source) override;
40 void loadSettings(QSettings &settings, const QString &root) override;
41 void saveSettings(QSettings &settings, const QString &root) const override;
42 QString settingsURL() const override { return QStringLiteral("SerialSettings.qml"); }
43 QString settingsTitle() const override { return tr("Serial Link Settings"); }
44
45 qint32 baud() const { return _baud; }
46 void setBaud(qint32 baud) { if (baud != _baud) { _baud = baud; emit baudChanged(); } }
47
48 QSerialPort::DataBits dataBits() const { return _dataBits; }
49 void setDataBits(QSerialPort::DataBits databits) { if (databits != _dataBits) { _dataBits = databits; emit dataBitsChanged(); } }
50
51 QSerialPort::FlowControl flowControl() const { return _flowControl; }
52 void setFlowControl(QSerialPort::FlowControl flowControl) { if (flowControl != _flowControl) { _flowControl = flowControl; emit flowControlChanged(); } }
53
54 QSerialPort::StopBits stopBits() const { return _stopBits; }
55 void setStopBits(QSerialPort::StopBits stopBits) { if (stopBits != _stopBits) { _stopBits = stopBits; emit stopBitsChanged(); } }
56
57 QSerialPort::Parity parity() const { return _parity; }
58 void setParity(QSerialPort::Parity parity) { if (parity != _parity) { _parity = parity; emit parityChanged(); } }
59
60 QString portName() const { return _portName; }
61 void setPortName(const QString &name);
62
63 QString portDisplayName() const { return _portDisplayName; }
64 void setPortDisplayName(const QString &portDisplayName) { if (portDisplayName != _portDisplayName) { _portDisplayName = portDisplayName; emit portDisplayNameChanged(); } }
65
66 bool usbDirect() const { return _usbDirect; }
67 void setUsbDirect(bool usbDirect) { if (usbDirect != _usbDirect) { _usbDirect = usbDirect; emit usbDirectChanged(); } }
68
69 bool dtrForceLow() const { return _dtrForceLow; }
70 void setdtrForceLow(bool dtrForceLow) { if (dtrForceLow != _dtrForceLow) { _dtrForceLow = dtrForceLow; emit dtrForceLowChanged(); } }
71
72 static QStringList supportedBaudRates();
73 static QString cleanPortDisplayName(const QString &name);
74
75signals:
85
86private:
87 qint32 _baud = QSerialPort::Baud57600;
92 QString _portName;
93 QString _portDisplayName;
94 bool _usbDirect = false;
95 bool _dtrForceLow = false;
96};
97
98/*===========================================================================*/
99
100class SerialWorker : public QObject
101{
102 Q_OBJECT
103
104public:
105 explicit SerialWorker(const SerialConfiguration *config, QObject *parent = nullptr);
107
108 bool isConnected() const;
109 const QSerialPort *port() const { return _port; }
110
111signals:
112 void connected();
114 void dataReceived(const QByteArray &data);
115 void dataSent(const QByteArray &data);
116 void errorOccurred(const QString &errorString);
117
118public slots:
119 void setupPort();
120 void connectToPort();
121 void disconnectFromPort();
122 void writeData(const QByteArray &data);
123
124private slots:
125 void _onPortConnected();
126 void _onPortDisconnected();
127 void _onPortReadyRead();
128 void _onPortBytesWritten(qint64 bytes) const;
129 void _onPortErrorOccurred(QSerialPort::SerialPortError portError);
130 void _checkPortAvailability();
131
132private:
133 const SerialConfiguration *_serialConfig = nullptr;
134 QSerialPort *_port = nullptr;
135 QTimer *_timer = nullptr;
136 bool _errorEmitted = false;
137};
138
139/*===========================================================================*/
140
142{
143 Q_OBJECT
144
145public:
146 explicit SerialLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
147 virtual ~SerialLink();
148
149 bool isConnected() const override;
150 bool isSecureConnection() const override { return _serialConfig->usbDirect(); }
151
152 const QSerialPort *port() const { return _worker->port(); }
153
154public slots:
155 void disconnect() override;
156
157private slots:
158 void _onConnected();
159 void _onDisconnected();
160 void _onDataReceived(const QByteArray &data);
161 void _onDataSent(const QByteArray &data);
162 void _onErrorOccurred(const QString &errorString);
163
164private:
165 bool _connect() override;
166 void _writeBytes(const QByteArray &data) override;
167
168 const SerialConfiguration *_serialConfig = nullptr;
169 SerialWorker *_worker = nullptr;
170 QThread *_workerThread = nullptr;
171 std::atomic<bool> _disconnectedEmitted{false};
172};
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
QString errorString
Interface holding link specific settings.
@ TypeSerial
Serial Link.
QString name() const
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
DataBits
This enum describes the number of data bits used.
Definition qserialport.h:60
Parity
This enum describes the parity scheme used.
Definition qserialport.h:69
SerialPortError
This enum describes the errors that may be contained by the QSerialPort::error property.
StopBits
This enum describes the number of stop bits used.
Definition qserialport.h:79
FlowControl
This enum describes the flow control used.
Definition qserialport.h:87
void setParity(QSerialPort::Parity parity)
Definition SerialLink.h:58
QSerialPort::FlowControl flowControl() const
Definition SerialLink.h:51
void portDisplayNameChanged()
QString settingsTitle() const override
Settings Title, Pure virtual method providing the Title for the (QML) settings dialog.
Definition SerialLink.h:43
void loadSettings(QSettings &settings, const QString &root) override
Definition SerialLink.cc:69
QSerialPort::StopBits stopBits() const
Definition SerialLink.h:54
void saveSettings(QSettings &settings, const QString &root) const override
Definition SerialLink.cc:85
void setStopBits(QSerialPort::StopBits stopBits)
Definition SerialLink.h:55
void setPortDisplayName(const QString &portDisplayName)
Definition SerialLink.h:64
qint32 baud() const
Definition SerialLink.h:45
void setBaud(qint32 baud)
Definition SerialLink.h:46
void setDataBits(QSerialPort::DataBits databits)
Definition SerialLink.h:49
void setdtrForceLow(bool dtrForceLow)
Definition SerialLink.h:70
bool usbDirect() const
Definition SerialLink.h:66
static QStringList supportedBaudRates()
QString portName() const
Definition SerialLink.h:60
QString portDisplayName() const
Definition SerialLink.h:63
QSerialPort::Parity parity() const
Definition SerialLink.h:57
void setUsbDirect(bool usbDirect)
Definition SerialLink.h:67
LinkType type() const override
Definition SerialLink.h:38
QSerialPort::DataBits dataBits() const
Definition SerialLink.h:48
bool dtrForceLow() const
Definition SerialLink.h:69
void copyFrom(const LinkConfiguration *source) override
Definition SerialLink.cc:52
static QString cleanPortDisplayName(const QString &name)
void setFlowControl(QSerialPort::FlowControl flowControl)
Definition SerialLink.h:52
QString settingsURL() const override
Settings URL, Pure virtual method providing the URL for the (QML) settings dialog.
Definition SerialLink.h:42
void setPortName(const QString &name)
Definition SerialLink.cc:36
virtual ~SerialConfiguration()
Definition SerialLink.cc:31
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:109
void setupPort()
void errorOccurred(const QString &errorString)
bool isConnected() const