@@ -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++;
@@ -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
/*
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 <http://www.gnu.org/licenses/>.
*/
#include <QRegularExpressionValidator>
#include <QRegularExpression>
#include "utils.h"
#include "setting_defines.h"
#include "asciireadersettings.h"
#include "ui_asciireadersettings.h"
#include <QtDebug>
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,
connect(ui->rbTab, &QAbstractButton::toggled,
connect(ui->rbOtherDelimiter, &QAbstractButton::toggled,
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<int>::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);
@@ -22,6 +22,7 @@
#include <QWidget>
#include <QSettings>
#include <QChar>
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
@@ -6,14 +6,17 @@
<rect>
<x>0</x>
<y>0</y>
<width>414</width>
<width>493</width>
<height>171</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
<property name="leftMargin">
<number>0</number>
@@ -26,16 +29,14 @@
<property name="bottomMargin">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Number Of Channels:</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spNumOfChannels">
<property name="minimumSize">
<size>
@@ -60,34 +61,73 @@
<item row="2" column="0">
<widget class="QLabel" name="label">
<string>Column Delimiter:</string>
<item row="2" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QRadioButton" name="rbComma">
<string>comma</string>
<property name="checked">
<bool>true</bool>
<widget class="QRadioButton" name="rbSpace">
<string>space</string>
<property name="sizeHint" stdset="0">
<widget class="QRadioButton" name="rbTab">
<string>tab</string>
<widget class="QRadioButton" name="rbOtherDelimiter">
<string>other:</string>
<widget class="QLineEdit" name="leDelimiter">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<property name="maximumSize">
<width>1</width>
<height>20</height>
<width>30</width>
<height>16777215</height>
</size>
</spacer>
<property name="toolTip">
<string>Enter a custom delimiter character</string>
<property name="inputMask">
<string/>
<string>|</string>
</layout>
<spacer name="verticalSpacer">
<enum>Qt::Vertical</enum>
<width>20</width>
<height>1</height>
<resources/>
Status change: