summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/systeccan
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2019-02-23 11:18:22 +0100
committerAndre Hartmann <aha_1980@gmx.de>2019-07-17 14:21:24 +0200
commitf83587a9978bd212d7cd64a8d68330a8b97572db (patch)
treed6f3421d7dbaf6b5b732f975dde4b2903d2e3454 /src/plugins/canbus/systeccan
parent30df8839a1d0e81580fa570b9fa7d6c4217d8b25 (diff)
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 <alexander.blasche@qt.io>
Diffstat (limited to 'src/plugins/canbus/systeccan')
-rw-r--r--src/plugins/canbus/systeccan/systeccan_symbols_p.h21
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.cpp39
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.h1
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend_p.h1
4 files changed, 62 insertions, 0 deletions
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<void()> f = std::bind(&SystecCanBackend::resetController, this);
setResetControllerFunction(f);
+
+ std::function<CanBusStatus()> 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;