diff --git a/src/abstractreader.cpp b/src/abstractreader.cpp --- a/src/abstractreader.cpp +++ b/src/abstractreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -23,6 +23,7 @@ AbstractReader::AbstractReader(QIODevice QObject(parent) { _device = device; + numBytesRead = 0; } void AbstractReader::pause(bool enabled) @@ -43,3 +44,8 @@ void AbstractReader::enable(bool enabled disconnectSinks(); } } + +void AbstractReader::onDataReady() +{ + numBytesRead += readData(); +} diff --git a/src/abstractreader.h b/src/abstractreader.h --- a/src/abstractreader.h +++ b/src/abstractreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -63,12 +63,25 @@ public slots: void pause(bool enabled); protected: + /// Reader should read from this device in `readData()` function. QIODevice* _device; + + /// Reader should check this variable to determine if reading is + /// paused in `readData()` bool paused; -protected slots: - /// all derived readers has to override this function - virtual void onDataReady() = 0; + /** + * Called when `readyRead` is signaled by the device. This is + * where the implementors should read the data and return the + * exact number of bytes read from the device. + */ + virtual unsigned readData() = 0; + +private: + unsigned numBytesRead; + +private slots: + void onDataReady(); }; #endif // ABSTRACTREADER_H diff --git a/src/asciireader.cpp b/src/asciireader.cpp --- a/src/asciireader.cpp +++ b/src/asciireader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -70,21 +70,20 @@ void AsciiReader::enable(bool enabled) if (enabled) { firstReadAfterEnable = true; - QObject::connect(_device, &QIODevice::readyRead, - this, &AsciiReader::onDataReady); } - else - { - QObject::disconnect(_device, 0, this, 0); - disconnectSinks(); - } + + AbstractReader::enable(enabled); } -void AsciiReader::onDataReady() +unsigned AsciiReader::readData() { + unsigned numBytesRead = 0; + while(_device->canReadLine()) { - QString line = QString(_device->readLine()); + QByteArray bytes = _device->readLine(); + QString line = QString(bytes); + numBytesRead += bytes.size(); // discard only once when we just started reading if (firstReadAfterEnable) @@ -129,6 +128,8 @@ void AsciiReader::onDataReady() feedOut(*samples); } } + + return numBytesRead; } SamplePack* AsciiReader::parseLine(const QString& line) const diff --git a/src/asciireader.h b/src/asciireader.h --- a/src/asciireader.h +++ b/src/asciireader.h @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -50,8 +50,10 @@ private: bool firstReadAfterEnable = false; + unsigned readData() override; + private slots: - void onDataReady() override; + /** * Parses given line and returns sample pack. * diff --git a/src/binarystreamreader.cpp b/src/binarystreamreader.cpp --- a/src/binarystreamreader.cpp +++ b/src/binarystreamreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -107,50 +107,58 @@ void BinaryStreamReader::onNumOfChannels emit numOfChannelsChanged(value); } -void BinaryStreamReader::onDataReady() +unsigned BinaryStreamReader::readData() { // a package is a set of channel data like {CHAN0_SAMPLE, CHAN1_SAMPLE...} - int packageSize = sampleSize * _numChannels; - int bytesAvailable = _device->bytesAvailable(); + unsigned packageSize = sampleSize * _numChannels; + unsigned bytesAvailable = _device->bytesAvailable(); + unsigned totalRead = 0; // skip 1 byte if requested if (skipByteRequested && bytesAvailable > 0) { _device->read(1); + totalRead++; skipByteRequested = false; bytesAvailable--; } // skip 1 sample (channel) if requested - if (skipSampleRequested && bytesAvailable >= (int) sampleSize) + if (skipSampleRequested && bytesAvailable >= sampleSize) { _device->read(sampleSize); + totalRead += sampleSize; skipSampleRequested = false; bytesAvailable -= sampleSize; } - if (bytesAvailable < packageSize) return; + if (bytesAvailable < packageSize) return totalRead; - int numOfPackagesToRead = + unsigned numOfPackagesToRead = (bytesAvailable - (bytesAvailable % packageSize)) / packageSize; + unsigned numBytesToRead = numOfPackagesToRead * packageSize; + + totalRead += numBytesToRead; if (paused) { // read and discard data - _device->read(numOfPackagesToRead*packageSize); - return; + _device->read(numBytesToRead); + return totalRead; } // actual reading SamplePack samples(numOfPackagesToRead, _numChannels); - for (int i = 0; i < numOfPackagesToRead; i++) + for (unsigned i = 0; i < numOfPackagesToRead; i++) { - for (unsigned int ci = 0; ci < _numChannels; ci++) + for (unsigned ci = 0; ci < _numChannels; ci++) { samples.data(ci)[i] = (this->*readSample)(); } } feedOut(samples); + + return totalRead; } 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 © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -60,10 +60,11 @@ private: */ template double readSampleAs(); + unsigned readData() override; + private slots: void onNumberFormatChanged(NumberFormat numberFormat); void onNumOfChannelsChanged(unsigned value); - void onDataReady() override; }; #endif // BINARYSTREAMREADER_H diff --git a/src/demoreader.cpp b/src/demoreader.cpp --- a/src/demoreader.cpp +++ b/src/demoreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -53,8 +53,9 @@ void DemoReader::enable(bool enabled) else { timer.stop(); - disconnectSinks(); } + + AbstractReader::enable(enabled); } unsigned DemoReader::numChannels() const @@ -91,7 +92,8 @@ void DemoReader::onNumChannelsChanged(un updateNumChannels(); } -void DemoReader::onDataReady() +unsigned DemoReader::readData() { // intentionally empty, required by AbstractReader + return 0; } diff --git a/src/demoreader.h b/src/demoreader.h --- a/src/demoreader.h +++ b/src/demoreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -55,10 +55,11 @@ private: QTimer timer; int count; + unsigned readData() override; + private slots: void demoTimerTimeout(); void onNumChannelsChanged(unsigned value); - void onDataReady() override; }; #endif // DEMOREADER_H diff --git a/src/framedreader.cpp b/src/framedreader.cpp --- a/src/framedreader.cpp +++ b/src/framedreader.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -184,9 +184,11 @@ void FramedReader::onFrameSizeChanged(un reset(); } -void FramedReader::onDataReady() +unsigned FramedReader::readData() { - if (settingsInvalid) return; + unsigned numBytesRead = 0; + + if (settingsInvalid) return numBytesRead; // loop until we run out of bytes or more bytes is required unsigned bytesAvailable; @@ -196,6 +198,7 @@ void FramedReader::onDataReady() { char c; _device->getChar(&c); + numBytesRead++; if (c == syncWord[sync_i]) // correct sync byte? { sync_i++; @@ -213,6 +216,7 @@ void FramedReader::onDataReady() { frameSize = 0; _device->getChar((char*) &frameSize); + numBytesRead++; if (frameSize == 0) // check size { @@ -242,10 +246,13 @@ void FramedReader::onDataReady() else // read data bytes and checksum { readFrameDataAndCheck(); + numBytesRead += checksumEnabled ? frameSize+1 : frameSize; reset(); } } } + + return numBytesRead; } void FramedReader::reset() @@ -263,7 +270,7 @@ void FramedReader::readFrameDataAndCheck // if paused just read and waste data if (paused) { - _device->read((checksumEnabled ? frameSize+1 : frameSize)); + _device->read(checksumEnabled ? frameSize+1 : frameSize); return; } diff --git a/src/framedreader.h b/src/framedreader.h --- a/src/framedreader.h +++ b/src/framedreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2018 Hasan Yavuz Özderya + Copyright © 2019 Hasan Yavuz Özderya This file is part of serialplot. @@ -79,8 +79,9 @@ private: /// @note should be called only if there are enough bytes on device void readFrameDataAndCheck(); + unsigned readData() override; + private slots: - void onDataReady() override; void onNumberFormatChanged(NumberFormat numberFormat); void onNumOfChannelsChanged(unsigned value);