diff options
Diffstat (limited to 'src/plugins/canbus/vectorcan/vectorcanbackend.cpp')
-rw-r--r-- | src/plugins/canbus/vectorcan/vectorcanbackend.cpp | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp index 005b726..50ede55 100644 --- a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp +++ b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp @@ -67,6 +67,32 @@ bool VectorCanBackend::canCreate(QString *errorReason) #endif } +QList<QCanBusDeviceInfo> VectorCanBackend::interfaces() +{ + QList<QCanBusDeviceInfo> result; + + if (Q_UNLIKELY(VectorCanBackendPrivate::loadDriver() != XL_SUCCESS)) + return result; + + XLdriverConfig config; + if (Q_UNLIKELY(::xlGetDriverConfig(&config) != XL_SUCCESS)) { + VectorCanBackendPrivate::cleanupDriver(); + return result; + } + + for (uint i = 0; i < config.channelCount; ++i) { + if (config.channel[i].hwType == XL_HWTYPE_NONE) + continue; + + const bool isVirtual = config.channel[i].hwType == XL_HWTYPE_VIRTUAL; + const bool isFd = config.channel[i].channelCapabilities & XL_CHANNEL_FLAG_CANFD_SUPPORT; + result.append(createDeviceInfo(QStringLiteral("can") + QString::number(i), isVirtual, isFd)); + } + + VectorCanBackendPrivate::cleanupDriver(); + return result; +} + static int driverRefCount = 0; class ReadNotifier : public QWinEventNotifier @@ -338,23 +364,31 @@ void VectorCanBackendPrivate::startRead() q->enqueueReceivedFrames(newFrames); } -void VectorCanBackendPrivate::startupDriver() +XLstatus VectorCanBackendPrivate::loadDriver() { - Q_Q(VectorCanBackend); - if (driverRefCount == 0) { const XLstatus status = ::xlOpenDriver(); - if (status != XL_SUCCESS) { - q->setError(systemErrorString(status), - QCanBusDevice::CanBusError::ConnectionError); - return; - } - } else if (driverRefCount < 0) { + if (Q_UNLIKELY(status != XL_SUCCESS)) + return status; + + } else if (Q_UNLIKELY(driverRefCount < 0)) { qCritical("Wrong reference counter: %d", driverRefCount); - return; + return XL_ERR_CANNOT_OPEN_DRIVER; } ++driverRefCount; + return XL_SUCCESS; +} + +void VectorCanBackendPrivate::startupDriver() +{ + Q_Q(VectorCanBackend); + + const XLstatus status = loadDriver(); + if (Q_UNLIKELY(status != XL_SUCCESS)) { + q->setError(systemErrorString(status), + QCanBusDevice::CanBusError::ConnectionError); + } } void VectorCanBackendPrivate::cleanupDriver() |