From b3d27c681ac216f82ea8b2de1e21858a6c2b7af0 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Wed, 21 Sep 2016 20:41:47 +0200 Subject: CAN-Backends: Port qUtf8Printable to qUtf16Printable This amends commit 0c63b3a441437a8bc42770d360a6696bbf11cd2d Change-Id: I934f90384ad9ec7d42e9437cb023b0c5edeb0437 Reviewed-by: Marc Mutz Reviewed-by: Denis Shienkov Reviewed-by: Alex Blasche --- src/plugins/canbus/peakcan/main.cpp | 2 +- src/plugins/canbus/tinycan/main.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/canbus/peakcan/main.cpp b/src/plugins/canbus/peakcan/main.cpp index f3977ab..f76127d 100644 --- a/src/plugins/canbus/peakcan/main.cpp +++ b/src/plugins/canbus/peakcan/main.cpp @@ -55,7 +55,7 @@ public: { QString errorReason; if (!PeakCanBackend::canCreate(&errorReason)) { - qWarning("%s", qUtf8Printable(errorReason)); + qWarning("%ls", qUtf16Printable(errorReason)); return nullptr; } diff --git a/src/plugins/canbus/tinycan/main.cpp b/src/plugins/canbus/tinycan/main.cpp index 8dcfe5c..e8a084c 100644 --- a/src/plugins/canbus/tinycan/main.cpp +++ b/src/plugins/canbus/tinycan/main.cpp @@ -55,7 +55,7 @@ public: { QString errorReason; if (!TinyCanBackend::canCreate(&errorReason)) { - qWarning("%s", qUtf8Printable(errorReason)); + qWarning("%ls", qUtf16Printable(errorReason)); return nullptr; } -- cgit v1.2.3 From 6bed30d5ceef1463469e37173b3ebac2cfdc2352 Mon Sep 17 00:00:00 2001 From: Michael Winkelmann Date: Mon, 19 Sep 2016 16:39:30 +0200 Subject: Fixed QModbusRtuSerialMaster stack overflow on close QSerialPort::aboutToClose calls q->close() which leads to an infinite recursion. Calling QModbusRtuSerialMaster::close() explicitly is not necessary because when the serial port is closed, QModbusRtuSerialMaster::close() has been invoked already in all cases. Moreover, QSerialPort::aboutToClose asserts that serial master is always in closing state. Task-number: QTBUG-56009 Change-Id: If0dce93bbaa22116328b467f26c289cb58efc93f Reviewed-by: Alex Blasche --- src/serialbus/qmodbusrtuserialmaster.cpp | 7 ++++++- src/serialbus/qmodbusrtuserialmaster_p.h | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/serialbus/qmodbusrtuserialmaster.cpp b/src/serialbus/qmodbusrtuserialmaster.cpp index c646ee7..95ab5eb 100644 --- a/src/serialbus/qmodbusrtuserialmaster.cpp +++ b/src/serialbus/qmodbusrtuserialmaster.cpp @@ -112,10 +112,15 @@ bool QModbusRtuSerialMaster::open() */ void QModbusRtuSerialMaster::close() { - if (state() == QModbusDevice::UnconnectedState) + if (state() == QModbusDevice::UnconnectedState || + state() == QModbusDevice::ClosingState) { return; + } + + setState(QModbusDevice::ClosingState); Q_D(QModbusRtuSerialMaster); + if (d->m_serialPort->isOpen()) d->m_serialPort->close(); diff --git a/src/serialbus/qmodbusrtuserialmaster_p.h b/src/serialbus/qmodbusrtuserialmaster_p.h index 105e4a0..baa6174 100644 --- a/src/serialbus/qmodbusrtuserialmaster_p.h +++ b/src/serialbus/qmodbusrtuserialmaster_p.h @@ -216,8 +216,9 @@ public: QObject::connect(m_serialPort, &QSerialPort::aboutToClose, q, [this]() { Q_Q(QModbusRtuSerialMaster); - if (q->state() != QModbusDevice::ClosingState) - q->close(); + Q_UNUSED(q); // To avoid unused variable warning in release mode + Q_ASSERT(q->state() == QModbusDevice::ClosingState); + m_sendTimer.stop(); m_responseTimer.stop(); }); -- cgit v1.2.3 From 0d31e8cd10d09fd2b28052c89a4f96c32c104848 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Thu, 22 Sep 2016 19:57:36 +0200 Subject: QCanBusFrame: Init unused integer fields to zero Task-number: QTBUG-51845 Change-Id: I2b6c4b9c55b43005a8bb153a3bb24d1e63ce5815 Reviewed-by: Marc Mutz --- src/serialbus/qcanbusframe.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h index de11331..9b87f88 100644 --- a/src/serialbus/qcanbusframe.h +++ b/src/serialbus/qcanbusframe.h @@ -73,8 +73,10 @@ public: explicit QCanBusFrame(QCanBusFrame::FrameType type) : canId(0x0), isExtendedFrame(0x0), - version(0x0) + version(0x0), + extra(0x0) { + memset(reserved, 0, sizeof(reserved)); setFrameType(type); } @@ -101,10 +103,11 @@ public: format(DataFrame), isExtendedFrame((identifier & 0x1FFFF800U) ? 0x1 : 0x0), version(0x0), + extra(0x0), load(data) { Q_UNUSED(extra); - Q_UNUSED(reserved); + memset(reserved, 0, sizeof(reserved)); } bool isValid() const -- cgit v1.2.3 From dc210f2f4904eb244250d94c37a38e2b57700044 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 1 Nov 2016 20:50:07 -0700 Subject: Add missing QDataStream operator<< for QModbus{Request,Response} We just stream the base class, so let's make it official. Change-Id: Ic46ff326a6ba46bc877cfffd14831e78f491b5c0 Reviewed-by: Alex Blasche --- src/serialbus/qmodbuspdu.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h index 1255593..65a3247 100644 --- a/src/serialbus/qmodbuspdu.h +++ b/src/serialbus/qmodbuspdu.h @@ -208,6 +208,8 @@ public: {} }; Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusRequest &pdu); +inline QDataStream &operator<<(QDataStream &stream, const QModbusRequest &pdu) +{ return stream << static_cast(pdu); } class QModbusResponse : public QModbusPdu { @@ -250,6 +252,8 @@ public: void setExceptionCode(ExceptionCode ec) { QModbusPdu::encodeData(quint8(ec)); } }; Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusResponse &pdu); +inline QDataStream &operator<<(QDataStream &stream, const QModbusResponse &pdu) +{ return stream << static_cast(pdu); } Q_DECLARE_TYPEINFO(QModbusPdu, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(QModbusPdu::ExceptionCode, Q_PRIMITIVE_TYPE); -- cgit v1.2.3 From 1683fc48e1ee63c9e5687bcdf55d45bcafe8e6f8 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Fri, 4 Nov 2016 00:36:53 +0100 Subject: Fix handling of byte count fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The various byte count fields are all unsigned byte however the incoming data are loaded in a QByteArray which returns signed char. This patch fixes this by converting the field value to quint8. [ChangeLog][Modbus] Fixed handling of packets with payloads longer than 127 bytes. Task-number: QTBUG-54834 Change-Id: I699c4cf0cea9933bef6c040c573d2d6e6a113920 Reviewed-by: André Hartmann --- src/serialbus/qmodbuspdu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp index 1615c48..cdba047 100644 --- a/src/serialbus/qmodbuspdu.cpp +++ b/src/serialbus/qmodbuspdu.cpp @@ -540,18 +540,18 @@ int QModbusRequest::calculateDataSize(const QModbusRequest &request) case QModbusPdu::WriteMultipleCoils: minimum -= 1; // first payload payload byte if (request.dataSize() >= minimum) - size = minimum + request.data()[minimum - 1] /*byte count*/; + size = minimum + quint8(request.data()[minimum - 1]) /*byte count*/; break; case QModbusPdu::WriteMultipleRegisters: case QModbusPdu::ReadWriteMultipleRegisters: minimum -= 2; // first 2 payload payload bytes if (request.dataSize() >= minimum) - size = minimum + request.data()[minimum - 1] /*byte count*/; + size = minimum + quint8(request.data()[minimum - 1]) /*byte count*/; break; case QModbusPdu::ReadFileRecord: case QModbusPdu::WriteFileRecord: if (request.dataSize() >= 1) - size = 1 /*byte count*/ + request.data()[0] /*actual bytes*/; + size = 1 /*byte count*/ + quint8(request.data()[0]) /*actual bytes*/; break; case QModbusPdu::EncapsulatedInterfaceTransport: { if (request.dataSize() < minimum) @@ -671,7 +671,7 @@ int QModbusResponse::calculateDataSize(const QModbusResponse &response) case QModbusResponse::ReadWriteMultipleRegisters: case QModbusResponse::ReportServerId: if (response.dataSize() >= 1) - size = 1 /*byte count*/ + response.data()[0] /*actual bytes*/; + size = 1 /*byte count*/ + quint8(response.data()[0]) /*actual bytes*/; break; case QModbusResponse::ReadFifoQueue: { if (response.dataSize() >= 2) { -- cgit v1.2.3