summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-11-20 13:18:03 +0100
committerLiang Qi <liang.qi@qt.io>2017-11-20 13:18:03 +0100
commit2caa6e1ca0094b2e2a4cd6005836d46a7ddfdf6a (patch)
treee2653c5aeda85ef44a174a467319b8142aa958bf /src/plugins/canbus
parent0f33c698229ebb418b71a19dd409e2b5a417182e (diff)
parent50e4edb4b23947f9fcdb99ea0101660f0752cc1f (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Diffstat (limited to 'src/plugins/canbus')
-rw-r--r--src/plugins/canbus/peakcan/peakcanbackend.cpp16
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp2
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.cpp9
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.cpp23
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