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 <QtCore/QLoggingCategory>
20#include <QtCore/QMutex>
21#include <QtCore/QWaitCondition>
22#include <QtCore/private/qiodevice_p.h>
23#include <QtCore/private/qproperty_p.h>
24
25#include <atomic>
26
27#include "AndroidSerial.h"
28#include "qserialport.h"
29
30constexpr int INVALID_DEVICE_ID = 0;
31constexpr int MIN_READ_TIMEOUT = 500;
32constexpr qint64 MAX_READ_SIZE = 16 * 1024;
34constexpr qint64 DEFAULT_WRITE_BUFFER_SIZE = 16 * 1024;
35constexpr int DEFAULT_WRITE_TIMEOUT = 5000;
36constexpr int DEFAULT_READ_TIMEOUT = 0;
37constexpr int EMIT_THRESHOLD = 64;
38
39#ifndef QSERIALPORT_BUFFERSIZE
40#define QSERIALPORT_BUFFERSIZE DEFAULT_WRITE_BUFFER_SIZE
41#endif
42
43Q_DECLARE_LOGGING_CATEGORY(AndroidSerialPortLog)
44
46
47class QSocketNotifier;
48
57
58class QSerialPortPrivate : public QIODevicePrivate
59{
60public:
61 Q_DECLARE_PUBLIC(QSerialPort)
62
64
65 bool open(QIODevice::OpenMode mode);
66 void close();
67
68 bool flush();
69 bool clear(QSerialPort::Directions directions);
70
71 QSerialPort::PinoutSignals pinoutSignals();
72
73 bool setDataTerminalReady(bool set);
74 bool setRequestToSend(bool set);
75
76 bool setBaudRate();
77 bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions);
79 bool setParity(QSerialPort::Parity parity);
82
83 bool setBreakEnabled(bool set);
84
85 void setError(const QSerialPortErrorInfo& errorInfo);
86
88 {
89 setError(error_);
90 }
93
94 bool setBindableDataBits(QSerialPort::DataBits dataBits_)
95 {
96 return q_func()->setDataBits(dataBits_);
97 }
99 &QSerialPortPrivate::setBindableDataBits, QSerialPort::Data8)
100
101 bool setBindableParity(QSerialPort::Parity parity_)
102 {
103 return q_func()->setParity(parity_);
104 }
106 &QSerialPortPrivate::setBindableParity, QSerialPort::NoParity)
107
108 bool setBindableStopBits(QSerialPort::StopBits stopBits_)
109 {
110 return q_func()->setStopBits(stopBits_);
111 }
113 &QSerialPortPrivate::setBindableStopBits, QSerialPort::OneStop)
114
115 bool setBindableFlowControl(QSerialPort::FlowControl flowControl_)
116 {
117 return q_func()->setFlowControl(flowControl_);
118 }
120 &QSerialPortPrivate::setBindableFlowControl, QSerialPort::NoFlowControl)
121
122 bool setBindableBreakEnabled(bool isBreakEnabled_)
123 {
124 return q_func()->setBreakEnabled(isBreakEnabled_);
125 }
127 &QSerialPortPrivate::setBindableBreakEnabled, false)
128
129 bool waitForReadyRead(int msec);
130 bool waitForBytesWritten(int msec);
131
132 bool startAsyncRead();
133
134 qint64 writeData(const char* data, qint64 maxSize);
135
136 void newDataArrived(const char* bytes, int length);
137 void exceptionArrived(const QString& ex);
138
139 static QList<qint32> standardBaudRates();
140
142 qint32 inputBaudRate = QSerialPort::Baud9600;
143 qint32 outputBaudRate = QSerialPort::Baud9600;
145 int descriptor = -1;
146
147private:
148 qint64 _writeToPort(const char* data, qint64 maxSize, int timeout = DEFAULT_WRITE_TIMEOUT, bool async = false);
149 bool _stopAsyncRead();
150 void _scheduleReadyRead();
151 qsizetype _pendingSizeLocked() const;
152 void _compactPendingDataLocked();
153 qint64 _drainPendingDataLocked(qint64 maxBytes = -1);
154 bool _setParameters(qint32 baudRate, QSerialPort::DataBits dataBits, QSerialPort::StopBits stopBits,
155 QSerialPort::Parity parity);
156 bool _writeDataOneShot(int msecs = DEFAULT_WRITE_TIMEOUT);
157
158 static int _stopBitsToAndroidStopBits(QSerialPort::StopBits stopBits);
159 static int _dataBitsToAndroidDataBits(QSerialPort::DataBits dataBits);
160 static int _parityToAndroidParity(QSerialPort::Parity parity);
161 static int _flowControlToAndroidFlowControl(QSerialPort::FlowControl flowControl);
162
163 // POSIX backend (AndroidSerial::usePosixSerial()) — implemented in qserialport_posix.cpp
164 bool _posixOpen(QIODevice::OpenMode mode);
165 void _posixClose();
166 bool _posixStartAsyncRead();
167 bool _posixStopAsyncRead();
168 qint64 _posixWrite(const char* data, qint64 maxSize, int timeoutMs);
169 bool _posixApplyPortSettings(qint32 baudRate, QSerialPort::DataBits dataBits,
170 QSerialPort::StopBits stopBits, QSerialPort::Parity parity,
171 QSerialPort::FlowControl flowControl);
172 bool _posixClear(QSerialPort::Directions directions);
173 QSerialPort::PinoutSignals _posixPinoutSignals();
174 bool _posixSetDataTerminalReady(bool set);
175 bool _posixSetRequestToSend(bool set);
176 bool _posixSetBreakEnabled(bool set);
177 bool _posixWaitForReadyRead(int msecs);
178 void _posixReadActivated();
179
180 QSocketNotifier* _posixReadNotifier = nullptr;
181
182 int _deviceId = INVALID_DEVICE_ID;
183
184 std::atomic<bool> _readyReadPending{false};
185 std::atomic<qint64> _bufferBytesEstimate{0};
186 QMutex _readMutex;
187 QWaitCondition _readWaitCondition;
188 QByteArray _pendingData;
189 qsizetype _pendingDataOffset = 0;
190};
191
192QT_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 DEFAULT_WRITE_TIMEOUT