summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/tinycan
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/tinycan')
-rw-r--r--src/plugins/canbus/tinycan/main.cpp11
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.cpp59
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.h2
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend_p.h8
4 files changed, 46 insertions, 34 deletions
diff --git a/src/plugins/canbus/tinycan/main.cpp b/src/plugins/canbus/tinycan/main.cpp
index 108818b..c73d81e 100644
--- a/src/plugins/canbus/tinycan/main.cpp
+++ b/src/plugins/canbus/tinycan/main.cpp
@@ -43,14 +43,19 @@
QT_BEGIN_NAMESPACE
-class TinyCanBusPlugin : public QObject, public QCanBusFactory
+class TinyCanBusPlugin : public QObject, public QCanBusFactoryV2
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json")
- Q_INTERFACES(QCanBusFactory)
-
+ Q_INTERFACES(QCanBusFactoryV2)
public:
+ QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override
+ {
+ Q_UNUSED(errorMessage);
+ return TinyCanBackend::interfaces();
+ }
+
QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const override
{
QString errorReason;
diff --git a/src/plugins/canbus/tinycan/tinycanbackend.cpp b/src/plugins/canbus/tinycan/tinycanbackend.cpp
index 86aa2b8..6405308 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend.cpp
+++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp
@@ -60,7 +60,7 @@ bool TinyCanBackend::canCreate(QString *errorReason)
return true;
#else
static bool symbolsResolved = resolveSymbols(mhstcanLibrary());
- if (!symbolsResolved) {
+ if (Q_UNLIKELY(!symbolsResolved)) {
*errorReason = mhstcanLibrary()->errorString();
return false;
}
@@ -68,6 +68,11 @@ bool TinyCanBackend::canCreate(QString *errorReason)
#endif
}
+QList<QCanBusDeviceInfo> TinyCanBackend::interfaces()
+{
+ return { createDeviceInfo(QStringLiteral("can0.0")), createDeviceInfo(QStringLiteral("can0.1")) };
+}
+
Q_GLOBAL_STATIC(QList<TinyCanBackendPrivate *>, qChannels)
static QMutex channelsGuard(QMutex::NonRecursive);
@@ -104,7 +109,7 @@ static void DRV_CALLBACK_TYPE canRxEventCallback(quint32 index, TCanMsg *frame,
Q_UNUSED(count);
QMutexLocker lock(&channelsGuard);
- foreach (TinyCanBackendPrivate *p, *qChannels()) {
+ for (TinyCanBackendPrivate *p : qAsConst(*qChannels())) {
if (p->channelIndex == int(index)) {
p->startRead();
return;
@@ -114,9 +119,6 @@ static void DRV_CALLBACK_TYPE canRxEventCallback(quint32 index, TCanMsg *frame,
TinyCanBackendPrivate::TinyCanBackendPrivate(TinyCanBackend *q)
: q_ptr(q)
- , isOpen(false)
- , channelIndex(INDEX_INVALID)
- , writeNotifier(nullptr)
{
startupDriver();
@@ -174,7 +176,7 @@ bool TinyCanBackendPrivate::open()
{
char options[] = "AutoConnect=1;AutoReopen=0";
const int ret = ::CanSetOptions(options);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
return false;
}
@@ -182,7 +184,7 @@ bool TinyCanBackendPrivate::open()
{
const int ret = ::CanDeviceOpen(channelIndex, nullptr);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
return false;
}
@@ -190,7 +192,7 @@ bool TinyCanBackendPrivate::open()
{
const int ret = ::CanSetMode(channelIndex, OP_CAN_START, CAN_CMD_ALL_CLEAR);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
::CanDeviceClose(channelIndex);
return false;
@@ -212,7 +214,7 @@ void TinyCanBackendPrivate::close()
writeNotifier = nullptr;
const int ret = ::CanDeviceClose(channelIndex);
- if (ret < 0)
+ if (Q_UNLIKELY(ret < 0))
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
isOpen = false;
@@ -341,8 +343,8 @@ void TinyCanBackendPrivate::startWrite()
TCanMsg message;
::memset(&message, 0, sizeof(message));
- if (payload.size() > int(sizeof(message.Data.Bytes))) {
- qWarning("Impossible to write the message with unacceptable data size %d, ignored", payload.size());
+ if (Q_UNLIKELY(payload.size() > int(sizeof(message.Data.Bytes)))) {
+ qWarning("Can not write frame with payload size %d, ignored", payload.size());
} else {
message.Id = frame.frameId();
message.Flags.Flag.Len = payload.size();
@@ -354,7 +356,7 @@ void TinyCanBackendPrivate::startWrite()
const qint32 messagesToWrite = 1;
::memcpy(message.Data.Bytes, payload.constData(), sizeof(message.Data.Bytes));
const int ret = ::CanTransmit(channelIndex, &message, messagesToWrite);
- if (ret < 0)
+ if (Q_UNLIKELY(ret < 0))
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::WriteError);
else
emit q->framesWritten(messagesToWrite);
@@ -371,7 +373,7 @@ void TinyCanBackendPrivate::startRead()
QVector<QCanBusFrame> newFrames;
- forever {
+ for (;;) {
if (!::CanReceiveGetCount(channelIndex))
break;
@@ -380,7 +382,7 @@ void TinyCanBackendPrivate::startRead()
const int messagesToRead = 1;
const int ret = ::CanReceive(channelIndex, &message, messagesToRead);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ReadError);
TDeviceStatus status;
@@ -423,7 +425,7 @@ void TinyCanBackendPrivate::startupDriver()
if (driverRefCount == 0) {
const int ret = ::CanInitDriver(nullptr);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
return;
}
@@ -431,7 +433,7 @@ void TinyCanBackendPrivate::startupDriver()
::CanSetRxEventCallback(&canRxEventCallback);
::CanSetEvents(EVENT_ENABLE_RX_MESSAGES);
- } else if (driverRefCount < 0) {
+ } else if (Q_UNLIKELY(driverRefCount < 0)) {
qCritical("Wrong reference counter: %d", driverRefCount);
return;
}
@@ -443,7 +445,7 @@ void TinyCanBackendPrivate::cleanupDriver()
{
--driverRefCount;
- if (driverRefCount < 0) {
+ if (Q_UNLIKELY(driverRefCount < 0)) {
qCritical("Wrong reference counter: %d", driverRefCount);
driverRefCount = 0;
} else if (driverRefCount == 0) {
@@ -457,7 +459,7 @@ bool TinyCanBackendPrivate::setBitRate(int bitrate)
Q_Q(TinyCanBackend);
const int bitrateCode = bitrateCodeFromBitrate(bitrate);
- if (bitrateCode == -1) {
+ if (Q_UNLIKELY(bitrateCode == -1)) {
q->setError(TinyCanBackend::tr("Unsupported bitrate value"),
QCanBusDevice::ConfigurationError);
return false;
@@ -465,7 +467,7 @@ bool TinyCanBackendPrivate::setBitRate(int bitrate)
if (isOpen) {
const int ret = ::CanSetSpeed(channelIndex, bitrateCode);
- if (ret < 0) {
+ if (Q_UNLIKELY(ret < 0)) {
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConfigurationError);
return false;
}
@@ -501,12 +503,13 @@ bool TinyCanBackend::open()
}
// apply all stored configurations
- foreach (int key, configurationKeys()) {
+ const auto keys = configurationKeys();
+ for (int key : keys) {
const QVariant param = configurationParameter(key);
const bool success = d->setConfigurationParameter(key, param);
- if (!success) {
- qWarning() << "Cannot apply parameter:" << key
- << "with value:" << param;
+ if (Q_UNLIKELY(!success)) {
+ qWarning("Cannot apply parameter: %d with value: %ls",
+ key, qUtf16Printable(param.toString()));
}
}
}
@@ -536,24 +539,24 @@ bool TinyCanBackend::writeFrame(const QCanBusFrame &newData)
{
Q_D(TinyCanBackend);
- if (state() != QCanBusDevice::ConnectedState)
+ if (Q_UNLIKELY(state() != QCanBusDevice::ConnectedState))
return false;
- if (!newData.isValid()) {
+ if (Q_UNLIKELY(!newData.isValid())) {
setError(tr("Cannot write invalid QCanBusFrame"), QCanBusDevice::WriteError);
return false;
}
- if (newData.frameType() != QCanBusFrame::DataFrame
+ if (Q_UNLIKELY(newData.frameType() != QCanBusFrame::DataFrame
&& newData.frameType() != QCanBusFrame::RemoteRequestFrame
- && newData.frameType() != QCanBusFrame::ErrorFrame) {
+ && newData.frameType() != QCanBusFrame::ErrorFrame)) {
setError(tr("Unable to write a frame with unacceptable type"),
QCanBusDevice::WriteError);
return false;
}
// CAN FD frame format not supported at this stage
- if (newData.payload().size() > 8) {
+ if (Q_UNLIKELY(newData.payload().size() > 8)) {
setError(tr("CAN FD frame format not supported."), QCanBusDevice::WriteError);
return false;
}
diff --git a/src/plugins/canbus/tinycan/tinycanbackend.h b/src/plugins/canbus/tinycan/tinycanbackend.h
index c263c22..5f504ca 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend.h
+++ b/src/plugins/canbus/tinycan/tinycanbackend.h
@@ -40,6 +40,7 @@
#include <QtSerialBus/qcanbusframe.h>
#include <QtSerialBus/qcanbusdevice.h>
+#include <QtSerialBus/qcanbusdeviceinfo.h>
#include <QtCore/qvariant.h>
#include <QtCore/qvector.h>
@@ -68,6 +69,7 @@ public:
QString interpretErrorFrame(const QCanBusFrame &errorFrame) override;
static bool canCreate(QString *errorReason);
+ static QList<QCanBusDeviceInfo> interfaces();
private:
TinyCanBackendPrivate * const d_ptr;
diff --git a/src/plugins/canbus/tinycan/tinycanbackend_p.h b/src/plugins/canbus/tinycan/tinycanbackend_p.h
index c30b55d..905175c 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend_p.h
+++ b/src/plugins/canbus/tinycan/tinycanbackend_p.h
@@ -39,6 +39,7 @@
#define TINYCANBACKEND_P_H
#include "tinycanbackend.h"
+#include "tinycan_symbols_p.h"
//
// W A R N I N G
@@ -78,9 +79,10 @@ public:
bool setBitRate(int bitrate);
TinyCanBackend * const q_ptr;
- bool isOpen;
- int channelIndex;
- QTimer *writeNotifier;
+
+ bool isOpen = false;
+ int channelIndex = INDEX_INVALID;
+ QTimer *writeNotifier = nullptr;
};
QT_END_NAMESPACE