summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/vectorcan/vectorcanbackend.cpp')
-rw-r--r--src/plugins/canbus/vectorcan/vectorcanbackend.cpp54
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()