diff --git a/src/abstractreader.cpp b/src/abstractreader.cpp --- a/src/abstractreader.cpp +++ b/src/abstractreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -19,41 +19,8 @@ #include "abstractreader.h" -AbstractReader::AbstractReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject* parent) : +AbstractReader::AbstractReader(QIODevice* device, QObject* parent) : QObject(parent) { _device = device; - _channelMan = channelMan; - _recorder = recorder; - recording = false; - - // initialize sps counter - sampleCount = 0; - samplesPerSecond = 0; - QObject::connect(&spsTimer, &QTimer::timeout, - this, &AbstractReader::spsTimerTimeout); - // TODO: start sps timer when reader is enabled - spsTimer.start(SPS_UPDATE_TIMEOUT * 1000); } - -void AbstractReader::spsTimerTimeout() -{ - unsigned currentSps = samplesPerSecond; - samplesPerSecond = (sampleCount/numOfChannels())/SPS_UPDATE_TIMEOUT; - if (currentSps != samplesPerSecond) - { - emit samplesPerSecondChanged(samplesPerSecond); - } - sampleCount = 0; -} - -void AbstractReader::addData(double* samples, unsigned length) -{ - _channelMan->addData(samples, length); - if (recording) - { - _recorder->addData(samples, length, numOfChannels()); - } - sampleCount += length; -} diff --git a/src/abstractreader.h b/src/abstractreader.h --- a/src/abstractreader.h +++ b/src/abstractreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -25,20 +25,16 @@ #include #include -#include "channelmanager.h" -#include "datarecorder.h" +#include "source.h" /** * All reader classes must inherit this class. */ -class AbstractReader : public QObject +class AbstractReader : public QObject, public Source { Q_OBJECT public: - explicit AbstractReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject* parent = 0); - - bool recording; /// is recording started + explicit AbstractReader(QIODevice* device, QObject* parent = 0); /** * Returns a widget to be shown in data format panel when reader @@ -46,31 +42,16 @@ public: */ virtual QWidget* settingsWidget() = 0; - /** - * Number of channels being read. - * - * This number may be user selected or automatically determined - * from incoming stream. - */ - virtual unsigned numOfChannels() = 0; - /// Reader should only read when enabled. Default state should be /// 'disabled'. virtual void enable(bool enabled = true) = 0; - /** - * @brief Starts sending data to recorder. - * - * @note recorder must have been started! - */ - void startRecording(); - - /// Stops recording. - void stopRecording(); + /// None of the current readers support X channel at the moment + bool hasX() const final { return false; }; signals: + // TODO: should we keep this? void numOfChannelsChanged(unsigned); - void samplesPerSecondChanged(unsigned); public slots: /** @@ -83,22 +64,6 @@ public slots: protected: QIODevice* _device; - - /// Should be called with read data - void addData(double* samples, unsigned length); - -private: - const int SPS_UPDATE_TIMEOUT = 1; // second - - unsigned sampleCount; - unsigned samplesPerSecond; - - ChannelManager* _channelMan; - DataRecorder* _recorder; - QTimer spsTimer; - -private slots: - void spsTimerTimeout(); }; #endif // ABSTRACTREADER_H diff --git a/src/binarystreamreader.cpp b/src/binarystreamreader.cpp --- a/src/binarystreamreader.cpp +++ b/src/binarystreamreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -23,19 +23,16 @@ #include "binarystreamreader.h" #include "floatswap.h" -BinaryStreamReader::BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject* parent) : - AbstractReader(device, channelMan, recorder, parent) +BinaryStreamReader::BinaryStreamReader(QIODevice* device, QObject* parent) : + AbstractReader(device, parent) { paused = false; skipByteRequested = false; skipSampleRequested = false; - _numOfChannels = _settingsWidget.numOfChannels(); + _numChannels = _settingsWidget.numOfChannels(); connect(&_settingsWidget, &BinaryStreamReaderSettings::numOfChannelsChanged, - this, &BinaryStreamReader::numOfChannelsChanged); - connect(&_settingsWidget, &BinaryStreamReaderSettings::numOfChannelsChanged, - this, &BinaryStreamReader::onNumOfChannelsChanged); + this, &BinaryStreamReader::onNumOfChannelsChanged); // initial number format selection onNumberFormatChanged(_settingsWidget.numberFormat()); @@ -60,9 +57,9 @@ QWidget* BinaryStreamReader::settingsWid return &_settingsWidget; } -unsigned BinaryStreamReader::numOfChannels() +unsigned BinaryStreamReader::numChannels() const { - return _numOfChannels; + return _numChannels; } void BinaryStreamReader::enable(bool enabled) @@ -75,6 +72,7 @@ void BinaryStreamReader::enable(bool ena else { QObject::disconnect(_device, 0, this, 0); + disconnectSinks(); } } @@ -123,13 +121,15 @@ void BinaryStreamReader::onNumberFormatC void BinaryStreamReader::onNumOfChannelsChanged(unsigned value) { - _numOfChannels = value; + _numChannels = value; + updateNumChannels(); + emit numOfChannelsChanged(value); } void BinaryStreamReader::onDataReady() { // a package is a set of channel data like {CHAN0_SAMPLE, CHAN1_SAMPLE...} - int packageSize = sampleSize * _numOfChannels; + int packageSize = sampleSize * _numChannels; int bytesAvailable = _device->bytesAvailable(); // skip 1 byte if requested @@ -160,20 +160,16 @@ void BinaryStreamReader::onDataReady() return; } - double* channelSamples = new double[numOfPackagesToRead*_numOfChannels]; - + // actual reading + SamplePack samples(numOfPackagesToRead, _numChannels); for (int i = 0; i < numOfPackagesToRead; i++) { - for (unsigned int ci = 0; ci < _numOfChannels; ci++) + for (unsigned int ci = 0; ci < _numChannels; ci++) { - // channelSamples[ci].replace(i, (this->*readSample)()); - channelSamples[ci*numOfPackagesToRead+i] = (this->*readSample)(); + samples.data(ci)[i] = (this->*readSample)(); } } - - addData(channelSamples, numOfPackagesToRead*_numOfChannels); - - delete[] channelSamples; + feedOut(samples); } template double BinaryStreamReader::readSampleAs() diff --git a/src/binarystreamreader.h b/src/binarystreamreader.h --- a/src/binarystreamreader.h +++ b/src/binarystreamreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -34,10 +34,9 @@ class BinaryStreamReader : public Abstra { Q_OBJECT public: - explicit BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, - DataRecorder* recorder, QObject *parent = 0); + explicit BinaryStreamReader(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); @@ -49,7 +48,7 @@ public slots: private: BinaryStreamReaderSettings _settingsWidget; - unsigned _numOfChannels; + unsigned _numChannels; unsigned sampleSize; bool paused; bool skipByteRequested; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -39,6 +39,29 @@ add_executable(Test EXCLUDE_FROM_ALL add_test(NAME test1 COMMAND Test) qt5_use_modules(Test Widgets) +qt5_wrap_ui(UI_FILES_T + ../src/binarystreamreadersettings.ui + ../src/numberformatbox.ui + ../src/endiannessbox.ui + ) + +# test for readers +add_executable(TestReaders EXCLUDE_FROM_ALL + test_readers.cpp + ../src/samplepack.cpp + ../src/sink.cpp + ../src/source.cpp + ../src/binarystreamreader.cpp + ../src/abstractreader.cpp + ../src/binarystreamreadersettings.cpp + ../src/endiannessbox.cpp + ../src/numberformatbox.cpp + ../src/numberformat.cpp + ${UI_FILES_T} + ) +qt5_use_modules(TestReaders Widgets) +add_test(NAME test_readers COMMAND TestReaders) + set(CMAKE_CTEST_COMMAND ctest -V) add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) -add_dependencies(check Test) +add_dependencies(check Test TestReaders) diff --git a/tests/test_readers.cpp b/tests/test_readers.cpp new file mode 100644 --- /dev/null +++ b/tests/test_readers.cpp @@ -0,0 +1,43 @@ +/* + Copyright © 2018 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + serialplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with serialplot. If not, see . +*/ + +// This tells Catch to provide a main() - only do this in one cpp file per executable +#define CATCH_CONFIG_RUNNER +#include "catch.hpp" + +#include +#include "binarystreamreader.h" + +TEST_CASE("creating a BinaryStreamReader", "[reader]") +{ + QBuffer buffer; + + BinaryStreamReader bs(&buffer); +} + +// Note: this is added because `QApplication` is a must be created for widgets +#include +int main(int argc, char* argv[]) +{ + QApplication a(argc, argv); + + int result = Catch::Session().run( argc, argv ); + + return result; +}