summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/socketcan/socketcanbackend.cpp
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@theqtcompany.com>2015-12-17 16:37:13 +0100
committerAlex Blasche <alexander.blasche@theqtcompany.com>2015-12-18 11:27:08 +0000
commit509144fd63c72668555c4853f4868d6dab21ecd7 (patch)
treec065608256fe5f233081df5a017766312b1ce7f1 /src/plugins/canbus/socketcan/socketcanbackend.cpp
parent1e648c6db685d5d42c72c25991bad697b6a7e9ba (diff)
QCanDevice: add CanFdKey configuration option
This allows to configure if the underlying plugin may use CANFD frames. This currently is only supported with the socketcan plugin. Task-number: QTBUG-49675 Change-Id: Ibd10ef4da0a694dd96d3a3af6063240ba8aa0eed Reviewed-by: Rolf Eike Beer <eb@emlix.com> Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'src/plugins/canbus/socketcan/socketcanbackend.cpp')
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp
index 69c7c28..49d641f 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.cpp
+++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp
@@ -53,7 +53,8 @@ QT_BEGIN_NAMESPACE
SocketCanBackend::SocketCanBackend(const QString &name) :
canSocket(-1),
notifier(0),
- canSocketName(name)
+ canSocketName(name),
+ canFdOptionEnabled(false)
{
resetConfigurations();
}
@@ -72,6 +73,8 @@ void SocketCanBackend::resetConfigurations()
QCanBusDevice::setConfigurationParameter(
QCanBusDevice::ErrorFilterKey,
QVariant::fromValue(QCanBusFrame::FrameErrors(QCanBusFrame::AnyError)));
+ QCanBusDevice::setConfigurationParameter(
+ QCanBusDevice::CanFdKey, false);
}
bool SocketCanBackend::open()
@@ -204,6 +207,17 @@ bool SocketCanBackend::applyConfigurationParameter(int key, const QVariant &valu
success = true;
break;
}
+ case QCanBusDevice::CanFdKey:
+ {
+ const int fd_frames = value.toBool() ? 1 : 0;
+ if (setsockopt(canSocket, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &fd_frames, sizeof(fd_frames)) < 0) {
+ setError(qt_error_string(errno),
+ QCanBusDevice::CanBusError::ConfigurationError);
+ break;
+ }
+ success = true;
+ break;
+ }
default:
setError(tr("SocketCanBackend: No such configuration as %1 in SocketCanBackend").arg(key),
QCanBusDevice::CanBusError::ConfigurationError);
@@ -241,13 +255,6 @@ bool SocketCanBackend::connectSocket()
return false;
}
- const int fd_frames = 1;
- if (setsockopt(canSocket, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &fd_frames, sizeof(fd_frames)) < 0) {
- setError(qt_error_string(errno),
- QCanBusDevice::CanBusError::ConnectionError);
- return false;
- }
-
delete notifier;
notifier = new QSocketNotifier(canSocket, QSocketNotifier::Read, this);
@@ -301,6 +308,10 @@ void SocketCanBackend::setConfigurationParameter(int key, const QVariant &value)
return;
QCanBusDevice::setConfigurationParameter(key, value);
+
+ // we need to check canfd option a lot -> cache it and avoid QVector lookup
+ if (key == QCanBusDevice::CanFdKey)
+ canFdOptionEnabled = value.toBool();
}
bool SocketCanBackend::writeFrame(const QCanBusFrame &newData)
@@ -319,16 +330,24 @@ bool SocketCanBackend::writeFrame(const QCanBusFrame &newData)
canId |= CAN_ERR_FLAG;
}
- bool isFdFrame = (newData.payload().size() > 8);
- if (isFdFrame && newData.payload().size() > CANFD_MAX_DLEN) {
+
+ int payloadSize = newData.payload().size();
+ if ((!canFdOptionEnabled && payloadSize > CAN_MAX_DLEN)
+ || (canFdOptionEnabled && payloadSize > CANFD_MAX_DLEN)) {
qWarning() << QString("payload (%1 bytes) is too large for chosen frame size of "
"maximal %2 bytes. Frame is discarded.").
- arg(newData.payload().size()).arg(CANFD_MAX_DLEN);
+ arg(payloadSize).arg(canFdOptionEnabled ? CANFD_MAX_DLEN : CAN_MAX_DLEN);
+ if (!canFdOptionEnabled && payloadSize <= CANFD_MAX_DLEN)
+ setError(tr("Sending CanFd frame although CanFd option not enabled."),
+ QCanBusDevice::WriteError);
+ else
+ setError(tr("Frame payload exceeds maximum CAN frame payload length."),
+ QCanBusDevice::WriteError);
return false;
}
qint64 bytesWritten = 0;
- if (isFdFrame) {
+ if (canFdOptionEnabled) {
canfd_frame frame;
frame.len = newData.payload().size();
frame.can_id = canId;