summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2019-07-15 15:44:50 +0200
committerAndre Hartmann <aha_1980@gmx.de>2019-07-24 10:57:36 +0200
commit9f5b8ba590d424f82498fca5f2cc8594b1757ff0 (patch)
tree5489ac4be297bb4576f37d5d0c401529e5398297 /src/plugins/canbus
parente39d9396428c3d078313b50fa1ff65662096debc (diff)
SocketCAN: Allow specifying the protocol to use
So far, only CAN_RAW was allowed, but there might be cases where other protocols are useful too. The default value is still CAN_RAW, so all existing applications will continue working. [ChangeLog][SocketCAN] Added the configuration parameter QCanBusDevice::ProtocolKey to use another protocol inside the protocol family PF_CAN. Fixes: QTBUG-75204 Change-Id: I8323ab8d77a569f51d3cd8c296b433352a3f5609 Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/plugins/canbus')
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp12
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.h1
2 files changed, 12 insertions, 1 deletions
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp
index 27fa326..2ed1310 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.cpp
+++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp
@@ -389,7 +389,7 @@ bool SocketCanBackend::connectSocket()
{
struct ifreq interface;
- if (Q_UNLIKELY((canSocket = socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, CAN_RAW)) < 0)) {
+ if (Q_UNLIKELY((canSocket = socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK, protocol)) < 0)) {
setError(qt_error_string(errno),
QCanBusDevice::CanBusError::ConnectionError);
return false;
@@ -464,6 +464,16 @@ void SocketCanBackend::setConfigurationParameter(int key, const QVariant &value)
return;
}
}
+ } else if (key == QCanBusDevice::ProtocolKey) {
+ bool ok = false;
+ const int newProtocol = value.toInt(&ok);
+ if (Q_UNLIKELY(!ok || (newProtocol < 0))) {
+ const QString errorString = tr("Cannot set protocol to value %1.").arg(value.toString());
+ setError(errorString, QCanBusDevice::ConfigurationError);
+ qCWarning(QT_CANBUS_PLUGINS_SOCKETCAN, "%ls", qUtf16Printable(errorString));
+ return;
+ }
+ protocol = newProtocol;
}
// connected & params not applyable/invalid
if (canSocket != -1 && !applyConfigurationParameter(key, value))
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.h b/src/plugins/canbus/socketcan/socketcanbackend.h
index 199401e..0497244 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.h
+++ b/src/plugins/canbus/socketcan/socketcanbackend.h
@@ -87,6 +87,7 @@ private:
bool hasBusStatus() const;
QCanBusDevice::CanBusStatus busStatus() const;
+ int protocol = CAN_RAW;
canfd_frame m_frame;
sockaddr_can m_address;
msghdr m_msg;