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.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
index 24dbe2c..9d3bdef 100644
--- a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
+++ b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp
@@ -446,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()
@@ -540,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