diff --git a/src/framedreader.h b/src/framedreader.h new file mode 100644 --- /dev/null +++ b/src/framedreader.h @@ -0,0 +1,92 @@ +/* + Copyright © 2016 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 . +*/ + +#ifndef FRAMEDREADER_H +#define FRAMEDREADER_H + +#include "abstractreader.h" +#include "framedreadersettings.h" + +/** + * Reads data in a customizable framed format. + */ +class FramedReader : public AbstractReader +{ + Q_OBJECT + +public: + explicit FramedReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + QWidget* settingsWidget(); + unsigned numOfChannels(); + void enable(bool enabled = true); + +public slots: + void pause(bool); + +private: + /// bit wise fields for `settingsValid` member + enum SettingInvalidFlag + { + SYNCWORD_INVALID = 1, + FRAMESIZE_INVALID = 2 + }; + + // settings related members + FramedReaderSettings _settingsWidget; + unsigned _numOfChannels; + unsigned sampleSize; + bool paused; + unsigned settingsInvalid; /// settings are all valid if this is 0, if not no reading is done + QByteArray syncWord; + bool checksumEnabled; + bool hasSizeByte; + unsigned frameSize; + bool debugModeEnabled; + + /// Checks the validity of syncWord and frameSize then shows an + /// error message. Also updates `settingsInvalid`. If settings are + /// valid `settingsInvalid` should be `0`. + void checkSettings(); + + // read state related members + unsigned sync_i; /// sync byte index to be read next + bool gotSync; /// indicates if sync word is captured + bool gotSize; /// indicates if size is captured, ignored if size byte is disabled (fixed size) + unsigned calcChecksum; + + void reset(); /// Resets the reading state. Used in case of error or setting change. + /// points to the readSampleAs function for currently selected number format + double (FramedReader::*readSample)(); + template double readSampleAs(); + /// reads payload portion of the frame, calculates checksum and commits data + /// @note should be called only if there are enough bytes on device + void readFrameDataAndCheck(); + // `data` contains i th channels data + void addChannelData(unsigned int channel, double* data, unsigned size); + +private slots: + void onDataReady(); + + void onNumberFormatChanged(NumberFormat numberFormat); + void onNumOfChannelsChanged(unsigned value); + void onSyncWordChanged(QByteArray); + void onFrameSizeChanged(unsigned); +}; + +#endif // FRAMEDREADER_H