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.cpp4
-rw-r--r--src/plugins/canbus/tinycan/tinycan_symbols_p.h15
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend.cpp51
-rw-r--r--src/plugins/canbus/tinycan/tinycanbackend_p.h2
4 files changed, 22 insertions, 50 deletions
diff --git a/src/plugins/canbus/tinycan/main.cpp b/src/plugins/canbus/tinycan/main.cpp
index e8a084c..fe988ba 100644
--- a/src/plugins/canbus/tinycan/main.cpp
+++ b/src/plugins/canbus/tinycan/main.cpp
@@ -51,11 +51,13 @@ class TinyCanBusPlugin : public QObject, public QCanBusFactory
public:
- QCanBusDevice *createDevice(const QString &interfaceName) const
+ QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const override
{
QString errorReason;
if (!TinyCanBackend::canCreate(&errorReason)) {
qWarning("%ls", qUtf16Printable(errorReason));
+ if (errorMessage)
+ *errorMessage = errorReason;
return nullptr;
}
diff --git a/src/plugins/canbus/tinycan/tinycan_symbols_p.h b/src/plugins/canbus/tinycan/tinycan_symbols_p.h
index 5ad149c..6e05b92 100644
--- a/src/plugins/canbus/tinycan/tinycan_symbols_p.h
+++ b/src/plugins/canbus/tinycan/tinycan_symbols_p.h
@@ -285,7 +285,7 @@ typedef void (DRV_CALLBACK_TYPE *CanRxEventCallback)(
static fp_##symbolName symbolName;
#define RESOLVE_SYMBOL(symbolName) \
- symbolName = (fp_##symbolName)resolveSymbol(mhstcanLibrary, #symbolName); \
+ symbolName = (fp_##symbolName)mhstcanLibrary->resolve(#symbolName); \
if (!symbolName) \
return false;
@@ -317,23 +317,12 @@ GENERATE_SYMBOL_VARIABLE(void, CanSetRxEventCallback, CanRxEventCallback)
GENERATE_SYMBOL_VARIABLE(void, CanSetEvents, quint16)
GENERATE_SYMBOL_VARIABLE(quint32, CanEventStatus, void)
-inline QFunctionPointer resolveSymbol(QLibrary *mhstcanLibrary, const char *symbolName)
-{
- QFunctionPointer symbolFunctionPointer = mhstcanLibrary->resolve(symbolName);
- if (!symbolFunctionPointer)
- qWarning("Failed to resolve the mhstcan symbol: %s", symbolName);
-
- return symbolFunctionPointer;
-}
-
inline bool resolveSymbols(QLibrary *mhstcanLibrary)
{
if (!mhstcanLibrary->isLoaded()) {
mhstcanLibrary->setFileName(QStringLiteral("mhstcan"));
- if (!mhstcanLibrary->load()) {
- qWarning("Failed to load the library: %s", qPrintable(mhstcanLibrary->fileName()));
+ if (!mhstcanLibrary->load())
return false;
- }
}
RESOLVE_SYMBOL(CanInitDriver)
diff --git a/src/plugins/canbus/tinycan/tinycanbackend.cpp b/src/plugins/canbus/tinycan/tinycanbackend.cpp
index 2cee2d0..0961813 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend.cpp
+++ b/src/plugins/canbus/tinycan/tinycanbackend.cpp
@@ -197,6 +197,9 @@ bool TinyCanBackendPrivate::open()
}
}
+ writeNotifier = new WriteNotifier(this, q);
+ writeNotifier->setInterval(0);
+
isOpen = true;
return true;
}
@@ -205,6 +208,9 @@ void TinyCanBackendPrivate::close()
{
Q_Q(TinyCanBackend);
+ delete writeNotifier;
+ writeNotifier = nullptr;
+
const int ret = ::CanDeviceClose(channelIndex);
if (ret < 0)
q->setError(systemErrorString(ret), QCanBusDevice::CanBusError::ConnectionError);
@@ -299,9 +305,9 @@ QString TinyCanBackendPrivate::systemErrorString(int errorCode)
static int channelIndexFromName(const QString &interfaceName)
{
- if (interfaceName == QStringLiteral("channela"))
+ if (interfaceName == QStringLiteral("can0.0"))
return INDEX_CAN_KANAL_A;
- else if (interfaceName == QStringLiteral("channelb"))
+ else if (interfaceName == QStringLiteral("can0.1"))
return INDEX_CAN_KANAL_B;
else
return INDEX_INVALID;
@@ -320,30 +326,12 @@ void TinyCanBackendPrivate::setupDefaultConfigurations()
q->setConfigurationParameter(QCanBusDevice::BitRateKey, 500000);
}
-void TinyCanBackendPrivate::enableWriteNotification(bool enable)
-{
- Q_Q(TinyCanBackend);
-
- if (writeNotifier) {
- if (enable) {
- if (!writeNotifier->isActive())
- writeNotifier->start();
- } else {
- writeNotifier->stop();
- }
- } else if (enable) {
- writeNotifier = new WriteNotifier(this, q);
- writeNotifier->setInterval(0);
- writeNotifier->start();
- }
-}
-
void TinyCanBackendPrivate::startWrite()
{
Q_Q(TinyCanBackend);
if (!q->hasOutgoingFrames()) {
- enableWriteNotification(false);
+ writeNotifier->stop();
return;
}
@@ -372,16 +360,8 @@ void TinyCanBackendPrivate::startWrite()
emit q->framesWritten(messagesToWrite);
}
- if (q->hasOutgoingFrames())
- enableWriteNotification(true);
-}
-
-bool TinyCanBackendPrivate::enableReadNotification()
-{
- ::CanSetRxEventCallback(&canRxEventCallback);
- ::CanSetEvents(EVENT_ENABLE_RX_MESSAGES);
-
- return true;
+ if (q->hasOutgoingFrames() && !writeNotifier->isActive())
+ writeNotifier->start();
}
// this method is called from the different thread!
@@ -431,7 +411,7 @@ void TinyCanBackendPrivate::startRead()
else
frame.setFrameType(QCanBusFrame::DataFrame);
- newFrames.append(frame);
+ newFrames.append(std::move(frame));
}
q->enqueueReceivedFrames(newFrames);
@@ -448,7 +428,8 @@ void TinyCanBackendPrivate::startupDriver()
return;
}
- enableReadNotification();
+ ::CanSetRxEventCallback(&canRxEventCallback);
+ ::CanSetEvents(EVENT_ENABLE_RX_MESSAGES);
} else if (driverRefCount < 0) {
qCritical("Wrong reference counter: %d", driverRefCount);
@@ -578,7 +559,9 @@ bool TinyCanBackend::writeFrame(const QCanBusFrame &newData)
}
enqueueOutgoingFrame(newData);
- d->enableWriteNotification(true);
+
+ if (!d->writeNotifier->isActive())
+ d->writeNotifier->start();
return true;
}
diff --git a/src/plugins/canbus/tinycan/tinycanbackend_p.h b/src/plugins/canbus/tinycan/tinycanbackend_p.h
index 14630dd..18c82ef 100644
--- a/src/plugins/canbus/tinycan/tinycanbackend_p.h
+++ b/src/plugins/canbus/tinycan/tinycanbackend_p.h
@@ -70,9 +70,7 @@ public:
QString systemErrorString(int errorCode);
void setupChannel(const QString &interfaceName);
void setupDefaultConfigurations();
- void enableWriteNotification(bool enable);
void startWrite();
- bool enableReadNotification();
void startRead();
void startupDriver();
void cleanupDriver();