From f83587a9978bd212d7cd64a8d68330a8b97572db Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 23 Feb 2019 11:18:22 +0100 Subject: Add QCanBusDevice::busStatus() The original terminology is Error active, Error warning, Error Passive and Bus Off. We map them to GoodStatus, WarningStatus, ErrorStatus and BusOffStatus here. [ChangeLog][QCanBusDevice] Added the function busStatus() to query the CAN bus status from the CAN bus device. Fixes: QTBUG-70766 Change-Id: I22b99e2a02a6b22509005dd177796b861d536281 Reviewed-by: Alex Blasche --- src/plugins/canbus/systeccan/systeccan_symbols_p.h | 21 ++++++++++++ src/plugins/canbus/systeccan/systeccanbackend.cpp | 39 ++++++++++++++++++++++ src/plugins/canbus/systeccan/systeccanbackend.h | 1 + src/plugins/canbus/systeccan/systeccanbackend_p.h | 1 + 4 files changed, 62 insertions(+) (limited to 'src/plugins/canbus/systeccan') diff --git a/src/plugins/canbus/systeccan/systeccan_symbols_p.h b/src/plugins/canbus/systeccan/systeccan_symbols_p.h index 7fe98ad..ce32422 100644 --- a/src/plugins/canbus/systeccan/systeccan_symbols_p.h +++ b/src/plugins/canbus/systeccan/systeccan_symbols_p.h @@ -81,6 +81,20 @@ typedef void (DRV_CALLBACK_TYPE *tCallbackFktEx) (tUcanHandle handle, quint32 ev #define USBCAN_EVENT_FATALDISCON 8 // a USB-CANmodul has been disconnected during operation #define USBCAN_EVENT_RESERVED1 0x80 +// CAN status flags (is returned with function UcanGetStatus() or UcanGetStatusEx() ) +#define USBCAN_CANERR_OK 0x0000 // no error +#define USBCAN_CANERR_XMTFULL 0x0001 // Tx-buffer of the CAN controller is full +#define USBCAN_CANERR_OVERRUN 0x0002 // Rx-buffer of the CAN controller is full +#define USBCAN_CANERR_BUSLIGHT 0x0004 // Bus error: Error Limit 1 exceeded (refer to SJA1000 manual) +#define USBCAN_CANERR_BUSHEAVY 0x0008 // Bus error: Error Limit 2 exceeded (refer to SJA1000 manual) +#define USBCAN_CANERR_BUSOFF 0x0010 // Bus error: CAN controller has gone into Bus-Off state +#define USBCAN_CANERR_QRCVEMPTY 0x0020 // RcvQueue is empty +#define USBCAN_CANERR_QOVERRUN 0x0040 // RcvQueue overrun +#define USBCAN_CANERR_QXMTFULL 0x0080 // transmit queue is full +#define USBCAN_CANERR_REGTEST 0x0100 // Register test of the SJA1000 failed +#define USBCAN_CANERR_MEMTEST 0x0200 // Memory test failed +#define USBCAN_CANERR_TXMSGLOST 0x0400 // transmit CAN message was automatically deleted by firmware + #define kUcanModeNormal 0x00 // normal mode (send and receive) #define kUcanModeListenOnly 0x01 // listen only mode (only receive) #define kUcanModeTxEcho 0x02 // CAN messages which was sent will be received at UcanReadCanMsg.. @@ -143,6 +157,11 @@ typedef struct _tCanMsgStruct { quint32 m_dwTime; // Time in ms } tCanMsgStruct; +typedef struct _tStatusStruct { + quint16 m_wCanStatus; // current CAN status + quint16 m_wUsbStatus; // current USB status +} tStatusStruct; + // Function return codes (encoding) #define USBCAN_SUCCESSFUL 0x00 // no error #define USBCAN_ERR 0x01 // error in library; function has not been executed @@ -282,6 +301,7 @@ GENERATE_SYMBOL_VARIABLE(UCANRET, UcanDeinitCanEx, tUcanHandle, quint8 /* channe GENERATE_SYMBOL_VARIABLE(UCANRET, UcanReadCanMsgEx, tUcanHandle, quint8 *, tCanMsgStruct *, quint32 *) GENERATE_SYMBOL_VARIABLE(UCANRET, UcanResetCan, tUcanHandle) GENERATE_SYMBOL_VARIABLE(UCANRET, UcanWriteCanMsgEx, tUcanHandle, quint8, tCanMsgStruct *, quint32 *) +GENERATE_SYMBOL_VARIABLE(UCANRET, UcanGetStatus, tUcanHandle, tStatusStruct *) inline bool resolveSymbols(QLibrary *systecLibrary) { @@ -303,6 +323,7 @@ inline bool resolveSymbols(QLibrary *systecLibrary) RESOLVE_SYMBOL(UcanReadCanMsgEx); RESOLVE_SYMBOL(UcanResetCan); RESOLVE_SYMBOL(UcanWriteCanMsgEx); + RESOLVE_SYMBOL(UcanGetStatus); return true; } diff --git a/src/plugins/canbus/systeccan/systeccanbackend.cpp b/src/plugins/canbus/systeccan/systeccanbackend.cpp index 69689a3..0663f39 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend.cpp +++ b/src/plugins/canbus/systeccan/systeccanbackend.cpp @@ -459,6 +459,35 @@ void SystecCanBackendPrivate::resetController() ::UcanResetCan(handle); } +QCanBusDevice::CanBusStatus SystecCanBackendPrivate::busStatus() +{ + Q_Q(SystecCanBackend); + + tStatusStruct status; + ::memset(&status, 0, sizeof(status)); + const UCANRET result = ::UcanGetStatus(handle, &status); + + if (Q_UNLIKELY(result != USBCAN_SUCCESSFUL)) { + qCWarning(QT_CANBUS_PLUGINS_SYSTECCAN, "Can not query CAN bus status."); + q->setError(SystecCanBackend::tr("Can not query CAN bus status."), QCanBusDevice::ConfigurationError); + return QCanBusDevice::CanBusStatus::Unknown; + } + + if (status.m_wCanStatus & USBCAN_CANERR_BUSOFF) + return QCanBusDevice::CanBusStatus::BusOff; + + if (status.m_wCanStatus & USBCAN_CANERR_BUSHEAVY) + return QCanBusDevice::CanBusStatus::Error; + + if (status.m_wCanStatus & USBCAN_CANERR_BUSLIGHT) + return QCanBusDevice::CanBusStatus::Warning; + + if (status.m_wCanStatus == USBCAN_CANERR_OK) + return QCanBusDevice::CanBusStatus::Good; + + return QCanBusDevice::CanBusStatus::Unknown; +} + SystecCanBackend::SystecCanBackend(const QString &name, QObject *parent) : QCanBusDevice(parent), d_ptr(new SystecCanBackendPrivate(this)) @@ -470,6 +499,9 @@ SystecCanBackend::SystecCanBackend(const QString &name, QObject *parent) : std::function f = std::bind(&SystecCanBackend::resetController, this); setResetControllerFunction(f); + + std::function g = std::bind(&SystecCanBackend::busStatus, this); + setCanBusStatusGetter(g); } SystecCanBackend::~SystecCanBackend() @@ -567,4 +599,11 @@ void SystecCanBackend::resetController() d->resetController(); } +QCanBusDevice::CanBusStatus SystecCanBackend::busStatus() +{ + Q_D(SystecCanBackend); + + return d->busStatus(); +} + QT_END_NAMESPACE diff --git a/src/plugins/canbus/systeccan/systeccanbackend.h b/src/plugins/canbus/systeccan/systeccanbackend.h index 68dcfb9..22c1193 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend.h +++ b/src/plugins/canbus/systeccan/systeccanbackend.h @@ -77,6 +77,7 @@ public: private: void resetController(); + QCanBusDevice::CanBusStatus busStatus(); SystecCanBackendPrivate * const d_ptr; }; diff --git a/src/plugins/canbus/systeccan/systeccanbackend_p.h b/src/plugins/canbus/systeccan/systeccanbackend_p.h index b938c74..b2da322 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend_p.h +++ b/src/plugins/canbus/systeccan/systeccanbackend_p.h @@ -95,6 +95,7 @@ public: void readAllReceivedMessages(); bool verifyBitRate(int bitrate); void resetController(); + QCanBusDevice::CanBusStatus busStatus(); SystecCanBackend * const q_ptr; -- cgit v1.2.3