diff --git a/src/asciireader.cpp b/src/asciireader.cpp --- a/src/asciireader.cpp +++ b/src/asciireader.cpp @@ -33,6 +33,7 @@ AsciiReader::AsciiReader(QIODevice* devi _numOfChannels = _settingsWidget.numOfChannels(); autoNumOfChannels = (_numOfChannels == NUMOFCHANNELS_AUTO); + delimiter = _settingsWidget.delimiter(); connect(&_settingsWidget, &AsciiReaderSettings::numOfChannelsChanged, [this](unsigned value) @@ -45,6 +46,12 @@ AsciiReader::AsciiReader(QIODevice* devi } }); + connect(&_settingsWidget, &AsciiReaderSettings::delimiterChanged, + [this](QChar d) + { + delimiter = d; + }); + connect(device, &QIODevice::aboutToClose, [this](){discardFirstLine=true;}); } @@ -90,7 +97,7 @@ void AsciiReader::onDataReady() { while(_device->canReadLine()) { - QByteArray line = _device->readLine(); + QString line = QString(_device->readLine()); // discard only once when we just started reading if (discardFirstLine) @@ -116,7 +123,7 @@ void AsciiReader::onDataReady() continue; } - auto separatedValues = line.split(','); + auto separatedValues = line.split(delimiter, QString::SkipEmptyParts); unsigned numReadChannels; // effective number of channels to read unsigned numComingChannels = separatedValues.length(); @@ -143,6 +150,7 @@ void AsciiReader::onDataReady() } // parse read line + unsigned numDataBroken = 0; double* channelSamples = new double[_numOfChannels](); for (unsigned ci = 0; ci < numReadChannels; ci++) { @@ -153,6 +161,7 @@ void AsciiReader::onDataReady() qWarning() << "Data parsing error for channel: " << ci; qWarning() << "Read line: " << line; channelSamples[ci] = 0; + numDataBroken++; } } diff --git a/src/asciireader.h b/src/asciireader.h --- a/src/asciireader.h +++ b/src/asciireader.h @@ -48,6 +48,7 @@ private: unsigned _numOfChannels; /// number of channels will be determined from incoming data unsigned autoNumOfChannels; + QChar delimiter; ///< selected column delimiter bool paused; // We may have (usually true) started reading in the middle of a diff --git a/src/asciireadersettings.cpp b/src/asciireadersettings.cpp --- a/src/asciireadersettings.cpp +++ b/src/asciireadersettings.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -17,20 +17,35 @@ along with serialplot. If not, see . */ +#include +#include + #include "utils.h" #include "setting_defines.h" #include "asciireadersettings.h" #include "ui_asciireadersettings.h" -#include - AsciiReaderSettings::AsciiReaderSettings(QWidget *parent) : QWidget(parent), ui(new Ui::AsciiReaderSettings) { ui->setupUi(this); + auto validator = new QRegularExpressionValidator(QRegularExpression("[^\\d]?"), this); + ui->leDelimiter->setValidator(validator); + + connect(ui->rbComma, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbSpace, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbTab, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->rbOtherDelimiter, &QAbstractButton::toggled, + this, &AsciiReaderSettings::delimiterToggled); + connect(ui->leDelimiter, &QLineEdit::textChanged, + this, &AsciiReaderSettings::customDelimiterChanged); + // Note: if directly connected we get a runtime warning on incompatible signal arguments connect(ui->spNumOfChannels, SELECT::OVERLOAD_OF(&QSpinBox::valueChanged), [this](int value) @@ -44,11 +59,51 @@ AsciiReaderSettings::~AsciiReaderSetting delete ui; } -unsigned AsciiReaderSettings::numOfChannels() +unsigned AsciiReaderSettings::numOfChannels() const { return ui->spNumOfChannels->value(); } +QChar AsciiReaderSettings::delimiter() const +{ + if (ui->rbComma->isChecked()) + { + return QChar(','); + } + else if (ui->rbSpace->isChecked()) + { + return QChar(' '); + } + else if (ui->rbTab->isChecked()) + { + return QChar('\t'); + } + else // rbOther + { + auto t = ui->leDelimiter->text(); + return t.isEmpty() ? QChar() : t.at(0); + } +} + +void AsciiReaderSettings::delimiterToggled(bool checked) +{ + if (!checked) return; + + auto d = delimiter(); + if (!d.isNull()) + { + emit delimiterChanged(d); + } +} + +void AsciiReaderSettings::customDelimiterChanged(const QString text) +{ + if (ui->rbOtherDelimiter->isChecked()) + { + if (!text.isEmpty()) emit delimiterChanged(text.at(0)); + } +} + void AsciiReaderSettings::saveSettings(QSettings* settings) { settings->beginGroup(SettingGroup_ASCII); diff --git a/src/asciireadersettings.h b/src/asciireadersettings.h --- a/src/asciireadersettings.h +++ b/src/asciireadersettings.h @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -22,6 +22,7 @@ #include #include +#include namespace Ui { class AsciiReaderSettings; @@ -35,7 +36,8 @@ public: explicit AsciiReaderSettings(QWidget *parent = 0); ~AsciiReaderSettings(); - unsigned numOfChannels(); + unsigned numOfChannels() const; + QChar delimiter() const; /// Stores settings into a `QSettings` void saveSettings(QSettings* settings); /// Loads settings from a `QSettings`. @@ -43,9 +45,15 @@ public: signals: void numOfChannelsChanged(unsigned); + /// Signaled only with a valid delimiter + void delimiterChanged(QChar); private: Ui::AsciiReaderSettings *ui; + +private slots: + void delimiterToggled(bool checked); + void customDelimiterChanged(const QString text); }; #endif // ASCIIREADERSETTINGS_H diff --git a/src/asciireadersettings.ui b/src/asciireadersettings.ui --- a/src/asciireadersettings.ui +++ b/src/asciireadersettings.ui @@ -6,14 +6,17 @@ 0 0 - 414 + 493 171 Form - + + + QFormLayout::ExpandingFieldsGrow + 0 @@ -26,68 +29,105 @@ 0 - + + + + Number Of Channels: + + + + + + + + 60 + 0 + + + + Select number of channels or set to 0 for Auto (determined from incoming data) + + + Auto + + + false + + + 0 + + + 32 + + + + + + + Column Delimiter: + + + + - + - Number Of Channels: + comma + + + true - - - - 60 - 0 - - - - Select number of channels or set to 0 for Auto (determined from incoming data) + + + space - - Auto - - - false + + + + + + tab - - 0 - - - 32 + + + + + + other: - - - Qt::Horizontal + + + + 0 + 0 + - + - 1 - 20 + 30 + 16777215 - + + Enter a custom delimiter character + + + + + + | + + - - - - Qt::Vertical - - - - 20 - 1 - - - -