summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/peakcan/peakcanbackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/peakcan/peakcanbackend.cpp')
-rw-r--r--src/plugins/canbus/peakcan/peakcanbackend.cpp168
1 files changed, 63 insertions, 105 deletions
diff --git a/src/plugins/canbus/peakcan/peakcanbackend.cpp b/src/plugins/canbus/peakcan/peakcanbackend.cpp
index 3f5d2c0..d8ddf76 100644
--- a/src/plugins/canbus/peakcan/peakcanbackend.cpp
+++ b/src/plugins/canbus/peakcan/peakcanbackend.cpp
@@ -214,13 +214,28 @@ bool PeakCanBackendPrivate::open()
return false;
}
- if (!acquireReadNotification()) {
- const TPCANStatus st = ::CAN_Uninitialize(channelIndex);
- if (st != PCAN_ERROR_OK)
- q->setError(systemErrorString(st), QCanBusDevice::ConnectionError);
+#if defined(Q_OS_WIN32)
+ if (readHandle == INVALID_HANDLE_VALUE) {
+ readHandle = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
+ if (!readHandle) {
+ q->setError(qt_error_string(::GetLastError()), QCanBusDevice::ConnectionError);
+ return false;
+ }
+ }
+#endif
+
+ const TPCANStatus err = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT, &readHandle, sizeof(readHandle));
+ if (err != PCAN_ERROR_OK) {
+ q->setError(systemErrorString(err), QCanBusDevice::ConnectionError);
return false;
}
+ writeNotifier = new WriteNotifier(this, q);
+ writeNotifier->setInterval(0);
+
+ readNotifier = new ReadNotifier(this, q);
+ readNotifier->setEnabled(true);
+
isOpen = true;
return true;
}
@@ -229,18 +244,31 @@ void PeakCanBackendPrivate::close()
{
Q_Q(PeakCanBackend);
- enableWriteNotification(false);
- releaseReadNotification();
+ delete readNotifier;
+ readNotifier = nullptr;
- if (writeNotifier) {
- delete writeNotifier;
- writeNotifier = nullptr;
- }
+ delete writeNotifier;
+ writeNotifier = nullptr;
+
+ quint32 value = 0;
+ const TPCANStatus err = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT, &value, sizeof(value));
+ if (err != PCAN_ERROR_OK)
+ emit q->setError(systemErrorString(err), QCanBusDevice::ConnectionError);
const TPCANStatus st = ::CAN_Uninitialize(channelIndex);
if (st != PCAN_ERROR_OK)
q->setError(systemErrorString(st), QCanBusDevice::ConnectionError);
+#if defined(Q_OS_WIN32)
+ if (readHandle && (readHandle != INVALID_HANDLE_VALUE)) {
+ if (!::CloseHandle(readHandle))
+ q->setError(qt_error_string(::GetLastError()), QCanBusDevice::ConnectionError);
+ readHandle = INVALID_HANDLE_VALUE;
+ }
+#else
+ readHandle = -1;
+#endif
+
isOpen = false;
}
@@ -260,37 +288,37 @@ bool PeakCanBackendPrivate::setConfigurationParameter(int key, const QVariant &v
static int channelIndexFromName(const QString &interfaceName)
{
- if (interfaceName == QStringLiteral("usbbus1"))
+ if (interfaceName == QStringLiteral("usb0"))
return PCAN_USBBUS1;
- else if (interfaceName == QStringLiteral("usbbus2"))
+ else if (interfaceName == QStringLiteral("usb1"))
return PCAN_USBBUS2;
- else if (interfaceName == QStringLiteral("usbbus3"))
+ else if (interfaceName == QStringLiteral("usb2"))
return PCAN_USBBUS3;
- else if (interfaceName == QStringLiteral("usbbus4"))
+ else if (interfaceName == QStringLiteral("usb3"))
return PCAN_USBBUS4;
- else if (interfaceName == QStringLiteral("usbbus5"))
+ else if (interfaceName == QStringLiteral("usb4"))
return PCAN_USBBUS5;
- else if (interfaceName == QStringLiteral("usbbus6"))
+ else if (interfaceName == QStringLiteral("usb5"))
return PCAN_USBBUS6;
- else if (interfaceName == QStringLiteral("usbbus7"))
+ else if (interfaceName == QStringLiteral("usb6"))
return PCAN_USBBUS7;
- else if (interfaceName == QStringLiteral("usbbus8"))
+ else if (interfaceName == QStringLiteral("usb7"))
return PCAN_USBBUS8;
- else if (interfaceName == QStringLiteral("pcibus1"))
+ else if (interfaceName == QStringLiteral("pci0"))
return PCAN_PCIBUS1;
- else if (interfaceName == QStringLiteral("pcibus2"))
+ else if (interfaceName == QStringLiteral("pci1"))
return PCAN_PCIBUS2;
- else if (interfaceName == QStringLiteral("pcibus3"))
+ else if (interfaceName == QStringLiteral("pci2"))
return PCAN_PCIBUS3;
- else if (interfaceName == QStringLiteral("pcibus4"))
+ else if (interfaceName == QStringLiteral("pci3"))
return PCAN_PCIBUS4;
- else if (interfaceName == QStringLiteral("pcibus5"))
+ else if (interfaceName == QStringLiteral("pci4"))
return PCAN_PCIBUS5;
- else if (interfaceName == QStringLiteral("pcibus6"))
+ else if (interfaceName == QStringLiteral("pci5"))
return PCAN_PCIBUS6;
- else if (interfaceName == QStringLiteral("pcibus7"))
+ else if (interfaceName == QStringLiteral("pci6"))
return PCAN_PCIBUS7;
- else if (interfaceName == QStringLiteral("pcibus8"))
+ else if (interfaceName == QStringLiteral("pci7"))
return PCAN_PCIBUS8;
else // TODO: Add other indexes here
return PCAN_NONEBUS;
@@ -317,30 +345,12 @@ QString PeakCanBackendPrivate::systemErrorString(int errorCode)
return QString::fromLatin1(buffer);
}
-void PeakCanBackendPrivate::enableWriteNotification(bool enable)
-{
- Q_Q(PeakCanBackend);
-
- 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 PeakCanBackendPrivate::startWrite()
{
Q_Q(PeakCanBackend);
if (!q->hasOutgoingFrames()) {
- enableWriteNotification(false);
+ writeNotifier->stop();
return;
}
@@ -365,62 +375,8 @@ void PeakCanBackendPrivate::startWrite()
else
emit q->framesWritten(qint64(1));
- if (q->hasOutgoingFrames())
- enableWriteNotification(true);
-}
-
-bool PeakCanBackendPrivate::acquireReadNotification()
-{
- Q_Q(PeakCanBackend);
-
-#if defined(Q_OS_WIN32)
- if (readHandle == INVALID_HANDLE_VALUE) {
- readHandle = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
- if (!readHandle) {
- q->setError(qt_error_string(::GetLastError()), QCanBusDevice::ReadError);
- return false;
- }
- }
-#endif
-
- const TPCANStatus st = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT,
- &readHandle, sizeof(readHandle));
- if (st != PCAN_ERROR_OK) {
- q->setError(systemErrorString(st), QCanBusDevice::ReadError);
- return false;
- }
-
- if (!readNotifier) {
- readNotifier = new ReadNotifier(this, q);
- readNotifier->setEnabled(true);
- }
-
- return true;
-}
-
-void PeakCanBackendPrivate::releaseReadNotification()
-{
- Q_Q(PeakCanBackend);
-
- quint32 value = 0;
- const TPCANStatus st = ::CAN_SetValue(channelIndex, PCAN_RECEIVE_EVENT, &value, sizeof(value));
- if (st != PCAN_ERROR_OK)
- q->setError(systemErrorString(st), QCanBusDevice::ConnectionError);
-
- if (readNotifier) {
- delete readNotifier;
- readNotifier = nullptr;
- }
-
-#if defined(Q_OS_WIN32)
- if (readHandle && (readHandle != INVALID_HANDLE_VALUE)) {
- if (!::CloseHandle(readHandle))
- q->setError(qt_error_string(::GetLastError()), QCanBusDevice::ConnectionError);
- readHandle = INVALID_HANDLE_VALUE;
- }
-#else
- readHandle = -1;
-#endif
+ if (q->hasOutgoingFrames() && !writeNotifier->isActive())
+ writeNotifier->start();
}
void PeakCanBackendPrivate::startRead()
@@ -444,12 +400,12 @@ void PeakCanBackendPrivate::startRead()
QCanBusFrame frame(message.ID, QByteArray(reinterpret_cast<const char *>(message.DATA), int(message.LEN)));
const quint64 millis = timestamp.millis + Q_UINT64_C(0xFFFFFFFF) * timestamp.millis_overflow;
- const quint64 micros = Q_UINT64_C(1000) * (millis % 1000) + timestamp.micros;
- frame.setTimeStamp(QCanBusFrame::TimeStamp(millis / 1000, micros));
+ const quint64 micros = Q_UINT64_C(1000) * millis + timestamp.micros;
+ frame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(micros));
frame.setExtendedFrameFormat(message.MSGTYPE & PCAN_MESSAGE_EXTENDED);
frame.setFrameType((message.MSGTYPE & PCAN_MESSAGE_RTR) ? QCanBusFrame::RemoteRequestFrame : QCanBusFrame::DataFrame);
- newFrames.append(frame);
+ newFrames.append(std::move(frame));
}
q->enqueueReceivedFrames(newFrames);
@@ -563,7 +519,9 @@ bool PeakCanBackend::writeFrame(const QCanBusFrame &newData)
}
enqueueOutgoingFrame(newData);
- d->enableWriteNotification(true);
+
+ if (!d->writeNotifier->isActive())
+ d->writeNotifier->start();
return true;
}