diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2021-07-27 17:41:27 +0200 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2021-08-05 13:27:46 +0000 |
commit | a9a7ffb5a97f254a57591e69c3e24212d1743cf4 (patch) | |
tree | 5384b946019a304fbe6361399584699ce2f10234 /src | |
parent | 8c8b0c4cdabca6917a35daf75a799b8d75a18cdb (diff) |
CAN: Implement QCanBusDevice::deviceInfo() in the plugins
* PasstruCAN: Untested
* PeakCAN: Tested on Windows with PCAN-USB Pro FD.
* SocketCAN: Tested on Linux with virtual and real hardware.
* SystecCAN: Tested on Windows with USBcanmodul2.
* TinyCAN: Untested
* VectorCAN: Tested with the virtual Vector interface.
* VirtualCAN: Tested on Windows and Linux.
Pick-to: 6.2
Change-Id: I3836a81a9cb1570a22b6264b34fca88ccc0ab57e
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/canbus/passthrucan/passthrucanbackend.cpp | 5 | ||||
-rw-r--r-- | src/plugins/canbus/passthrucan/passthrucanbackend.h | 1 | ||||
-rw-r--r-- | src/plugins/canbus/peakcan/peakcanbackend.cpp | 60 | ||||
-rw-r--r-- | src/plugins/canbus/peakcan/peakcanbackend.h | 11 | ||||
-rw-r--r-- | src/plugins/canbus/socketcan/socketcanbackend.cpp | 25 | ||||
-rw-r--r-- | src/plugins/canbus/socketcan/socketcanbackend.h | 2 | ||||
-rw-r--r-- | src/plugins/canbus/systeccan/systeccan_symbols_p.h | 3 | ||||
-rw-r--r-- | src/plugins/canbus/systeccan/systeccanbackend.cpp | 10 | ||||
-rw-r--r-- | src/plugins/canbus/systeccan/systeccanbackend.h | 1 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.cpp | 5 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.h | 1 | ||||
-rw-r--r-- | src/plugins/canbus/vectorcan/vectorcanbackend.cpp | 19 | ||||
-rw-r--r-- | src/plugins/canbus/vectorcan/vectorcanbackend.h | 1 | ||||
-rw-r--r-- | src/plugins/canbus/virtualcan/virtualcanbackend.cpp | 23 | ||||
-rw-r--r-- | src/plugins/canbus/virtualcan/virtualcanbackend.h | 4 |
15 files changed, 141 insertions, 30 deletions
diff --git a/src/plugins/canbus/passthrucan/passthrucanbackend.cpp b/src/plugins/canbus/passthrucan/passthrucanbackend.cpp index e9e361f..e0b3cef 100644 --- a/src/plugins/canbus/passthrucan/passthrucanbackend.cpp +++ b/src/plugins/canbus/passthrucan/passthrucanbackend.cpp @@ -184,6 +184,11 @@ QList<QCanBusDeviceInfo> PassThruCanBackend::interfaces() return list; } +QCanBusDeviceInfo PassThruCanBackend::deviceInfo() const +{ + return createDeviceInfo(QStringLiteral("passthrucan"), m_deviceName, false, false); +} + bool PassThruCanBackend::open() { if (Q_UNLIKELY(state() != ConnectingState)) { diff --git a/src/plugins/canbus/passthrucan/passthrucanbackend.h b/src/plugins/canbus/passthrucan/passthrucanbackend.h index 6810881..554442b 100644 --- a/src/plugins/canbus/passthrucan/passthrucanbackend.h +++ b/src/plugins/canbus/passthrucan/passthrucanbackend.h @@ -61,6 +61,7 @@ public: QString interpretErrorFrame(const QCanBusFrame &errorFrame) override; static QList<QCanBusDeviceInfo> interfaces(); + QCanBusDeviceInfo deviceInfo() const override; protected: bool open() override; diff --git a/src/plugins/canbus/peakcan/peakcanbackend.cpp b/src/plugins/canbus/peakcan/peakcanbackend.cpp index 2139110..20e652d 100644 --- a/src/plugins/canbus/peakcan/peakcanbackend.cpp +++ b/src/plugins/canbus/peakcan/peakcanbackend.cpp @@ -128,7 +128,7 @@ static const PcanChannel pcanChannels[] = { { "none", PCAN_NONEBUS } }; -QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByChannelCondition() +QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByChannelCondition(Availability available) { QList<QCanBusDeviceInfo> result; @@ -137,7 +137,7 @@ QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByChannelCondition() const TPCANHandle index = pcanChannels[i].index; const TPCANStatus stat = ::CAN_GetValue(index, PCAN_CHANNEL_CONDITION, &value, sizeof(value)); - if ((stat == PCAN_ERROR_OK) && (value & PCAN_CHANNEL_AVAILABLE)) { + if ((stat == PCAN_ERROR_OK) && (value & uint(available))) { const TPCANStatus fdStat = ::CAN_GetValue(index, PCAN_CHANNEL_FEATURES, &value, sizeof(value)); const bool isFd = (fdStat == PCAN_ERROR_OK) && (value & FEATURE_FD_CAPABLE); @@ -161,7 +161,7 @@ QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByChannelCondition() if (idStat == PCAN_ERROR_OK) alias = QString::number(deviceId); - result.append(createDeviceInfo(QStringLiteral("peakcan"), + result.append(QCanBusDevice::createDeviceInfo(QStringLiteral("peakcan"), QLatin1String(pcanChannels[i].name), QString(), QLatin1String(description), alias, channel, false, isFd)); @@ -171,7 +171,20 @@ QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByChannelCondition() return result; } -QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByAttachedChannels(bool *ok) +static QString pcanChannelNameForIndex(uint index) +{ + const auto pcanChannel = std::find_if(std::begin(pcanChannels), std::end(pcanChannels), + [index](PcanChannel channel) { + return channel.index == index; + }); + if (Q_LIKELY(pcanChannel != std::end(pcanChannels))) + return pcanChannel->name; + + qWarning("%s: Cannot get channel name for index %u.", Q_FUNC_INFO, index); + return QStringLiteral("none"); +} + +QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByAttachedChannels(Availability available, bool *ok) { *ok = true; quint32 count = 0; @@ -197,13 +210,8 @@ QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByAttachedChannels(bool *ok) QList<QCanBusDeviceInfo> result; for (quint32 i = 0; i < count; ++i) { auto info = infos[i]; - if (info.channel_condition & PCAN_CHANNEL_AVAILABLE) { - const quint32 deviceId = info.channel_handle; - const auto pcanChannel = std::find_if(std::begin(pcanChannels), std::end(pcanChannels), - [deviceId](PcanChannel channel) { - return channel.index == deviceId; - }); - const QString name = pcanChannel->name; + if (info.channel_condition & uint(available)) { + const QString name = pcanChannelNameForIndex(info.channel_handle); const QString description = info.device_name; const QString alias = QString::number(info.device_id); const int channel = info.controller_number; @@ -218,19 +226,43 @@ QList<QCanBusDeviceInfo> PeakCanBackend::interfacesByAttachedChannels(bool *ok) return result; } -QList<QCanBusDeviceInfo> PeakCanBackend::interfaces() +QList<QCanBusDeviceInfo> PeakCanBackend::attachedInterfaces(Availability available) { #ifdef Q_OS_WIN bool ok = false; - const QList<QCanBusDeviceInfo> attachedChannelsResult = interfacesByAttachedChannels(&ok); + const QList<QCanBusDeviceInfo> attachedChannelsResult = interfacesByAttachedChannels(available, &ok); if (ok) return attachedChannelsResult; #endif - const QList<QCanBusDeviceInfo> result = interfacesByChannelCondition(); + const QList<QCanBusDeviceInfo> result = interfacesByChannelCondition(available); return result; } +QList<QCanBusDeviceInfo> PeakCanBackend::interfaces() +{ + return attachedInterfaces(Availability::Available); +} + +QCanBusDeviceInfo PeakCanBackend::deviceInfo() const +{ + const uint index = d_ptr->channelIndex; + const QString name = pcanChannelNameForIndex(index); + const QList<QCanBusDeviceInfo> availableDevices = attachedInterfaces(Availability::Occupied); + + const auto deviceInfo = std::find_if(availableDevices.constBegin(), + availableDevices.constEnd(), + [name](const QCanBusDeviceInfo &info) { + return name == info.name(); + }); + + if (Q_LIKELY(deviceInfo != availableDevices.constEnd())) + return *deviceInfo; + + qWarning("%s: Cannot get device info for index %u.", Q_FUNC_INFO, index); + return QCanBusDevice::deviceInfo(); +} + #if defined(Q_OS_WIN32) class PeakCanReadNotifier : public QWinEventNotifier { diff --git a/src/plugins/canbus/peakcan/peakcanbackend.h b/src/plugins/canbus/peakcan/peakcanbackend.h index 5a4fc82..3a02d1e 100644 --- a/src/plugins/canbus/peakcan/peakcanbackend.h +++ b/src/plugins/canbus/peakcan/peakcanbackend.h @@ -68,15 +68,22 @@ public: QString interpretErrorFrame(const QCanBusFrame &errorFrame) override; static bool canCreate(QString *errorReason); - static QList<QCanBusDeviceInfo> interfacesByChannelCondition(); - static QList<QCanBusDeviceInfo> interfacesByAttachedChannels(bool *ok); static QList<QCanBusDeviceInfo> interfaces(); void resetController() override; bool hasBusStatus() const override; CanBusStatus busStatus() override; + QCanBusDeviceInfo deviceInfo() const override; private: + enum class Availability { + Available = 1U, // matches PCAN_CHANNEL_AVAILABLE + Occupied = 2U // matches PCAN_CHANNEL_OCCUPIED + }; + static QList<QCanBusDeviceInfo> interfacesByChannelCondition(Availability available); + static QList<QCanBusDeviceInfo> interfacesByAttachedChannels(Availability available, bool *ok); + static QList<QCanBusDeviceInfo> attachedInterfaces(Availability available); + PeakCanBackendPrivate * const d_ptr; }; diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp index 752c4aa..8d887bf 100644 --- a/src/plugins/canbus/socketcan/socketcanbackend.cpp +++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp @@ -127,6 +127,18 @@ static int deviceChannel(const QString &canDevice) return content.toInt(nullptr, 0); } +QCanBusDeviceInfo SocketCanBackend::socketCanDeviceInfo(const QString &deviceName) +{ + const QString serial; // exists for code readability purposes only + const QString alias; // exists for code readability purposes only + const QString description = deviceDescription(deviceName); + const int channel = deviceChannel(deviceName); + return createDeviceInfo(QStringLiteral("socketcan"), deviceName, + serial, description, + alias, channel, isVirtual(deviceName), + isFlexibleDataRateCapable(deviceName)); +} + QList<QCanBusDeviceInfo> SocketCanBackend::interfaces() { QList<QCanBusDeviceInfo> result; @@ -143,13 +155,7 @@ QList<QCanBusDeviceInfo> SocketCanBackend::interfaces() if (!(flags(deviceName) & DeviceIsActive)) continue; - const QString serial; - const QString description = deviceDescription(deviceName); - const int channel = deviceChannel(deviceName); - result.append(createDeviceInfo(QStringLiteral("socketcan"), deviceName, - serial, description, - QString(), channel, isVirtual(deviceName), - isFlexibleDataRateCapable(deviceName))); + result.append(socketCanDeviceInfo(deviceName)); } std::sort(result.begin(), result.end(), @@ -160,6 +166,11 @@ QList<QCanBusDeviceInfo> SocketCanBackend::interfaces() return result; } +QCanBusDeviceInfo SocketCanBackend::deviceInfo() const +{ + return socketCanDeviceInfo(canSocketName); +} + SocketCanBackend::SocketCanBackend(const QString &name) : canSocketName(name) { diff --git a/src/plugins/canbus/socketcan/socketcanbackend.h b/src/plugins/canbus/socketcan/socketcanbackend.h index 43d8383..d632126 100644 --- a/src/plugins/canbus/socketcan/socketcanbackend.h +++ b/src/plugins/canbus/socketcan/socketcanbackend.h @@ -98,11 +98,13 @@ public: QString interpretErrorFrame(const QCanBusFrame &errorFrame) override; + static QCanBusDeviceInfo socketCanDeviceInfo(const QString &deviceName); static QList<QCanBusDeviceInfo> interfaces(); void resetController() override; bool hasBusStatus() const override; CanBusStatus busStatus() override; + QCanBusDeviceInfo deviceInfo() const override; private Q_SLOTS: void readSocket(); diff --git a/src/plugins/canbus/systeccan/systeccan_symbols_p.h b/src/plugins/canbus/systeccan/systeccan_symbols_p.h index 037f994..e6e31ba 100644 --- a/src/plugins/canbus/systeccan/systeccan_symbols_p.h +++ b/src/plugins/canbus/systeccan/systeccan_symbols_p.h @@ -302,6 +302,8 @@ GENERATE_SYMBOL_VARIABLE(UCANRET, UcanReadCanMsgEx, tUcanHandle, quint8 *, tCanM GENERATE_SYMBOL_VARIABLE(UCANRET, UcanResetCan, tUcanHandle) GENERATE_SYMBOL_VARIABLE(UCANRET, UcanWriteCanMsgEx, tUcanHandle, quint8, tCanMsgStruct *, quint32 *) GENERATE_SYMBOL_VARIABLE(UCANRET, UcanGetStatus, tUcanHandle, tStatusStruct *) +GENERATE_SYMBOL_VARIABLE(UCANRET, UcanGetHardwareInfoEx2, tUcanHandle, tUcanHardwareInfoEx *, + void * /* channelInfo0 */, void * /* channelInfo1 */); inline bool resolveSystecCanSymbols(QLibrary *systecLibrary) { @@ -324,6 +326,7 @@ inline bool resolveSystecCanSymbols(QLibrary *systecLibrary) RESOLVE_SYMBOL(UcanResetCan); RESOLVE_SYMBOL(UcanWriteCanMsgEx); RESOLVE_SYMBOL(UcanGetStatus); + RESOLVE_SYMBOL(UcanGetHardwareInfoEx2); return true; } diff --git a/src/plugins/canbus/systeccan/systeccanbackend.cpp b/src/plugins/canbus/systeccan/systeccanbackend.cpp index a95d243..ac61641 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend.cpp +++ b/src/plugins/canbus/systeccan/systeccanbackend.cpp @@ -605,4 +605,14 @@ QCanBusDevice::CanBusStatus SystecCanBackend::busStatus() return d->busStatus(); } +QCanBusDeviceInfo SystecCanBackend::deviceInfo() const +{ + tUcanHardwareInfoEx hardwareInfo = {}; + UcanGetHardwareInfoEx2(d_ptr->handle, &hardwareInfo, nullptr, nullptr); + + const QString serialNumber = QString::number(hardwareInfo.m_dwSerialNr); + const QString description = descriptionString(hardwareInfo.m_dwProductCode); + return createDeviceInfo(serialNumber, description, hardwareInfo.m_bDeviceNr, d_ptr->channel); +} + QT_END_NAMESPACE diff --git a/src/plugins/canbus/systeccan/systeccanbackend.h b/src/plugins/canbus/systeccan/systeccanbackend.h index cd1a0ad..33ff0c8 100644 --- a/src/plugins/canbus/systeccan/systeccanbackend.h +++ b/src/plugins/canbus/systeccan/systeccanbackend.h @@ -78,6 +78,7 @@ public: void resetController() override; bool hasBusStatus() const override; CanBusStatus busStatus() override; + QCanBusDeviceInfo deviceInfo() const override; private: SystecCanBackendPrivate * const d_ptr; diff --git a/src/plugins/canbus/tinycan/tinycanbackend.cpp b/src/plugins/canbus/tinycan/tinycanbackend.cpp index 527cd14..a9e21cc 100644 --- a/src/plugins/canbus/tinycan/tinycanbackend.cpp +++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp @@ -603,4 +603,9 @@ void TinyCanBackend::resetController() d->resetController(); } +QCanBusDeviceInfo TinyCanBackend::deviceInfo() const +{ + return createDeviceInfo(QStringLiteral("tinycan"), QStringLiteral("can0.0"), false, false); +} + QT_END_NAMESPACE diff --git a/src/plugins/canbus/tinycan/tinycanbackend.h b/src/plugins/canbus/tinycan/tinycanbackend.h index ed28905..07bed12 100644 --- a/src/plugins/canbus/tinycan/tinycanbackend.h +++ b/src/plugins/canbus/tinycan/tinycanbackend.h @@ -71,6 +71,7 @@ public: static QList<QCanBusDeviceInfo> interfaces(); void resetController() override; + QCanBusDeviceInfo deviceInfo() const override; private: TinyCanBackendPrivate * const d_ptr; diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp index c05b57c..a2a2214 100644 --- a/src/plugins/canbus/vectorcan/vectorcanbackend.cpp +++ b/src/plugins/canbus/vectorcan/vectorcanbackend.cpp @@ -708,4 +708,23 @@ QCanBusDevice::CanBusStatus VectorCanBackend::busStatus() return QCanBusDevice::CanBusStatus::Unknown; } +QCanBusDeviceInfo VectorCanBackend::deviceInfo() const +{ + const QList<QCanBusDeviceInfo> availableDevices = interfaces(); + const int index = d_ptr->channelIndex; + const QString name = QStringLiteral("can%1").arg(index); + + const auto deviceInfo = std::find_if(availableDevices.constBegin(), + availableDevices.constEnd(), + [name](const QCanBusDeviceInfo &info) { + return name == info.name(); + }); + + if (Q_LIKELY(deviceInfo != availableDevices.constEnd())) + return *deviceInfo; + + qWarning("%s: Cannot get device info for index %d.", Q_FUNC_INFO, index); + return QCanBusDevice::deviceInfo(); +} + QT_END_NAMESPACE diff --git a/src/plugins/canbus/vectorcan/vectorcanbackend.h b/src/plugins/canbus/vectorcan/vectorcanbackend.h index 39dfcfa..f26bc1c 100644 --- a/src/plugins/canbus/vectorcan/vectorcanbackend.h +++ b/src/plugins/canbus/vectorcan/vectorcanbackend.h @@ -71,6 +71,7 @@ public: bool hasBusStatus() const override; CanBusStatus busStatus() override; + QCanBusDeviceInfo deviceInfo() const override; private: VectorCanBackendPrivate * const d_ptr; diff --git a/src/plugins/canbus/virtualcan/virtualcanbackend.cpp b/src/plugins/canbus/virtualcan/virtualcanbackend.cpp index 4e02c7d..62f0bd4 100644 --- a/src/plugins/canbus/virtualcan/virtualcanbackend.cpp +++ b/src/plugins/canbus/virtualcan/virtualcanbackend.cpp @@ -300,21 +300,30 @@ QString VirtualCanBackend::interpretErrorFrame(const QCanBusFrame &errorFrame) return QString(); } +QCanBusDeviceInfo VirtualCanBackend::virtualCanDeviceInfo(uint channel) +{ + return createDeviceInfo( + QStringLiteral("virtualcan"), + QStringLiteral("can%1").arg(channel), QString(), + QStringLiteral("Qt Virtual CAN bus"), QString(), + channel, true, true); +} + QList<QCanBusDeviceInfo> VirtualCanBackend::interfaces() { QList<QCanBusDeviceInfo> result; - for (int channel = 0; channel < VirtualChannels; ++channel) { - result.append(createDeviceInfo( - QStringLiteral("virtualcan"), - QStringLiteral("can%1").arg(channel), QString(), - QStringLiteral("Qt Virtual CAN bus"), QString(), - channel, true, true)); - } + for (uint channel = 0; channel < VirtualChannels; ++channel) + result.append(virtualCanDeviceInfo(channel)); return result; } +QCanBusDeviceInfo VirtualCanBackend::deviceInfo() const +{ + return virtualCanDeviceInfo(m_channel); +} + void VirtualCanBackend::clientConnected() { qCInfo(QT_CANBUS_PLUGINS_VIRTUALCAN, "Client [%p] socket connected.", this); diff --git a/src/plugins/canbus/virtualcan/virtualcanbackend.h b/src/plugins/canbus/virtualcan/virtualcanbackend.h index 0d908ca..ea4e7da 100644 --- a/src/plugins/canbus/virtualcan/virtualcanbackend.h +++ b/src/plugins/canbus/virtualcan/virtualcanbackend.h @@ -90,7 +90,11 @@ public: static QList<QCanBusDeviceInfo> interfaces(); + QCanBusDeviceInfo deviceInfo() const override; + private: + static QCanBusDeviceInfo virtualCanDeviceInfo(uint channel); + void clientConnected(); void clientDisconnected(); void clientReadyRead(); |