| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2015 Edouard Griffiths, F4EXB                                   //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program 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 as version 3 of the License, or                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program 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 V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INCLUDE_FILESOURCEINPUT_H
 | 
					
						
							|  |  |  | #define INCLUDE_FILESOURCEINPUT_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-02 23:16:40 +02:00
										 |  |  | #include <dsp/devicesamplesource.h>
 | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | #include <QString>
 | 
					
						
							|  |  |  | #include <QTimer>
 | 
					
						
							|  |  |  | #include <ctime>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <fstream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FileSourceThread; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-02 23:16:40 +02:00
										 |  |  | class FileSourceInput : public DeviceSampleSource { | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | public: | 
					
						
							|  |  |  | 	struct Settings { | 
					
						
							|  |  |  | 		QString m_fileName; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Settings(); | 
					
						
							|  |  |  | 		void resetToDefaults(); | 
					
						
							|  |  |  | 		QByteArray serialize() const; | 
					
						
							|  |  |  | 		bool deserialize(const QByteArray& data); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	class MsgConfigureFileSource : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		const Settings& getSettings() const { return m_settings; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 		static MsgConfigureFileSource* create(const Settings& settings) | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 			return new MsgConfigureFileSource(settings); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 		Settings m_settings; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 		MsgConfigureFileSource(const Settings& settings) : | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_settings(settings) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 00:10:46 +02:00
										 |  |  | 	class MsgConfigureFileSourceName : public Message { | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		const QString& getFileName() const { return m_fileName; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 00:10:46 +02:00
										 |  |  | 		static MsgConfigureFileSourceName* create(const QString& fileName) | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2015-08-06 00:10:46 +02:00
										 |  |  | 			return new MsgConfigureFileSourceName(fileName); | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 		QString m_fileName; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 00:10:46 +02:00
										 |  |  | 		MsgConfigureFileSourceName(const QString& fileName) : | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_fileName(fileName) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 01:14:44 +02:00
										 |  |  | 	class MsgConfigureFileSourceWork : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		bool isWorking() const { return m_working; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static MsgConfigureFileSourceWork* create(bool working) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return new MsgConfigureFileSourceWork(working); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 		bool m_working; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MsgConfigureFileSourceWork(bool working) : | 
					
						
							|  |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_working(working) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 01:43:35 +02:00
										 |  |  | 	class MsgConfigureFileSourceStreamTiming : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static MsgConfigureFileSourceStreamTiming* create() | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return new MsgConfigureFileSourceStreamTiming(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MsgConfigureFileSourceStreamTiming() : | 
					
						
							|  |  |  | 			Message() | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 14:07:39 +01:00
										 |  |  | 	class MsgConfigureFileSourceSeek : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		int getPercentage() const { return m_seekPercentage; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static MsgConfigureFileSourceSeek* create(int seekPercentage) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return new MsgConfigureFileSourceSeek(seekPercentage); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected: | 
					
						
							|  |  |  | 		int m_seekPercentage; //!< percentage of seek position from the beginning 0..100
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MsgConfigureFileSourceSeek(int seekPercentage) : | 
					
						
							|  |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_seekPercentage(seekPercentage) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 	class MsgReportFileSourceAcquisition : public Message { | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							| 
									
										
										
										
											2015-08-04 04:17:24 +02:00
										 |  |  | 		bool getAcquisition() const { return m_acquisition; } | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		static MsgReportFileSourceAcquisition* create(bool acquisition) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return new MsgReportFileSourceAcquisition(acquisition); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected: | 
					
						
							|  |  |  | 		bool m_acquisition; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MsgReportFileSourceAcquisition(bool acquisition) : | 
					
						
							|  |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_acquisition(acquisition) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	class MsgReportFileSourceStreamData : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							| 
									
										
										
										
											2015-08-04 04:17:24 +02:00
										 |  |  | 		int getSampleRate() const { return m_sampleRate; } | 
					
						
							|  |  |  | 		quint64 getCenterFrequency() const { return m_centerFrequency; } | 
					
						
							|  |  |  | 		std::time_t getStartingTimeStamp() const { return m_startingTimeStamp; } | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 		quint32 getRecordLength() const { return m_recordLength; } | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 		static MsgReportFileSourceStreamData* create(int sampleRate, | 
					
						
							|  |  |  | 				quint64 centerFrequency, | 
					
						
							|  |  |  | 				std::time_t startingTimeStamp, | 
					
						
							|  |  |  | 				quint32 recordLength) | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 			return new MsgReportFileSourceStreamData(sampleRate, centerFrequency, startingTimeStamp, recordLength); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected: | 
					
						
							| 
									
										
										
										
											2015-08-04 04:17:24 +02:00
										 |  |  | 		int m_sampleRate; | 
					
						
							|  |  |  | 		quint64 m_centerFrequency; | 
					
						
							|  |  |  | 		std::time_t m_startingTimeStamp; | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 		quint32 m_recordLength; | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 		MsgReportFileSourceStreamData(int sampleRate, | 
					
						
							|  |  |  | 				quint64 centerFrequency, | 
					
						
							|  |  |  | 				std::time_t startingTimeStamp, | 
					
						
							|  |  |  | 				quint32 recordLength) : | 
					
						
							| 
									
										
										
										
											2015-08-04 04:17:24 +02:00
										 |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_sampleRate(sampleRate), | 
					
						
							|  |  |  | 			m_centerFrequency(centerFrequency), | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 			m_startingTimeStamp(startingTimeStamp), | 
					
						
							|  |  |  | 			m_recordLength(recordLength) | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 01:14:44 +02:00
										 |  |  | 	class MsgReportFileSourceStreamTiming : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		std::size_t getSamplesCount() const { return m_samplesCount; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static MsgReportFileSourceStreamTiming* create(std::size_t samplesCount) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return new MsgReportFileSourceStreamTiming(samplesCount); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected: | 
					
						
							|  |  |  | 		std::size_t m_samplesCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MsgReportFileSourceStreamTiming(std::size_t samplesCount) : | 
					
						
							|  |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_samplesCount(samplesCount) | 
					
						
							|  |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 	FileSourceInput(const QTimer& masterTimer); | 
					
						
							|  |  |  | 	virtual ~FileSourceInput(); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 	virtual bool init(const Message& message); | 
					
						
							|  |  |  | 	virtual bool start(int device); | 
					
						
							|  |  |  | 	virtual void stop(); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 	virtual const QString& getDeviceDescription() const; | 
					
						
							|  |  |  | 	virtual int getSampleRate() const; | 
					
						
							|  |  |  | 	virtual quint64 getCenterFrequency() const; | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 	std::time_t getStartingTimeStamp() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 08:29:34 +02:00
										 |  |  | 	virtual bool handleMessage(const Message& message); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	QMutex m_mutex; | 
					
						
							|  |  |  | 	Settings m_settings; | 
					
						
							|  |  |  | 	std::ifstream m_ifstream; | 
					
						
							|  |  |  | 	FileSourceThread* m_fileSourceThread; | 
					
						
							|  |  |  | 	QString m_deviceDescription; | 
					
						
							| 
									
										
										
										
											2015-08-05 03:25:06 +02:00
										 |  |  | 	QString m_fileName; | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 	int m_sampleRate; | 
					
						
							|  |  |  | 	quint64 m_centerFrequency; | 
					
						
							| 
									
										
										
										
											2016-02-25 02:30:50 +01:00
										 |  |  | 	quint32 m_recordLength; //!< record length in seconds computed from file size
 | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | 	std::time_t m_startingTimeStamp; | 
					
						
							|  |  |  | 	const QTimer& m_masterTimer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void openFileStream(); | 
					
						
							| 
									
										
										
										
											2016-02-25 14:07:39 +01:00
										 |  |  | 	void seekFileStream(int seekPercentage); | 
					
						
							| 
									
										
										
										
											2015-08-03 01:04:20 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // INCLUDE_FILESOURCEINPUT_H
 |