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.cpp56
1 files changed, 53 insertions, 3 deletions
diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
index 0e6d3ae..0382d66 100644
--- a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
+++ b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
@@ -271,7 +271,8 @@ void VectorCanBackendPrivate::setupChannel(const QString &interfaceName)
}
}
- qCritical("Unable to parse the channel %ls", qUtf16Printable(interfaceName));
+ qCCritical(QT_CANBUS_PLUGINS_VECTORCAN, "Unable to parse the channel %ls",
+ qUtf16Printable(interfaceName));
}
void VectorCanBackendPrivate::setupDefaultConfigurations()
@@ -388,7 +389,8 @@ XLstatus VectorCanBackendPrivate::loadDriver()
return status;
} else if (Q_UNLIKELY(driverRefCount < 0)) {
- qCritical("Wrong reference counter: %d", driverRefCount);
+ qCCritical(QT_CANBUS_PLUGINS_VECTORCAN, "Wrong driver reference counter: %d",
+ driverRefCount);
return XL_ERR_CANNOT_OPEN_DRIVER;
}
@@ -412,7 +414,8 @@ void VectorCanBackendPrivate::cleanupDriver()
--driverRefCount;
if (Q_UNLIKELY(driverRefCount < 0)) {
- qCritical("Wrong reference counter: %d", driverRefCount);
+ qCCritical(QT_CANBUS_PLUGINS_VECTORCAN, "Wrong driver reference counter: %d",
+ driverRefCount);
driverRefCount = 0;
} else if (driverRefCount == 0) {
::xlCloseDriver();
@@ -443,6 +446,9 @@ VectorCanBackend::VectorCanBackend(const QString &name, QObject *parent)
d->setupChannel(name);
d->setupDefaultConfigurations();
+
+ std::function<CanBusStatus()> g = std::bind(&VectorCanBackend::busStatus, this);
+ setCanBusStatusGetter(g);
}
VectorCanBackend::~VectorCanBackend()
@@ -537,4 +543,48 @@ QString VectorCanBackend::interpretErrorFrame(const QCanBusFrame &errorFrame)
return QString();
}
+QCanBusDevice::CanBusStatus VectorCanBackend::busStatus()
+{
+ Q_D(VectorCanBackend);
+
+ const XLstatus requestStatus = ::xlCanRequestChipState(d->portHandle, d->channelMask);
+ if (Q_UNLIKELY(requestStatus != XL_SUCCESS)) {
+ const QString errorString = d->systemErrorString(requestStatus);
+ qCWarning(QT_CANBUS_PLUGINS_VECTORCAN, "Can not query CAN bus status: %ls.",
+ qUtf16Printable(errorString));
+ setError(errorString, QCanBusDevice::CanBusError::ReadError);
+ return QCanBusDevice::CanBusStatus::Unknown;
+ }
+
+ quint32 eventCount = 1;
+ XLevent event;
+ ::memset(&event, 0, sizeof(event));
+
+ const XLstatus receiveStatus = ::xlReceive(d->portHandle, &eventCount, &event);
+ if (Q_UNLIKELY(receiveStatus != XL_SUCCESS)) {
+ const QString errorString = d->systemErrorString(receiveStatus);
+ qCWarning(QT_CANBUS_PLUGINS_VECTORCAN, "Can not query CAN bus status: %ls.",
+ qUtf16Printable(errorString));
+ setError(errorString, QCanBusDevice::CanBusError::ReadError);
+ return QCanBusDevice::CanBusStatus::Unknown;
+ }
+
+ if (Q_LIKELY(event.tag == XL_CHIP_STATE)) {
+ switch (event.tagData.chipState.busStatus) {
+ case XL_CHIPSTAT_BUSOFF:
+ return QCanBusDevice::CanBusStatus::BusOff;
+ case XL_CHIPSTAT_ERROR_PASSIVE:
+ return QCanBusDevice::CanBusStatus::Error;
+ case XL_CHIPSTAT_ERROR_WARNING:
+ return QCanBusDevice::CanBusStatus::Warning;
+ case XL_CHIPSTAT_ERROR_ACTIVE:
+ return QCanBusDevice::CanBusStatus::Good;
+ }
+ }
+
+ qCWarning(QT_CANBUS_PLUGINS_VECTORCAN, "Unknown CAN bus status: %u",
+ uint(event.tagData.chipState.busStatus));
+ return QCanBusDevice::CanBusStatus::Unknown;
+}
+
QT_END_NAMESPACE