QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
qserialport_p.h
Go to the documentation of this file.
1// Copyright (C) 2011-2012 Denis Shienkov <denis.shienkov@gmail.com>
2// Copyright (C) 2011 Sergey Belyashov <Sergey.Belyashov@gmail.com>
3// Copyright (C) 2012 Laszlo Papp <lpapp@kde.org>
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6#pragma once
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <atomic>
20
21#include <QtCore/QDeadlineTimer>
22#include <QtCore/QLoggingCategory>
23#include <QtCore/QMutex>
24#include <QtCore/QWaitCondition>
25#include <QtCore/private/qiodevice_p.h>
26#include <QtCore/private/qproperty_p.h>
27
28#include "AndroidSerial.h"
29#include "qserialport.h"
30
31constexpr int INVALID_DEVICE_ID = 0;
32constexpr int MIN_READ_TIMEOUT = 500;
33constexpr qint64 MAX_READ_SIZE = 16 * 1024;
35constexpr qint64 DEFAULT_WRITE_BUFFER_SIZE = 16 * 1024;
36constexpr int DEFAULT_WRITE_TIMEOUT = 5000;
37// Best-effort send of buffered writes when closing; a stalled link must not delay close.
38constexpr int CLOSE_WRITE_TIMEOUT = 100;
39constexpr int DEFAULT_READ_TIMEOUT = 0;
40constexpr int EMIT_THRESHOLD = 64;
41
42#ifndef QSERIALPORT_BUFFERSIZE
43#define QSERIALPORT_BUFFERSIZE DEFAULT_WRITE_BUFFER_SIZE
44#endif
45
46Q_DECLARE_LOGGING_CATEGORY(AndroidSerialPortLog)
47
49
50class QSocketNotifier;
51
60
61class QSerialPortPrivate : public QIODevicePrivate
62{
63public:
64 Q_DECLARE_PUBLIC(QSerialPort)
65
67
68 bool open(QIODevice::OpenMode mode);
69 void close();
70
71 bool flush();
72
73 bool flushBeforeClose() { return _writeDataOneShot(CLOSE_WRITE_TIMEOUT); }
74 bool clear(QSerialPort::Directions directions);
75
76 QSerialPort::PinoutSignals pinoutSignals();
77
78 bool setDataTerminalReady(bool set);
79 bool setRequestToSend(bool set);
80
81 bool setBaudRate();
82 bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions);
84 bool setParity(QSerialPort::Parity parity);
87
88 bool setBreakEnabled(bool set);
89
90 void setError(const QSerialPortErrorInfo& errorInfo);
91
93 {
94 setError(error_);
95 }
98
99 bool setBindableDataBits(QSerialPort::DataBits dataBits_)
100 {
101 return q_func()->setDataBits(dataBits_);
102 }
104 &QSerialPortPrivate::setBindableDataBits, QSerialPort::Data8)
105
106 bool setBindableParity(QSerialPort::Parity parity_)
107 {
108 return q_func()->setParity(parity_);
109 }
111 &QSerialPortPrivate::setBindableParity, QSerialPort::NoParity)
112
113 bool setBindableStopBits(QSerialPort::StopBits stopBits_)
114 {
115 return q_func()->setStopBits(stopBits_);
116 }
118 &QSerialPortPrivate::setBindableStopBits, QSerialPort::OneStop)
119
120 bool setBindableFlowControl(QSerialPort::FlowControl flowControl_)
121 {
122 return q_func()->setFlowControl(flowControl_);
123 }
125 &QSerialPortPrivate::setBindableFlowControl, QSerialPort::NoFlowControl)
126
127 bool setBindableBreakEnabled(bool isBreakEnabled_)
128 {
129 return q_func()->setBreakEnabled(isBreakEnabled_);
130 }
132 &QSerialPortPrivate::setBindableBreakEnabled, false)
133
134 bool waitForReadyRead(int msec);
135 bool waitForBytesWritten(int msec);
136
137 bool startAsyncRead();
138
139 qint64 writeData(const char* data, qint64 maxSize);
140
141 void newDataArrived(const char* bytes, int length);
142 void exceptionArrived(const QString& ex);
143
144 static QList<qint32> standardBaudRates();
145
147 qint32 inputBaudRate = QSerialPort::Baud9600;
148 qint32 outputBaudRate = QSerialPort::Baud9600;
150 int descriptor = -1;
151
152private:
153 qint64 _writeToPort(const char* data, qint64 maxSize, int timeout = DEFAULT_WRITE_TIMEOUT, bool async = false);
155 qint64 _writeToPortWithProgress(const char* data, qint64 maxSize, int timeout);
156 void _scheduleWrite();
157 static int _writeTimeoutMs(const QDeadlineTimer& deadline);
158 bool _stopAsyncRead();
159 void _scheduleReadyRead();
160 qsizetype _pendingSizeLocked() const;
161 void _compactPendingDataLocked();
162 qint64 _drainPendingDataLocked(qint64 maxBytes = -1);
163 bool _setParameters(qint32 baudRate, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits,
164 QSerialPort::Parity parity);
165 bool _writeDataOneShot(int msecs = DEFAULT_WRITE_TIMEOUT);
166
167 static int _stopBitsToAndroidStopBits(QSerialPort::StopBits stopBits);
168 static int _dataBitsToAndroidDataBits(QSerialPort::DataBits dataBits);
169 static int _parityToAndroidParity(QSerialPort::Parity parity);
170 static int _flowControlToAndroidFlowControl(QSerialPort::FlowControl flowControl);
171
172 // POSIX backend (AndroidSerial::usePosixSerial()) — implemented in qserialport_posix.cpp
173 bool _posixOpen(QIODevice::OpenMode mode);
174 void _posixClose();
175 bool _posixStartAsyncRead();
176 bool _posixStopAsyncRead();
177 qint64 _posixWrite(const char* data, qint64 maxSize, int timeoutMs);
178 qint64 _posixWriteWithProgress(const char* data, qint64 maxSize, int timeoutMs);
179 bool _posixApplyPortSettings(qint32 baudRate, QSerialPort::DataBits dataBits,
180 QSerialPort::StopBits stopBits, QSerialPort::Parity parity,
181 QSerialPort::FlowControl flowControl);
182 bool _posixClear(QSerialPort::Directions directions);
183 QSerialPort::PinoutSignals _posixPinoutSignals();
184 bool _posixSetDataTerminalReady(bool set);
185 bool _posixSetRequestToSend(bool set);
186 bool _posixSetBreakEnabled(bool set);
187 bool _posixWaitForReadyRead(int msecs);
188 void _posixReadActivated();
189
190 QSocketNotifier* _posixReadNotifier = nullptr;
191
192 int _deviceId = INVALID_DEVICE_ID;
193
194 std::atomic<bool> _readyReadPending{false};
195 bool _writePending = false;
196 std::atomic<qint64> _bufferBytesEstimate{0};
197 QMutex _readMutex;
198 QWaitCondition _readWaitCondition;
199 QByteArray _pendingData;
200 qsizetype _pendingDataOffset = 0;
201};
202
203QT_END_NAMESPACE
Error error
QSerialPort::SerialPortError errorCode
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, QSerialPort::Parity, parity, &QSerialPortPrivate::setBindableParity, QSerialPort::NoParity) bool setBindableStopBits(QSerialPort
bool waitForBytesWritten(int msec)
void setError(const QSerialPortErrorInfo &errorInfo)
bool setDataTerminalReady(bool set)
bool setStopBits(QSerialPort::StopBits stopBits)
bool setFlowControl(QSerialPort::FlowControl flowControl)
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, QSerialPort::StopBits, stopBits, &QSerialPortPrivate::setBindableStopBits, QSerialPort::OneStop) bool setBindableFlowControl(QSerialPort
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, QSerialPort::DataBits, dataBits, &QSerialPortPrivate::setBindableDataBits, QSerialPort::Data8) bool setBindableParity(QSerialPort
QSerialPort::PinoutSignals pinoutSignals()
bool clear(QSerialPort::Directions directions)
bool setDataBits(QSerialPort::DataBits dataBits)
bool open(QIODevice::OpenMode mode)
void setBindableError(QSerialPort::SerialPortError error_)
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, QSerialPort::SerialPortError, error, &QSerialPortPrivate::setBindableError, QSerialPort::NoError) bool setBindableDataBits(QSerialPort
static QList< qint32 > standardBaudRates()
qint64 writeData(const char *data, qint64 maxSize)
bool setRequestToSend(bool set)
void exceptionArrived(const QString &ex)
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, bool, isBreakEnabled, &QSerialPortPrivate::setBindableBreakEnabled, false) bool waitForReadyRead(int msec)
bool setParity(QSerialPort::Parity parity)
void newDataArrived(const char *bytes, int length)
Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSerialPortPrivate, QSerialPort::FlowControl, flowControl, &QSerialPortPrivate::setBindableFlowControl, QSerialPort::NoFlowControl) bool setBindableBreakEnabled(bool isBreakEnabled_)
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
constexpr qint64 DEFAULT_WRITE_BUFFER_SIZE
constexpr qint64 MAX_READ_SIZE
constexpr int MIN_READ_TIMEOUT
constexpr int DEFAULT_READ_TIMEOUT
constexpr int EMIT_THRESHOLD
constexpr int INVALID_DEVICE_ID
constexpr qint64 DEFAULT_READ_BUFFER_SIZE
constexpr int CLOSE_WRITE_TIMEOUT
constexpr int DEFAULT_WRITE_TIMEOUT