summaryrefslogtreecommitdiffstats
path: root/src/serialport/qserialport_win.cpp
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2016-06-30 19:27:25 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2016-07-07 17:12:54 +0000
commit5ddbb6b87266d0f8d7dffc03c86c2e80b3735d2c (patch)
treeb1765f3ca80875dbeb0899340ef2ad571dded79e /src/serialport/qserialport_win.cpp
parenta713565d119c39bd31ec25926ded881d1f0b78b7 (diff)
Minimize number of system calls at opening
Currently, the method QSP::open() several times calls the system functions to get/set of DCB/termios structures for each parameter. It is not rational and should be minimized as possible, in ideally to once executed. Change-Id: If1f308176a82f3c8896fc648bf656f089e099f3f Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
Diffstat (limited to 'src/serialport/qserialport_win.cpp')
-rw-r--r--src/serialport/qserialport_win.cpp172
1 files changed, 104 insertions, 68 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 7cbb81d4..f4f8317b 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -81,6 +81,94 @@
QT_BEGIN_NAMESPACE
+static inline void qt_set_common_props(DCB *dcb)
+{
+ dcb->fBinary = TRUE;
+ dcb->fAbortOnError = FALSE;
+ dcb->fNull = FALSE;
+ dcb->fErrorChar = FALSE;
+
+ if (dcb->fDtrControl == DTR_CONTROL_HANDSHAKE)
+ dcb->fDtrControl = DTR_CONTROL_DISABLE;
+}
+
+static inline void qt_set_baudrate(DCB *dcb, qint32 baudrate)
+{
+ dcb->BaudRate = baudrate;
+}
+
+static inline void qt_set_databits(DCB *dcb, QSerialPort::DataBits databits)
+{
+ dcb->ByteSize = databits;
+}
+
+static inline void qt_set_parity(DCB *dcb, QSerialPort::Parity parity)
+{
+ dcb->fParity = TRUE;
+ switch (parity) {
+ case QSerialPort::NoParity:
+ dcb->Parity = NOPARITY;
+ dcb->fParity = FALSE;
+ break;
+ case QSerialPort::OddParity:
+ dcb->Parity = ODDPARITY;
+ break;
+ case QSerialPort::EvenParity:
+ dcb->Parity = EVENPARITY;
+ break;
+ case QSerialPort::MarkParity:
+ dcb->Parity = MARKPARITY;
+ break;
+ case QSerialPort::SpaceParity:
+ dcb->Parity = SPACEPARITY;
+ break;
+ default:
+ dcb->Parity = NOPARITY;
+ dcb->fParity = FALSE;
+ break;
+ }
+}
+
+static inline void qt_set_stopbits(DCB *dcb, QSerialPort::StopBits stopbits)
+{
+ switch (stopbits) {
+ case QSerialPort::OneStop:
+ dcb->StopBits = ONESTOPBIT;
+ break;
+ case QSerialPort::OneAndHalfStop:
+ dcb->StopBits = ONE5STOPBITS;
+ break;
+ case QSerialPort::TwoStop:
+ dcb->StopBits = TWOSTOPBITS;
+ break;
+ default:
+ dcb->StopBits = ONESTOPBIT;
+ break;
+ }
+}
+
+static inline void qt_set_flowcontrol(DCB *dcb, QSerialPort::FlowControl flowcontrol)
+{
+ dcb->fInX = FALSE;
+ dcb->fOutX = FALSE;
+ dcb->fOutxCtsFlow = FALSE;
+ dcb->fRtsControl = RTS_CONTROL_DISABLE;
+ switch (flowcontrol) {
+ case QSerialPort::NoFlowControl:
+ break;
+ case QSerialPort::SoftwareControl:
+ dcb->fInX = TRUE;
+ dcb->fOutX = TRUE;
+ break;
+ case QSerialPort::HardwareControl:
+ dcb->fOutxCtsFlow = TRUE;
+ dcb->fRtsControl = RTS_CONTROL_HANDSHAKE;
+ break;
+ default:
+ break;
+ }
+}
+
bool QSerialPortPrivate::open(QIODevice::OpenMode mode)
{
DWORD desiredAccess = 0;
@@ -319,7 +407,8 @@ bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions di
if (!getDcb(&dcb))
return false;
- dcb.BaudRate = baudRate;
+ qt_set_baudrate(&dcb, baudRate);
+
return setDcb(&dcb);
}
@@ -329,7 +418,8 @@ bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits)
if (!getDcb(&dcb))
return false;
- dcb.ByteSize = dataBits;
+ qt_set_databits(&dcb, dataBits);
+
return setDcb(&dcb);
}
@@ -339,29 +429,8 @@ bool QSerialPortPrivate::setParity(QSerialPort::Parity parity)
if (!getDcb(&dcb))
return false;
- dcb.fParity = TRUE;
- switch (parity) {
- case QSerialPort::NoParity:
- dcb.Parity = NOPARITY;
- dcb.fParity = FALSE;
- break;
- case QSerialPort::OddParity:
- dcb.Parity = ODDPARITY;
- break;
- case QSerialPort::EvenParity:
- dcb.Parity = EVENPARITY;
- break;
- case QSerialPort::MarkParity:
- dcb.Parity = MARKPARITY;
- break;
- case QSerialPort::SpaceParity:
- dcb.Parity = SPACEPARITY;
- break;
- default:
- dcb.Parity = NOPARITY;
- dcb.fParity = FALSE;
- break;
- }
+ qt_set_parity(&dcb, parity);
+
return setDcb(&dcb);
}
@@ -371,20 +440,8 @@ bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits)
if (!getDcb(&dcb))
return false;
- switch (stopBits) {
- case QSerialPort::OneStop:
- dcb.StopBits = ONESTOPBIT;
- break;
- case QSerialPort::OneAndHalfStop:
- dcb.StopBits = ONE5STOPBITS;
- break;
- case QSerialPort::TwoStop:
- dcb.StopBits = TWOSTOPBITS;
- break;
- default:
- dcb.StopBits = ONESTOPBIT;
- break;
- }
+ qt_set_stopbits(&dcb, stopBits);
+
return setDcb(&dcb);
}
@@ -394,24 +451,8 @@ bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl)
if (!getDcb(&dcb))
return false;
- dcb.fInX = FALSE;
- dcb.fOutX = FALSE;
- dcb.fOutxCtsFlow = FALSE;
- dcb.fRtsControl = RTS_CONTROL_DISABLE;
- switch (flowControl) {
- case QSerialPort::NoFlowControl:
- break;
- case QSerialPort::SoftwareControl:
- dcb.fInX = TRUE;
- dcb.fOutX = TRUE;
- break;
- case QSerialPort::HardwareControl:
- dcb.fOutxCtsFlow = TRUE;
- dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
- break;
- default:
- break;
- }
+ qt_set_flowcontrol(&dcb, flowControl);
+
return setDcb(&dcb);
}
@@ -623,17 +664,12 @@ inline bool QSerialPortPrivate::initialize()
restoredDcb = dcb;
- dcb.fBinary = TRUE;
- dcb.fInX = FALSE;
- dcb.fOutX = FALSE;
- dcb.fAbortOnError = FALSE;
- dcb.fNull = FALSE;
- dcb.fErrorChar = FALSE;
-
- if (dcb.fDtrControl == DTR_CONTROL_HANDSHAKE)
- dcb.fDtrControl = DTR_CONTROL_DISABLE;
-
- dcb.BaudRate = inputBaudRate;
+ qt_set_common_props(&dcb);
+ qt_set_baudrate(&dcb, inputBaudRate);
+ qt_set_databits(&dcb, dataBits);
+ qt_set_parity(&dcb, parity);
+ qt_set_stopbits(&dcb, stopBits);
+ qt_set_flowcontrol(&dcb, flowControl);
if (!setDcb(&dcb))
return false;