summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2021-07-27 17:41:27 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-08-05 18:01:35 +0000
commit7ce86ac2d79bd8090b6818dfdceba1519760dbf3 (patch)
treecf3825e30b19579f22367fa127f5741ffe2a13a5
parent94783653033447768376e2ea075c5214d72ff7a1 (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. Change-Id: I3836a81a9cb1570a22b6264b34fca88ccc0ab57e Reviewed-by: André Hartmann <aha_1980@gmx.de> (cherry picked from commit a9a7ffb5a97f254a57591e69c3e24212d1743cf4) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/canbus/passthrucan/passthrucanbackend.cpp5
-rw-r--r--src/plugins/canbus/passthrucan/passthrucanbackend.h1
-rw-r--r--src/plugins/canbus/peakcan/peakcanbackend.cpp60
-rw-r--r--src/plugins/canbus/peakcan/peakcanbackend.h11
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp25
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.h2
-rw-r--r--src/plugins/canbus/systeccan/systeccan_symbols_p.h3
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.cpp10
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.h1
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.cpp5
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.h1
-rw-r--r--src/plugins/canbus/vectorcan/vectorcanbackend.cpp19
-rw-r--r--src/plugins/canbus/vectorcan/vectorcanbackend.h1
-rw-r--r--src/plugins/canbus/virtualcan/virtualcanbackend.cpp23
-rw-r--r--src/plugins/canbus/virtualcan/virtualcanbackend.h4
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 27a8ce7..d16d471 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend.cpp
+++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp
@@ -608,4 +608,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();