diff --git a/src/framedreader.h b/src/framedreader.h
new file mode 100644
--- /dev/null
+++ b/src/framedreader.h
@@ -0,0 +1,82 @@
+/*
+ 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
+ };
+
+ 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 hasFrameByte;
+ unsigned frameSize;
+
+ // TODO: create a base class that contains common functionality between binary readers
+
+ /// points to the readSampleAs function for currently selected number format
+ double (FramedReader::*readSample)();
+ template double readSampleAs();
+ // `data` contains i th channels data
+ void addChannelData(unsigned int channel, double* data, unsigned size);
+
+ /// 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();
+
+private slots:
+ // void onDataReady();
+
+ void onNumberFormatChanged(NumberFormat numberFormat);
+ void onNumOfChannelsChanged(unsigned value);
+ void onSyncWordChanged(QByteArray);
+ void onFrameSizeChanged(unsigned);
+};
+
+#endif // FRAMEDREADER_H