# HG changeset patch # User Hasan Yavuz ÖZDERYA # Date 2018-04-08 13:28:06 # Node ID 5c809411253de1e91913d589464fb34d0bc7a7b9 # Parent 2a4985e6a454e06ea7df9a30381eb918dc1ec1ed added reworked FramedReader with basic tests diff --git a/src/framedreader.cpp b/src/framedreader.cpp --- a/src/framedreader.cpp +++ b/src/framedreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -23,15 +23,14 @@ #include "framedreader.h" -FramedReader::FramedReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject* parent) : - AbstractReader(device, channelMan, recorder, parent) +FramedReader::FramedReader(QIODevice* device, QObject* parent) : + AbstractReader(device, parent) { paused = false; // initial settings settingsInvalid = 0; - _numOfChannels = _settingsWidget.numOfChannels(); + _numChannels = _settingsWidget.numOfChannels(); hasSizeByte = _settingsWidget.frameSize() == 0; frameSize = _settingsWidget.frameSize(); syncWord = _settingsWidget.syncWord(); @@ -73,6 +72,7 @@ void FramedReader::enable(bool enabled) else { QObject::disconnect(_device, 0, this, 0); + disconnectSinks(); } } @@ -81,9 +81,9 @@ QWidget* FramedReader::settingsWidget() return &_settingsWidget; } -unsigned FramedReader::numOfChannels() +unsigned FramedReader::numChannels() const { - return _numOfChannels; + return _numChannels; } void FramedReader::pause(bool enabled) @@ -145,7 +145,7 @@ void FramedReader::checkSettings() } // check if fixed frame size is multiple of a sample set size - if (!hasSizeByte && frameSize % (_numOfChannels * sampleSize) != 0) + if (!hasSizeByte && frameSize % (_numChannels * sampleSize) != 0) { settingsInvalid |= FRAMESIZE_INVALID; } @@ -163,7 +163,7 @@ void FramedReader::checkSettings() { QString errorMessage = QString("Frame size must be multiple of %1 (#channels * sample size)!")\ - .arg(_numOfChannels * sampleSize); + .arg(_numChannels * sampleSize); _settingsWidget.showMessage(errorMessage, true); } @@ -175,7 +175,7 @@ void FramedReader::checkSettings() void FramedReader::onNumOfChannelsChanged(unsigned value) { - _numOfChannels = value; + _numChannels = value; checkSettings(); reset(); emit numOfChannelsChanged(value); @@ -238,11 +238,11 @@ void FramedReader::onDataReady() qCritical() << "Frame size is 0!"; reset(); } - else if (frameSize % (_numOfChannels * sampleSize) != 0) + else if (frameSize % (_numChannels * sampleSize) != 0) { qCritical() << QString("Frame size is not multiple of %1 (#channels * sample size)!") \ - .arg(_numOfChannels * sampleSize); + .arg(_numChannels * sampleSize); reset(); } else @@ -287,14 +287,13 @@ void FramedReader::readFrameDataAndCheck } // a package is 1 set of samples for all channels - unsigned numOfPackagesToRead = frameSize / (_numOfChannels * sampleSize); - double* channelSamples = new double[numOfPackagesToRead * _numOfChannels]; - + unsigned numOfPackagesToRead = frameSize / (_numChannels * sampleSize); + SamplePack samples(numOfPackagesToRead, _numChannels); for (unsigned i = 0; i < numOfPackagesToRead; i++) { - for (unsigned int ci = 0; ci < _numOfChannels; ci++) + for (unsigned int ci = 0; ci < _numChannels; ci++) { - channelSamples[ci*numOfPackagesToRead+i] = (this->*readSample)(); + samples.data(ci)[i] = (this->*readSample)(); } } @@ -311,14 +310,12 @@ void FramedReader::readFrameDataAndCheck if (!checksumEnabled || checksumPassed) { // commit data - addData(channelSamples, numOfPackagesToRead*_numOfChannels); + feedOut(samples); } else { qCritical() << "Checksum failed! Received:" << rChecksum << "Calculated:" << calcChecksum; } - - delete[] channelSamples; } template double FramedReader::readSampleAs() diff --git a/src/framedreader.h b/src/framedreader.h --- a/src/framedreader.h +++ b/src/framedreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -33,10 +33,9 @@ class FramedReader : public AbstractRead Q_OBJECT public: - explicit FramedReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject *parent = 0); + explicit FramedReader(QIODevice* device, QObject *parent = 0); QWidget* settingsWidget(); - unsigned numOfChannels(); + unsigned numChannels() const; void enable(bool enabled = true); /// Stores settings into a `QSettings` void saveSettings(QSettings* settings); @@ -56,7 +55,7 @@ private: // settings related members FramedReaderSettings _settingsWidget; - unsigned _numOfChannels; + unsigned _numChannels; unsigned sampleSize; bool paused; unsigned settingsInvalid; /// settings are all valid if this is 0, if not no reading is done diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -43,6 +43,7 @@ qt5_use_modules(Test Widgets) qt5_wrap_ui(UI_FILES_T ../src/binarystreamreadersettings.ui ../src/asciireadersettings.ui + ../src/framedreadersettings.ui ../src/numberformatbox.ui ../src/endiannessbox.ui ) @@ -58,6 +59,9 @@ add_executable(TestReaders EXCLUDE_FROM_ ../src/binarystreamreadersettings.cpp ../src/asciireader.cpp ../src/asciireadersettings.cpp + ../src/framedreader.cpp + ../src/framedreadersettings.cpp + ../src/commandedit.cpp ../src/endiannessbox.cpp ../src/numberformatbox.cpp ../src/numberformat.cpp diff --git a/tests/test_readers.cpp b/tests/test_readers.cpp --- a/tests/test_readers.cpp +++ b/tests/test_readers.cpp @@ -25,6 +25,7 @@ #include #include "binarystreamreader.h" #include "asciireader.h" +#include "framedreader.h" #include "test_helpers.h" @@ -121,6 +122,49 @@ TEST_CASE("AsciiReader shouldn't read wh REQUIRE(sink.totalFed == 0); } +TEST_CASE("reading data with FramedReader", "[reader]") +{ + QBuffer bufferDev; + FramedReader reader(&bufferDev); + reader.enable(true); + + TestSink sink; + reader.connectSink(&sink); + + REQUIRE(sink._numChannels == 1); + REQUIRE(sink._hasX == false); + + bufferDev.open(QIODevice::ReadWrite); + const uint8_t data[] = {0xAA, 0xBB, 4, 0x01, 0x02, 0x03, 0x04}; + bufferDev.write((const char*) data, 7); + bufferDev.seek(0); + + QSignalSpy spy(&bufferDev, SIGNAL(readyRead())); + REQUIRE(spy.wait(READYREAD_TIMEOUT)); + REQUIRE(sink.totalFed == 4); +} + +TEST_CASE("FramedReader shouldn't read when disabled", "[reader]") +{ + QBuffer bufferDev; + FramedReader reader(&bufferDev); + + TestSink sink; + reader.connectSink(&sink); + + REQUIRE(sink._numChannels == 1); + REQUIRE(sink._hasX == false); + + bufferDev.open(QIODevice::ReadWrite); + const uint8_t data[] = {0xAA, 0xBB, 4, 0x01, 0x02, 0x03, 0x04}; + bufferDev.write((const char*) data, 7); + bufferDev.seek(0); + + QSignalSpy spy(&bufferDev, SIGNAL(readyRead())); + REQUIRE_FALSE(spy.wait(READYREAD_TIMEOUT)); + REQUIRE(sink.totalFed == 0); +} + // Note: this is added because `QApplication` must be created for widgets #include int main(int argc, char* argv[])