diff options
Diffstat (limited to 'src/plugins/canbus/socketcan/socketcanbackend.cpp')
-rw-r--r-- | src/plugins/canbus/socketcan/socketcanbackend.cpp | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp index 2ec4379..c890fff 100644 --- a/src/plugins/canbus/socketcan/socketcanbackend.cpp +++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp @@ -262,9 +262,7 @@ bool SocketCanBackend::applyConfigurationParameter(int key, const QVariant &valu filters.resize(filterList.size()); for (int i = 0; i < filterList.size(); i++) { const QCanBusDevice::Filter f = filterList.at(i); - can_filter filter; - filter.can_id = f.frameId; - filter.can_mask = f.frameIdMask; + can_filter filter = { f.frameId, f.frameIdMask }; // frame type filter switch (f.type) { @@ -328,13 +326,11 @@ bool SocketCanBackend::applyConfigurationParameter(int key, const QVariant &valu break; } - //qDebug() << "applyConfiguration" << key << value << success; return success; } bool SocketCanBackend::connectSocket() { - struct sockaddr_can address; struct ifreq interface; if (Q_UNLIKELY((canSocket = socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW)) < 0)) { @@ -350,15 +346,21 @@ bool SocketCanBackend::connectSocket() return false; } - address.can_family = AF_CAN; - address.can_ifindex = interface.ifr_ifindex; + m_address.can_family = AF_CAN; + m_address.can_ifindex = interface.ifr_ifindex; - if (Q_UNLIKELY(bind(canSocket, reinterpret_cast<struct sockaddr *>(&address), sizeof(address)) < 0)) { + if (Q_UNLIKELY(bind(canSocket, reinterpret_cast<struct sockaddr *>(&m_address), sizeof(m_address)) < 0)) { setError(qt_error_string(errno), QCanBusDevice::CanBusError::ConnectionError); return false; } + m_iov.iov_base = &m_frame; + m_msg.msg_name = &m_address; + m_msg.msg_iov = &m_iov; + m_msg.msg_iovlen = 1; + m_msg.msg_control = &m_ctrlmsg; + delete notifier; notifier = new QSocketNotifier(canSocket, QSocketNotifier::Read, this); @@ -435,12 +437,12 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData) if (newData.frameType() == QCanBusFrame::RemoteRequestFrame) { canId |= CAN_RTR_FLAG; } else if (newData.frameType() == QCanBusFrame::ErrorFrame) { - canId = (uint)(newData.error() & QCanBusFrame::AnyError); + canId = static_cast<canid_t>((newData.error() & QCanBusFrame::AnyError)); canId |= CAN_ERR_FLAG; } if (Q_UNLIKELY(!canFdOptionEnabled && newData.hasFlexibleDataRateFormat())) { - const QString error = tr("Sending CAN FD frame although CAN FD option not enabled."); + const QString error = tr("Cannot write CAN FD frame because CAN FD option is not enabled."); qDebug("%ls", qUtf16Printable(error)); setError(error, QCanBusDevice::WriteError); return false; @@ -449,7 +451,7 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData) qint64 bytesWritten = 0; if (newData.hasFlexibleDataRateFormat()) { canfd_frame frame; - memset(&frame, 0, sizeof(frame)); + ::memset(&frame, 0, sizeof(frame)); frame.len = newData.payload().size(); frame.can_id = canId; frame.flags = newData.hasBitrateSwitch() ? CANFD_BRS : 0; @@ -459,7 +461,7 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData) bytesWritten = ::write(canSocket, &frame, sizeof(frame)); } else { can_frame frame; - memset(&frame, 0, sizeof(frame)); + ::memset(&frame, 0, sizeof(frame)); frame.can_dlc = newData.payload().size(); frame.can_id = canId; ::memcpy(frame.data, newData.payload().constData(), frame.can_dlc); @@ -646,10 +648,13 @@ void SocketCanBackend::readSocket() QVector<QCanBusFrame> newFrames; for (;;) { - struct canfd_frame frame; - int bytesReceived; + ::memset(&m_frame, 0, sizeof(m_frame)); + m_iov.iov_len = sizeof(m_frame); + m_msg.msg_namelen = sizeof(m_addr); + m_msg.msg_controllen = sizeof(m_ctrlmsg); + m_msg.msg_flags = 0; - bytesReceived = ::read(canSocket, &frame, sizeof(frame)); + const int bytesReceived = ::recvmsg(canSocket, &m_msg, 0); if (bytesReceived <= 0) { break; @@ -657,7 +662,7 @@ void SocketCanBackend::readSocket() setError(tr("ERROR SocketCanBackend: incomplete CAN frame"), QCanBusDevice::CanBusError::ReadError); continue; - } else if (Q_UNLIKELY(frame.len > bytesReceived - offsetof(canfd_frame, data))) { + } else if (Q_UNLIKELY(m_frame.len > bytesReceived - offsetof(canfd_frame, data))) { setError(tr("ERROR SocketCanBackend: invalid CAN frame length"), QCanBusDevice::CanBusError::ReadError); continue; @@ -667,7 +672,7 @@ void SocketCanBackend::readSocket() if (Q_UNLIKELY(ioctl(canSocket, SIOCGSTAMP, &timeStamp) < 0)) { setError(qt_error_string(errno), QCanBusDevice::CanBusError::ReadError); - memset(&timeStamp, 0, sizeof(timeStamp)); + ::memset(&timeStamp, 0, sizeof(timeStamp)); } const QCanBusFrame::TimeStamp stamp(timeStamp.tv_sec, timeStamp.tv_usec); @@ -675,21 +680,23 @@ void SocketCanBackend::readSocket() bufferedFrame.setTimeStamp(stamp); bufferedFrame.setFlexibleDataRateFormat(bytesReceived == CANFD_MTU); - bufferedFrame.setExtendedFrameFormat(frame.can_id & CAN_EFF_FLAG); - Q_ASSERT(frame.len <= CANFD_MAX_DLEN); + bufferedFrame.setExtendedFrameFormat(m_frame.can_id & CAN_EFF_FLAG); + Q_ASSERT(m_frame.len <= CANFD_MAX_DLEN); - if (frame.can_id & CAN_RTR_FLAG) + if (m_frame.can_id & CAN_RTR_FLAG) bufferedFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); - if (frame.can_id & CAN_ERR_FLAG) + if (m_frame.can_id & CAN_ERR_FLAG) bufferedFrame.setFrameType(QCanBusFrame::ErrorFrame); - if (frame.flags & CANFD_BRS) + if (m_frame.flags & CANFD_BRS) bufferedFrame.setBitrateSwitch(true); - if (frame.flags & CANFD_ESI) + if (m_frame.flags & CANFD_ESI) bufferedFrame.setErrorStateIndicator(true); + if (m_msg.msg_flags & MSG_CONFIRM) + bufferedFrame.setLocalEcho(true); - bufferedFrame.setFrameId(frame.can_id & CAN_EFF_MASK); + bufferedFrame.setFrameId(m_frame.can_id & CAN_EFF_MASK); - const QByteArray load(reinterpret_cast<char *>(frame.data), frame.len); + const QByteArray load(reinterpret_cast<char *>(m_frame.data), m_frame.len); bufferedFrame.setPayload(load); newFrames.append(std::move(bufferedFrame)); |