summaryrefslogtreecommitdiffstats
path: root/examples/serialbus/can
diff options
context:
space:
mode:
authorEvgeny Shtanov <shtanov_evgenii@mail.ru>2021-02-20 16:17:10 +0300
committerEvgeny Shtanov <shtanov_evgenii@mail.ru>2021-03-25 01:44:43 +0300
commit5cec94b0ca0f88b555210febf4dc7be8a1324fb7 (patch)
treefa5682d367a5040a58686f7affe1cad6ee49662d /examples/serialbus/can
parenta72f9e33dc8fe60ef80eee0ecf97965fc8482fe9 (diff)
CAN Example: Properly format payload hex string
Insert a space after every byte (two hex digits) even when editing the string in the middle. Task-number: QTBUG-91251 Change-Id: I477c9116c74c8ff52902222ab855d331e3d78b13 Reviewed-by: André Hartmann <aha_1980@gmx.de>
Diffstat (limited to 'examples/serialbus/can')
-rw-r--r--examples/serialbus/can/sendframebox.cpp53
1 files changed, 49 insertions, 4 deletions
diff --git a/examples/serialbus/can/sendframebox.cpp b/examples/serialbus/can/sendframebox.cpp
index 0c3babc..3e1e2bb 100644
--- a/examples/serialbus/can/sendframebox.cpp
+++ b/examples/serialbus/can/sendframebox.cpp
@@ -51,6 +51,8 @@
#include "sendframebox.h"
#include "ui_sendframebox.h"
+constexpr char THREE_DIGITS[] = "[[:xdigit:]]{3}";
+
enum {
MaxStandardId = 0x7FF,
MaxExtendedId = 0x10000000
@@ -61,6 +63,41 @@ enum {
MaxPayloadFd = 64
};
+bool isEvenHex(QString input)
+{
+ const QChar space = QLatin1Char(' ');
+ input.remove(space);
+
+ if (input.size() % 2)
+ return false;
+
+ return true;
+}
+
+// Formats a string of hex characters with a space between every byte
+// Example: "012345" -> "01 23 45"
+static QString formatHexData(const QString &input)
+{
+ const QChar space = QLatin1Char(' ');
+ QString out = input;
+
+ const QRegularExpression threeDigits(THREE_DIGITS);
+ const QRegularExpression oneDigitAndSpace(QStringLiteral("((\\s+)|^)([[:xdigit:]]{1})(\\s+)"));
+
+ while (oneDigitAndSpace.match(out).hasMatch() || threeDigits.match(out).hasMatch()) {
+ if (threeDigits.match(out).hasMatch()) {
+ const QRegularExpressionMatch match = threeDigits.match(out);
+ out.insert(match.capturedEnd() - 1, space);
+ } else if (oneDigitAndSpace.match(out).hasMatch()) {
+ const QRegularExpressionMatch match = oneDigitAndSpace.match(out);
+ if (out.at(match.capturedEnd() - 1) == space)
+ out.remove(match.capturedEnd() - 1, 1);
+ }
+ }
+
+ return out.simplified().toUpper();
+}
+
HexIntegerValidator::HexIntegerValidator(QObject *parent) :
QValidator(parent),
m_maximum(MaxStandardId)
@@ -112,7 +149,7 @@ QValidator::State HexStringValidator::validate(QString &input, int &pos) const
return Invalid;
// insert a space after every two hex nibbles
- const QRegularExpression threeDigits(QStringLiteral("[[:xdigit:]]{3}"));
+ const QRegularExpression threeDigits(THREE_DIGITS);
while (threeDigits.match(input).hasMatch()) {
const QRegularExpressionMatch match = threeDigits.match(input);
@@ -169,18 +206,26 @@ SendFrameBox::SendFrameBox(QWidget *parent) :
m_ui->bitrateSwitchBox->setChecked(false);
});
- auto frameIdTextChanged = [this]() {
+ auto frameIdOrPayloadChanged = [this]() {
const bool hasFrameId = !m_ui->frameIdEdit->text().isEmpty();
m_ui->sendButton->setEnabled(hasFrameId);
m_ui->sendButton->setToolTip(hasFrameId
? QString() : tr("Cannot send because no Frame ID was given."));
+ if (hasFrameId) {
+ const bool isEven = isEvenHex(m_ui->payloadEdit->text());
+ m_ui->sendButton->setEnabled(isEven);
+ m_ui->sendButton->setToolTip(isEven
+ ? QString() : tr("Cannot send because Payload hex string is invalid."));
+ }
};
- connect(m_ui->frameIdEdit, &QLineEdit::textChanged, frameIdTextChanged);
- frameIdTextChanged();
+ connect(m_ui->frameIdEdit, &QLineEdit::textChanged, frameIdOrPayloadChanged);
+ connect(m_ui->payloadEdit, &QLineEdit::textChanged, frameIdOrPayloadChanged);
+ frameIdOrPayloadChanged();
connect(m_ui->sendButton, &QPushButton::clicked, [this]() {
const uint frameId = m_ui->frameIdEdit->text().toUInt(nullptr, 16);
QString data = m_ui->payloadEdit->text();
+ m_ui->payloadEdit->setText(formatHexData(data));
const QByteArray payload = QByteArray::fromHex(data.remove(QLatin1Char(' ')).toLatin1());
QCanBusFrame frame = QCanBusFrame(frameId, payload);