summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/socketcan/socketcanbackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/socketcan/socketcanbackend.cpp')
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp57
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));