diff options
Diffstat (limited to 'src/plugins/canbus/tinycan')
-rw-r--r-- | src/plugins/canbus/tinycan/main.cpp | 11 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.cpp | 59 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend.h | 2 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/tinycanbackend_p.h | 8 |
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 |