diff options
Diffstat (limited to 'src/plugins/canbus/peakcan/peakcanbackend.cpp')
-rw-r--r-- | src/plugins/canbus/peakcan/peakcanbackend.cpp | 168 |
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; } |