Difference between revisions of "AnyWave:BuildReader"
(→AwReaderPlugin and AwFileReader classes) |
(→AwReaderPlugin and AwFileReader classes) |
||
Line 29: | Line 29: | ||
#include <QDataStream> | #include <QDataStream> | ||
− | class ADesReader : public AwFileReader | + | class ADesReader : public AwFileReader // our class must derived from AwFileReader |
{ | { | ||
− | Q_OBJECT | + | Q_OBJECT // Q_OBJECT and Q_INTERFACES macro are specific to the Qt Framework. |
− | Q_INTERFACES(AwFileReader) | + | Q_INTERFACES(AwFileReader) // They indicate that the object is also derived from QObject and implements the Qt signals and slots mechanism. |
public: | public: | ||
ADesReader(const QString& filename); | ADesReader(const QString& filename); | ||
~ADesReader() { cleanUpAndClose(); } | ~ADesReader() { cleanUpAndClose(); } | ||
− | long readDataFromChannels(float start, float duration, QList<AwChannel *> &channelList); | + | // The three methods above need to be implemented. There are virtuals method defined in AwFileReader. |
− | FileStatus openFile(const QString &path); | + | long readDataFromChannels(float start, float duration, QList<AwChannel *> &channelList); // This method will get data from the file and fill channels with them. |
− | FileStatus canRead(const QString &path); | + | FileStatus openFile(const QString &path); // This method will open the file and return a status. |
+ | FileStatus canRead(const QString &path); // This method will check if the file format is correct and return a status. | ||
+ | // The method above is optional but it is a good practice to implement it. | ||
+ | void cleanUpAndClose(); // A cleanup method to clean memory and close the file. | ||
− | + | ||
private: | private: | ||
− | QFile m_headerFile; | + | // Here we define variables and methods required by our plug-in. |
− | QFile m_binFile; | + | QFile m_headerFile; // A QFile to handle the text header file. |
− | QTextStream m_headerStream; | + | QFile m_binFile; // A QFile to handle the binary data file. |
− | QDataStream m_binStream; | + | QTextStream m_headerStream; // A stream object to read the content of the header file. |
− | float m_samplingRate; | + | QDataStream m_binStream; // A stream object to read the content of the data file. |
− | int m_nSamples; | + | float m_samplingRate; // A variable to store the global sampling rate. |
− | QString m_binPath; | + | int m_nSamples; // A variable to store the number of samples. |
+ | QString m_binPath; // A variable to store the file path to the binary data file. | ||
+ | |||
+ | |||
}; | }; | ||
Revision as of 13:42, 23 March 2015
One important thing with AnyWave is to be able to read a data file.
Although that AnyWave is able to read some common EEG or MEG file formats, you might need to read a particular data file.
The only way to achieve that is to build a Reader plug-in for AnyWave.
This will require implementing a C++ plug-in using the SDK.
See the previous sections of the Developer's corner to see how to build the SDK and use it to build a new plug-in.
Let's start with the basic cmake project that we will modify to suit our needs.
ADES reader as example
AnyWave is able to read .ades file format which is a simple file format built upon a text header file and a binary data file.
This 'plug-in' is embedded within AnyWave but we are going to implement it as an external plug-in, for the sake of demonstration.
Define the C++ classes
A C++ plug-in is defined by two classes:
- A class that describes the plug-in to AnyWave.
- A class that describes the core mechanism of the plug-in.
That is true for all kind of plug-ins in AnyWave.
AwReaderPlugin and AwFileReader classes
As mentioned above, two C++ classes must be described and implemented to build a Reader plug-in.
Here are the two classes, described within one header file:
#ifndef DESREADER_H #define DESREADER_H #include <AwReaderInterface.h> #include <QtCore> #include <QDataStream> class ADesReader : public AwFileReader // our class must derived from AwFileReader { Q_OBJECT // Q_OBJECT and Q_INTERFACES macro are specific to the Qt Framework. Q_INTERFACES(AwFileReader) // They indicate that the object is also derived from QObject and implements the Qt signals and slots mechanism. public: ADesReader(const QString& filename); ~ADesReader() { cleanUpAndClose(); } // The three methods above need to be implemented. There are virtuals method defined in AwFileReader. long readDataFromChannels(float start, float duration, QList<AwChannel *> &channelList); // This method will get data from the file and fill channels with them. FileStatus openFile(const QString &path); // This method will open the file and return a status. FileStatus canRead(const QString &path); // This method will check if the file format is correct and return a status. // The method above is optional but it is a good practice to implement it. void cleanUpAndClose(); // A cleanup method to clean memory and close the file. private: // Here we define variables and methods required by our plug-in. QFile m_headerFile; // A QFile to handle the text header file. QFile m_binFile; // A QFile to handle the binary data file. QTextStream m_headerStream; // A stream object to read the content of the header file. QDataStream m_binStream; // A stream object to read the content of the data file. float m_samplingRate; // A variable to store the global sampling rate. int m_nSamples; // A variable to store the number of samples. QString m_binPath; // A variable to store the file path to the binary data file. }; class ADesReaderPlugin : public AwReaderPlugin { Q_OBJECT Q_INTERFACES(AwReaderPlugin) public: ADesReaderPlugin(); ADesReader *newInstance(const QString& filename) { return new ADesReader(filename); } }; #endif // DESREADER_H