diff options
author | Liang Qi <liang.qi@qt.io> | 2017-11-20 13:18:03 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-11-20 13:18:03 +0100 |
commit | 2caa6e1ca0094b2e2a4cd6005836d46a7ddfdf6a (patch) | |
tree | e2653c5aeda85ef44a174a467319b8142aa958bf /src/plugins/canbus | |
parent | 0f33c698229ebb418b71a19dd409e2b5a417182e (diff) | |
parent | 50e4edb4b23947f9fcdb99ea0101660f0752cc1f (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Change-Id: Ia04f54eee1264b659d8928b7f08d7221f587bc54
Diffstat (limited to 'src/plugins/canbus')
-rw-r--r-- | src/plugins/canbus/peakcan/peakcanbackend.cpp | 16 | ||||
-rw-r--r-- | src/plugins/canbus/socketcan/socketcanbackend.cpp | 2 | ||||
-rw-r--r-- | src/plugins/canbus/systeccan/systeccanbackend.cpp | 9 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.cpp | 23 |
4 files changed, 35 insertions, 15 deletions
diff --git a/src/plugins/canbus/peakcan/peakcanbackend.cpp b/src/plugins/canbus/peakcan/peakcanbackend.cpp index 6f3ebba..5460951 100644 --- a/src/plugins/canbus/peakcan/peakcanbackend.cpp +++ b/src/plugins/canbus/peakcan/peakcanbackend.cpp @@ -275,7 +275,6 @@ bool PeakCanBackendPrivate::open() return false; } } -#endif const TPCANStatus err = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT, &readHandle, sizeof(readHandle)); if (Q_UNLIKELY(err != PCAN_ERROR_OK)) { @@ -283,6 +282,14 @@ bool PeakCanBackendPrivate::open() return false; } +#else + const TPCANStatus err = ::CAN_GetValue(channelIndex, PCAN_RECEIVE_EVENT, &readHandle, sizeof(readHandle)); + if (Q_UNLIKELY(err != PCAN_ERROR_OK)) { + q->setError(systemErrorString(err), QCanBusDevice::ConnectionError); + return false; + } +#endif + writeNotifier = new WriteNotifier(this, q); writeNotifier->setInterval(0); @@ -306,7 +313,7 @@ void PeakCanBackendPrivate::close() quint32 value = 0; const TPCANStatus err = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT, &value, sizeof(value)); if (Q_UNLIKELY(err != PCAN_ERROR_OK)) - emit q->setError(systemErrorString(err), QCanBusDevice::ConnectionError); + q->setError(systemErrorString(err), QCanBusDevice::ConnectionError); const TPCANStatus st = ::CAN_Uninitialize(channelIndex); if (Q_UNLIKELY(st != PCAN_ERROR_OK)) @@ -416,6 +423,11 @@ void PeakCanBackendPrivate::startRead() break; } + // Filter out PCAN status frames, to avoid turning them + // into QCanBusFrame::DataFrames with random canId + if (Q_UNLIKELY(message.MSGTYPE & PCAN_MESSAGE_STATUS)) + continue; + QCanBusFrame frame(message.ID, QByteArray(reinterpret_cast<const char *>(message.DATA), int(message.LEN))); const quint64 millis = timestamp.millis + Q_UINT64_C(0xFFFFFFFF) * timestamp.millis_overflow; const quint64 micros = Q_UINT64_C(1000) * millis + timestamp.micros; diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp index ddda3a9..b43787d 100644 --- a/src/plugins/canbus/socketcan/socketcanbackend.cpp +++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp @@ -433,7 +433,7 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData) if (newData.frameType() == QCanBusFrame::RemoteRequestFrame) { canId |= CAN_RTR_FLAG; } else if (newData.frameType() == QCanBusFrame::ErrorFrame) { - canId = (uint)(newData.error() & QCanBusFrame::AnyError); + canId = static_cast<canid_t>((newData.error() & QCanBusFrame::AnyError)); canId |= CAN_ERR_FLAG; } diff --git a/src/plugins/canbus/systeccan/systeccanbackend.cpp b/src/plugins/canbus/systeccan/systeccanbackend.cpp index 514f048..8b914d6 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend.cpp +++ b/src/plugins/canbus/systeccan/systeccanbackend.cpp @@ -70,13 +70,14 @@ static void DRV_CALLBACK_TYPE ucanEnumCallback(DWORD index, BOOL isUsed, { auto result = static_cast<QStringList *>(args); + Q_UNUSED(index); Q_UNUSED(isUsed); - Q_UNUSED(hardwareInfo); - Q_UNUSED(initInfo); - result->append(QString::fromLatin1("can%1.0").arg(index)); + result->append(QString::fromLatin1("can%1.0").arg(hardwareInfo->m_bDeviceNr)); if (USBCAN_CHECK_SUPPORT_TWO_CHANNEL(hardwareInfo)) - result->append(QString::fromLatin1("can%1.1").arg(index)); + result->append(QString::fromLatin1("can%1.1").arg(hardwareInfo->m_bDeviceNr)); + + initInfo->m_fTryNext = true; // continue enumerating with next device } QList<QCanBusDeviceInfo> SystecCanBackend::interfaces() diff --git a/src/plugins/canbus/tinycan/tinycanbackend.cpp b/src/plugins/canbus/tinycan/tinycanbackend.cpp index 5bea8eb..7fdd5c5 100644 --- a/src/plugins/canbus/tinycan/tinycanbackend.cpp +++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp @@ -76,9 +76,16 @@ QList<QCanBusDeviceInfo> TinyCanBackend::interfaces() return { createDeviceInfo(QStringLiteral("can0.0")), createDeviceInfo(QStringLiteral("can0.1")) }; } -Q_GLOBAL_STATIC(QList<TinyCanBackendPrivate *>, qChannels) +namespace { -static QMutex channelsGuard(QMutex::NonRecursive); +struct TinyCanGlobal { + QList<TinyCanBackendPrivate *> channels; + QMutex mutex; +}; + +} // namespace + +Q_GLOBAL_STATIC(TinyCanGlobal, gTinyCan) class WriteNotifier : public QTimer { @@ -111,8 +118,8 @@ static void DRV_CALLBACK_TYPE canRxEventCallback(quint32 index, TCanMsg *frame, Q_UNUSED(frame); Q_UNUSED(count); - QMutexLocker lock(&channelsGuard); - for (TinyCanBackendPrivate *p : qAsConst(*qChannels())) { + QMutexLocker lock(&gTinyCan->mutex); + for (TinyCanBackendPrivate *p : qAsConst(gTinyCan->channels)) { if (p->channelIndex == int(index)) { p->startRead(); return; @@ -125,16 +132,16 @@ TinyCanBackendPrivate::TinyCanBackendPrivate(TinyCanBackend *q) { startupDriver(); - QMutexLocker lock(&channelsGuard); - qChannels()->append(this); + QMutexLocker lock(&gTinyCan->mutex); + gTinyCan->channels.append(this); } TinyCanBackendPrivate::~TinyCanBackendPrivate() { cleanupDriver(); - QMutexLocker lock(&channelsGuard); - qChannels()->removeAll(this); + QMutexLocker lock(&gTinyCan->mutex); + gTinyCan->channels.removeAll(this); } struct BitrateItem |