diff options
Diffstat (limited to 'src/plugins/canbus/vectorcan/vectorcanbackend.cpp')
-rw-r--r-- | src/plugins/canbus/vectorcan/vectorcanbackend.cpp | 47 |
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 |