diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-12-17 16:37:13 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-12-18 11:27:08 +0000 |
commit | 509144fd63c72668555c4853f4868d6dab21ecd7 (patch) | |
tree | c065608256fe5f233081df5a017766312b1ce7f1 /src/plugins/canbus/socketcan/socketcanbackend.cpp | |
parent | 1e648c6db685d5d42c72c25991bad697b6a7e9ba (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.cpp | 43 |
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; |