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#include "SerialPortManager.h"
6
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;
17
31
32/*===========================================================================*/
33
35{
36 Q_OBJECT
37 Q_PROPERTY(qint32 baud READ baud WRITE setBaud NOTIFY baudChanged)
41 Q_PROPERTY(QSerialPort::Parity parity READ parity WRITE setParity NOTIFY parityChanged)
42 Q_PROPERTY(QString portName READ portName WRITE setPortName NOTIFY portNameChanged)
43 Q_PROPERTY(QString portDisplayName READ portDisplayName NOTIFY portDisplayNameChanged)
44 Q_PROPERTY(bool usbDirect READ usbDirect WRITE setUsbDirect NOTIFY usbDirectChanged)
45 Q_PROPERTY(bool dtrForceLow READ dtrForceLow WRITE setdtrForceLow NOTIFY dtrForceLowChanged)
46
47public:
48 explicit SerialConfiguration(const QString &name, QObject *parent = nullptr);
49 explicit SerialConfiguration(const SerialConfiguration *copy, QObject *parent = nullptr);
50 virtual ~SerialConfiguration();
51
52 LinkType type() const override { return LinkConfiguration::TypeSerial; }
53 void copyFrom(const LinkConfiguration *source) override;
54 void loadSettings(QSettings &settings, const QString &root) override;
55 void saveSettings(QSettings &settings, const QString &root) const override;
56 QString settingsURL() const override { return QStringLiteral("SerialSettings.qml"); }
57 QString settingsTitle() const override { return tr("Serial Link Settings"); }
58
59 qint32 baud() const { return _baud; }
60 void setBaud(qint32 baud) { if (baud != _baud) { _baud = baud; emit baudChanged(); } }
61
62 QSerialPort::DataBits dataBits() const { return _dataBits; }
63 void setDataBits(QSerialPort::DataBits databits) { if (databits != _dataBits) { _dataBits = databits; emit dataBitsChanged(); } }
64
65 QSerialPort::FlowControl flowControl() const { return _flowControl; }
66 void setFlowControl(QSerialPort::FlowControl flowControl) { if (flowControl != _flowControl) { _flowControl = flowControl; emit flowControlChanged(); } }
67
68 QSerialPort::StopBits stopBits() const { return _stopBits; }
69 void setStopBits(QSerialPort::StopBits stopBits) { if (stopBits != _stopBits) { _stopBits = stopBits; emit stopBitsChanged(); } }
70
71 QSerialPort::Parity parity() const { return _parity; }
72 void setParity(QSerialPort::Parity parity) { if (parity != _parity) { _parity = parity; emit parityChanged(); } }
73
74 QString portName() const { return _portName; }
75 void setPortName(const QString &name);
76
77 QString portDisplayName() const { return _portDisplayName; }
78 void setPortDisplayName(const QString &portDisplayName) { if (portDisplayName != _portDisplayName) { _portDisplayName = portDisplayName; emit portDisplayNameChanged(); } }
79
80 bool usbDirect() const { return _usbDirect; }
81 void setUsbDirect(bool usbDirect) { if (usbDirect != _usbDirect) { _usbDirect = usbDirect; emit usbDirectChanged(); } }
82
84 bool sikRadio() const { return _sikRadio; }
85 void setSikRadio(bool sikRadio) { _sikRadio = sikRadio; }
86
87 bool dtrForceLow() const { return _dtrForceLow; }
88 void setdtrForceLow(bool dtrForceLow) { if (dtrForceLow != _dtrForceLow) { _dtrForceLow = dtrForceLow; emit dtrForceLowChanged(); } }
89
91
92 static QStringList supportedBaudRates();
93 static QString cleanPortDisplayName(const QString &name);
94
95signals:
105
106private:
107 qint32 _baud = QSerialPort::Baud57600;
112 QString _portName;
113 QString _portDisplayName;
114 bool _usbDirect = false;
115 bool _sikRadio = false;
116 bool _dtrForceLow = false;
117};
118
119/*===========================================================================*/
120
121class SerialWorker : public QObject
122{
123 Q_OBJECT
124
125public:
127 QObject* parent = nullptr);
129
130 bool isConnected() const;
131 const QSerialPort *port() const { return _port; }
132
133signals:
134 void connected();
136 void dataReceived(const QByteArray &data);
137 void dataSent(const QByteArray &data);
138 void errorOccurred(const QString &errorString);
139
140public slots:
141 void setupPort();
142 void connectToPort();
143 void disconnectFromPort();
144 void writeData(const QByteArray &data);
145 void checkPortAvailability(const QStringList& availablePorts);
146
147private slots:
148 void _onPortConnected();
149 void _onPortDisconnected();
150 void _onPortReadyRead();
151 void _onPortBytesWritten(qint64 bytes) const;
152 void _onPortErrorOccurred(QSerialPort::SerialPortError portError);
153
154private:
155 bool _configurePort();
156
157 const SerialConnectionSettings _settings;
158 const SerialPortManager::ReservationPtr _reservation;
159 QSerialPort *_port = nullptr;
160 std::atomic<bool> _isConnected{false};
161 bool _errorEmitted = false;
162};
163
164/*===========================================================================*/
165
167{
168 Q_OBJECT
169
170public:
172 QObject* parent = nullptr);
173 virtual ~SerialLink();
174
175 bool isConnected() const override;
176 bool isSecureConnection() const override { return _serialConfig->usbDirect(); }
177 bool isRadioLink() const override { return _serialConfig->sikRadio() || LinkInterface::isRadioLink(); }
178
179 const QSerialPort *port() const { return _worker->port(); }
180
181public slots:
182 void disconnect() override;
183
184private slots:
185 void _onConnected();
186 void _onDisconnected();
187 void _onDataReceived(const QByteArray &data);
188 void _onDataSent(const QByteArray &data);
189 void _onErrorOccurred(const QString &errorString);
190
191private:
192 bool _connect() override;
193 void _writeBytes(const QByteArray &data) override;
194
195 const SerialConfiguration *_serialConfig = nullptr;
196 const SerialPortManager::ReservationPtr _reservation;
197 SerialWorker *_worker = nullptr;
198 QThread *_workerThread = nullptr;
199 std::atomic<bool> _disconnectedEmitted{false};
200};
Config config
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...
virtual bool isRadioLink() const
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:72
QSerialPort::FlowControl flowControl() const
Definition SerialLink.h:65
void portDisplayNameChanged()
bool sikRadio() const
Port was identified as a SiK radio by USB VID/PID at auto-connect. Runtime only, not persisted.
Definition SerialLink.h:84
QString settingsTitle() const override
Settings Title, Pure virtual method providing the Title for the (QML) settings dialog.
Definition SerialLink.h:57
void loadSettings(QSettings &settings, const QString &root) override
Definition SerialLink.cc:78
QSerialPort::StopBits stopBits() const
Definition SerialLink.h:68
void saveSettings(QSettings &settings, const QString &root) const override
Definition SerialLink.cc:96
SerialConnectionSettings connectionSettings() const
void setStopBits(QSerialPort::StopBits stopBits)
Definition SerialLink.h:69
void setPortDisplayName(const QString &portDisplayName)
Definition SerialLink.h:78
qint32 baud() const
Definition SerialLink.h:59
void setBaud(qint32 baud)
Definition SerialLink.h:60
void setDataBits(QSerialPort::DataBits databits)
Definition SerialLink.h:63
void setdtrForceLow(bool dtrForceLow)
Definition SerialLink.h:88
bool usbDirect() const
Definition SerialLink.h:80
static QStringList supportedBaudRates()
QString portName() const
Definition SerialLink.h:74
QString portDisplayName() const
Definition SerialLink.h:77
QSerialPort::Parity parity() const
Definition SerialLink.h:71
void setUsbDirect(bool usbDirect)
Definition SerialLink.h:81
LinkType type() const override
Definition SerialLink.h:52
QSerialPort::DataBits dataBits() const
Definition SerialLink.h:62
bool dtrForceLow() const
Definition SerialLink.h:87
void copyFrom(const LinkConfiguration *source) override
Definition SerialLink.cc:56
static QString cleanPortDisplayName(const QString &name)
void setFlowControl(QSerialPort::FlowControl flowControl)
Definition SerialLink.h:66
void setSikRadio(bool sikRadio)
Definition SerialLink.h:85
QString settingsURL() const override
Settings URL, Pure virtual method providing the URL for the (QML) settings dialog.
Definition SerialLink.h:56
void setPortName(const QString &name)
Definition SerialLink.cc:36
virtual ~SerialConfiguration()
Definition SerialLink.cc:31
std::shared_ptr< const Reservation > ReservationPtr
void connectToPort()
void dataReceived(const QByteArray &data)
void disconnectFromPort()
void connected()
void checkPortAvailability(const QStringList &availablePorts)
void dataSent(const QByteArray &data)
void disconnected()
void writeData(const QByteArray &data)
const QSerialPort * port() const
Definition SerialLink.h:131
void setupPort()
void errorOccurred(const QString &errorString)
bool isConnected() const
Captured on the application thread; changes take effect on the next connection.
Definition SerialLink.h:20
QSerialPort::StopBits stopBits
Definition SerialLink.h:25
QSerialPort::DataBits dataBits
Definition SerialLink.h:23
QSerialPort::FlowControl flowControl
Definition SerialLink.h:24
QSerialPort::Parity parity
Definition SerialLink.h:26