| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2019 F4EXB                                                      //
 | 
					
						
							|  |  |  | // written by Edouard Griffiths                                                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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                  //
 | 
					
						
							|  |  |  | // (at your option) any later version.                                           //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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 SDRBASE_DSP_DSPDEVICEMIMOENGINE_H_
 | 
					
						
							|  |  |  | #define SDRBASE_DSP_DSPDEVICEMIMOENGINE_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QThread>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-02 20:15:19 +02:00
										 |  |  | #include "dsp/dsptypes.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-18 06:30:37 +02:00
										 |  |  | #include "util/message.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | #include "util/messagequeue.h"
 | 
					
						
							|  |  |  | #include "util/syncmessenger.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  | #include "util/movingaverage.h"
 | 
					
						
							| 
									
										
										
										
											2019-10-19 05:07:24 +02:00
										 |  |  | #include "util/incrementalvector.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | #include "export.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DeviceSampleMIMO; | 
					
						
							|  |  |  | class BasebandSampleSink; | 
					
						
							| 
									
										
										
										
											2019-09-04 05:00:22 +02:00
										 |  |  | class MIMOChannel; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class SDRBASE_API DSPDeviceMIMOEngine : public QThread { | 
					
						
							|  |  |  | 	Q_OBJECT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     class SetSampleMIMO : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         SetSampleMIMO(DeviceSampleMIMO* sampleMIMO) : Message(), m_sampleMIMO(sampleMIMO) { } | 
					
						
							|  |  |  |         DeviceSampleMIMO* getSampleMIMO() const { return m_sampleMIMO; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         DeviceSampleMIMO* m_sampleMIMO; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |     class AddBasebandSampleSource : public Message { | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         AddBasebandSampleSource(BasebandSampleSource* sampleSource, unsigned int index) : | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             Message(), | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |             m_sampleSource(sampleSource), | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         BasebandSampleSource* getSampleSource() const { return m_sampleSource; } | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int getIndex() const { return m_index; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         BasebandSampleSource* m_sampleSource; | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int m_index; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |     class RemoveBasebandSampleSource : public Message { | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	    MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         RemoveBasebandSampleSource(BasebandSampleSource* sampleSource, unsigned int index) : | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             Message(), | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |             m_sampleSource(sampleSource), | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         BasebandSampleSource* getSampleSource() const { return m_sampleSource; } | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int getIndex() const { return m_index; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |         BasebandSampleSource* m_sampleSource; | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int m_index; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-04 05:00:22 +02:00
										 |  |  |     class AddMIMOChannel : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         AddMIMOChannel(MIMOChannel* channel) : | 
					
						
							|  |  |  |             Message(), | 
					
						
							|  |  |  |             m_channel(channel) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         MIMOChannel* getChannel() const { return m_channel; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         MIMOChannel* m_channel; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class RemoveMIMOChannel : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         RemoveMIMOChannel(MIMOChannel* channel) : | 
					
						
							|  |  |  |             Message(), | 
					
						
							|  |  |  |             m_channel(channel) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         MIMOChannel* getChannel() const { return m_channel; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         MIMOChannel* m_channel; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     class AddBasebandSampleSink : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         AddBasebandSampleSink(BasebandSampleSink* sampleSink, unsigned int index) : | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             Message(), | 
					
						
							|  |  |  |             m_sampleSink(sampleSink), | 
					
						
							|  |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         BasebandSampleSink* getSampleSink() const { return m_sampleSink; } | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int getIndex() const { return m_index; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     private: | 
					
						
							|  |  |  |         BasebandSampleSink* m_sampleSink; | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int m_index; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class RemoveBasebandSampleSink : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         RemoveBasebandSampleSink(BasebandSampleSink* sampleSink, unsigned int index) : | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |             Message(), | 
					
						
							|  |  |  |             m_sampleSink(sampleSink), | 
					
						
							|  |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         BasebandSampleSink* getSampleSink() const { return m_sampleSink; } | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int getIndex() const { return m_index; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     private: | 
					
						
							|  |  |  |         BasebandSampleSink* m_sampleSink; | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int m_index; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class AddSpectrumSink : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         AddSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { } | 
					
						
							|  |  |  |         BasebandSampleSink* getSampleSink() const { return m_sampleSink; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         BasebandSampleSink* m_sampleSink; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class RemoveSpectrumSink : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         RemoveSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { } | 
					
						
							|  |  |  |         BasebandSampleSink* getSampleSink() const { return m_sampleSink; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         BasebandSampleSink* m_sampleSink; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class GetErrorMessage : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |         GetErrorMessage(unsigned int subsystemIndex) : | 
					
						
							|  |  |  |             m_subsystemIndex(subsystemIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |         void setErrorMessage(const QString& text) { m_errorMessage = text; } | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |         int getSubsystemIndex() const { return m_subsystemIndex; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |         const QString& getErrorMessage() const { return m_errorMessage; } | 
					
						
							|  |  |  |     private: | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |         int m_subsystemIndex; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |         QString m_errorMessage; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |     class GetMIMODeviceDescription : public Message { | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         void setDeviceDescription(const QString& text) { m_deviceDescription = text; } | 
					
						
							|  |  |  |         const QString& getDeviceDescription() const { return m_deviceDescription; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         QString m_deviceDescription; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |     class ConfigureCorrection : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         ConfigureCorrection(bool dcOffsetCorrection, bool iqImbalanceCorrection, unsigned int index) : | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |             Message(), | 
					
						
							|  |  |  |             m_dcOffsetCorrection(dcOffsetCorrection), | 
					
						
							|  |  |  |             m_iqImbalanceCorrection(iqImbalanceCorrection), | 
					
						
							|  |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         bool getDCOffsetCorrection() const { return m_dcOffsetCorrection; } | 
					
						
							|  |  |  |         bool getIQImbalanceCorrection() const { return m_iqImbalanceCorrection; } | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int getIndex() const { return m_index; } | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |     private: | 
					
						
							|  |  |  |         bool m_dcOffsetCorrection; | 
					
						
							|  |  |  |         bool m_iqImbalanceCorrection; | 
					
						
							| 
									
										
										
										
											2019-05-16 00:43:15 +02:00
										 |  |  |         unsigned int m_index; | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-19 10:23:18 +02:00
										 |  |  |     class SetSpectrumSinkInput : public Message { | 
					
						
							|  |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         SetSpectrumSinkInput(bool sourceElseSink, int index) : | 
					
						
							|  |  |  |             m_sourceElseSink(sourceElseSink), | 
					
						
							|  |  |  |             m_index(index) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  |         bool getSourceElseSink() const { return m_sourceElseSink; } | 
					
						
							|  |  |  |         int getIndex() const { return m_index; } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         bool m_sourceElseSink; | 
					
						
							|  |  |  |         int m_index; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	enum State { | 
					
						
							|  |  |  | 		StNotStarted,  //!< engine is before initialization
 | 
					
						
							|  |  |  | 		StIdle,        //!< engine is idle
 | 
					
						
							|  |  |  | 		StReady,       //!< engine is ready to run
 | 
					
						
							|  |  |  | 		StRunning,     //!< engine is running
 | 
					
						
							|  |  |  | 		StError        //!< engine is in error
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	DSPDeviceMIMOEngine(uint32_t uid, QObject* parent = nullptr); | 
					
						
							|  |  |  | 	~DSPDeviceMIMOEngine(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void start(); //!< This thread start
 | 
					
						
							|  |  |  | 	void stop();  //!< This thread stop
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  | 	bool initProcess(int subsystemIndex);  //!< Initialize process sequence
 | 
					
						
							|  |  |  | 	bool startProcess(int subsystemIndex); //!< Start process sequence
 | 
					
						
							|  |  |  | 	void stopProcess(int subsystemIndex);  //!< Stop process sequence
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void setMIMO(DeviceSampleMIMO* mimo); //!< Set the sample MIMO type
 | 
					
						
							|  |  |  | 	DeviceSampleMIMO *getMIMO() { return m_deviceSampleMIMO; } | 
					
						
							|  |  |  | 	void setMIMOSequence(int sequence); //!< Set the sample MIMO sequence in type
 | 
					
						
							| 
									
										
										
										
											2019-05-18 06:30:37 +02:00
										 |  |  |     uint getUID() const { return m_uid; } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  | 	void addChannelSource(BasebandSampleSource* source, int index = 0);            //!< Add a channel source
 | 
					
						
							|  |  |  | 	void removeChannelSource(BasebandSampleSource* source, int index = 0);         //!< Remove a channel source
 | 
					
						
							| 
									
										
										
										
											2019-11-23 07:39:57 +01:00
										 |  |  | 	void addChannelSink(BasebandSampleSink* sink, int index = 0);                  //!< Add a channel sink
 | 
					
						
							|  |  |  | 	void removeChannelSink(BasebandSampleSink* sink, int index = 0);               //!< Remove a channel sink
 | 
					
						
							| 
									
										
										
										
											2019-09-04 05:00:22 +02:00
										 |  |  |     void addMIMOChannel(MIMOChannel *channel);                                     //!< Add a MIMO channel
 | 
					
						
							|  |  |  |     void removeMIMOChannel(MIMOChannel *channel);                                  //!< Remove a MIMO channel
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void addSpectrumSink(BasebandSampleSink* spectrumSink);    //!< Add a spectrum vis baseband sample sink
 | 
					
						
							|  |  |  | 	void removeSpectrumSink(BasebandSampleSink* spectrumSink); //!< Add a spectrum vis baseband sample sink
 | 
					
						
							| 
									
										
										
										
											2019-05-19 10:23:18 +02:00
										 |  |  |     void setSpectrumSinkInput(bool sourceElseSink, int index); | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  | 	State state(int subsystemIndex) const //!< Return DSP engine current state
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (subsystemIndex == 0) { | 
					
						
							|  |  |  |             return m_stateRx; | 
					
						
							|  |  |  |         } else if (subsystemIndex == 1) { | 
					
						
							|  |  |  |             return m_stateTx; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return StNotStarted; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  | 	QString errorMessage(int subsystemIndex); //!< Return the current error message
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	QString deviceDescription(); //!< Return the device description
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-18 06:30:37 +02:00
										 |  |  |    	void configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection, int isource); //!< Configure source DSP corrections
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2019-05-15 08:33:13 +02:00
										 |  |  |     struct SourceCorrection | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         bool m_dcOffsetCorrection; | 
					
						
							|  |  |  |         bool m_iqImbalanceCorrection; | 
					
						
							|  |  |  |         double m_iOffset; | 
					
						
							|  |  |  |         double m_qOffset; | 
					
						
							|  |  |  |         int m_iRange; | 
					
						
							|  |  |  |         int m_qRange; | 
					
						
							|  |  |  |         int m_imbalance; | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |         MovingAverageUtil<int32_t, int64_t, 1024> m_iBeta; | 
					
						
							|  |  |  |         MovingAverageUtil<int32_t, int64_t, 1024> m_qBeta; | 
					
						
							|  |  |  | #if IMBALANCE_INT
 | 
					
						
							|  |  |  |         // Fixed point DC + IQ corrections
 | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgII; | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgIQ; | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgPhi; | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgII2; | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgQQ2; | 
					
						
							|  |  |  |         MovingAverageUtil<int64_t, int64_t, 128> m_avgAmp; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         // Floating point DC + IQ corrections
 | 
					
						
							|  |  |  |         MovingAverageUtil<float, double, 128> m_avgII; | 
					
						
							|  |  |  |         MovingAverageUtil<float, double, 128> m_avgIQ; | 
					
						
							|  |  |  |         MovingAverageUtil<float, double, 128> m_avgII2; | 
					
						
							|  |  |  |         MovingAverageUtil<float, double, 128> m_avgQQ2; | 
					
						
							|  |  |  |         MovingAverageUtil<double, double, 128> m_avgPhi; | 
					
						
							|  |  |  |         MovingAverageUtil<double, double, 128> m_avgAmp; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-05-19 12:54:22 +02:00
										 |  |  |         SourceCorrection() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_dcOffsetCorrection = false; | 
					
						
							|  |  |  |             m_iqImbalanceCorrection = false; | 
					
						
							|  |  |  |             m_iOffset = 0; | 
					
						
							|  |  |  |             m_qOffset = 0; | 
					
						
							|  |  |  |             m_iRange = 1 << 16; | 
					
						
							|  |  |  |             m_qRange = 1 << 16; | 
					
						
							|  |  |  |             m_imbalance = 65536; | 
					
						
							|  |  |  |             m_iBeta.reset(); | 
					
						
							|  |  |  |             m_qBeta.reset(); | 
					
						
							|  |  |  |             m_avgAmp.reset(); | 
					
						
							|  |  |  |             m_avgII.reset(); | 
					
						
							|  |  |  |             m_avgII2.reset(); | 
					
						
							|  |  |  |             m_avgIQ.reset(); | 
					
						
							|  |  |  |             m_avgPhi.reset(); | 
					
						
							|  |  |  |             m_avgQQ2.reset(); | 
					
						
							|  |  |  |             m_iBeta.reset(); | 
					
						
							|  |  |  |             m_qBeta.reset(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-05-15 08:33:13 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	uint32_t m_uid; //!< unique ID
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |     State m_stateRx; | 
					
						
							|  |  |  |     State m_stateTx; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |     QString m_errorMessageRx; | 
					
						
							|  |  |  |     QString m_errorMessageTx; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	QString m_deviceDescription; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	DeviceSampleMIMO* m_deviceSampleMIMO; | 
					
						
							|  |  |  | 	int m_sampleMIMOSequence; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     MessageQueue m_inputMessageQueue;  //<! Input message queue. Post here.
 | 
					
						
							|  |  |  | 	SyncMessenger m_syncMessenger;     //!< Used to process messages synchronously with the thread
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	typedef std::list<BasebandSampleSink*> BasebandSampleSinks; | 
					
						
							|  |  |  | 	std::vector<BasebandSampleSinks> m_basebandSampleSinks; //!< ancillary sample sinks on main thread (per input stream)
 | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  | 	typedef std::list<BasebandSampleSource*> BasebandSampleSources; | 
					
						
							|  |  |  | 	std::vector<BasebandSampleSources> m_basebandSampleSources; //!< channel sample sources (per output stream)
 | 
					
						
							| 
									
										
										
										
											2019-10-19 05:07:24 +02:00
										 |  |  |     std::vector<IncrementalVector<Sample>> m_sourceSampleBuffers; | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  |     std::vector<IncrementalVector<Sample>> m_sourceZeroBuffers; | 
					
						
							| 
									
										
										
										
											2019-11-17 01:56:54 +01:00
										 |  |  |     unsigned int m_sumIndex;            //!< channel index when summing channels
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-04 05:00:22 +02:00
										 |  |  |     typedef std::list<MIMOChannel*> MIMOChannels; | 
					
						
							|  |  |  |     MIMOChannels m_mimoChannels; //!< MIMO channels
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 08:33:13 +02:00
										 |  |  |     std::vector<SourceCorrection> m_sourcesCorrections; | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     BasebandSampleSink *m_spectrumSink; //!< The spectrum sink
 | 
					
						
							| 
									
										
										
										
											2019-05-19 10:23:18 +02:00
										 |  |  |     bool m_spectrumInputSourceElseSink; //!< Source else sink stream to be used as spectrum sink input
 | 
					
						
							|  |  |  |     unsigned int m_spectrumInputIndex;  //!< Index of the stream to be used as spectrum sink input
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-17 01:56:54 +01:00
										 |  |  |     void run(); | 
					
						
							| 
									
										
										
										
											2019-10-19 05:07:24 +02:00
										 |  |  |     void workSampleSinkFifos(); //!< transfer samples of all sink streams (sync mode)
 | 
					
						
							|  |  |  |     void workSampleSinkFifo(unsigned int streamIndex); //!< transfer samples of one sink stream (async mode)
 | 
					
						
							|  |  |  |     void workSamplesSink(const SampleVector::const_iterator& vbegin, const SampleVector::const_iterator& vend, unsigned int streamIndex); | 
					
						
							|  |  |  |     void workSampleSourceFifos(); //!< transfer samples of all source streams (sync mode)
 | 
					
						
							|  |  |  |     void workSampleSourceFifo(unsigned int streamIndex); //!< transfer samples of one source stream (async mode)
 | 
					
						
							| 
									
										
										
										
											2019-11-15 01:04:24 +01:00
										 |  |  |     void workSamplesSource(SampleVector& data, unsigned int iBegin, unsigned int iEnd, unsigned int streamIndex); | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-20 20:05:01 +02:00
										 |  |  | 	State gotoIdle(int subsystemIndex);     //!< Go to the idle state
 | 
					
						
							|  |  |  | 	State gotoInit(int subsystemIndex);     //!< Go to the acquisition init state from idle
 | 
					
						
							|  |  |  | 	State gotoRunning(int subsystemIndex);  //!< Go to the running state from ready state
 | 
					
						
							|  |  |  | 	State gotoError(int subsystemIndex, const QString& errorMsg); //!< Go to an error state
 | 
					
						
							| 
									
										
										
										
											2022-08-27 10:18:17 +01:00
										 |  |  | 	void setStateRx(State state); | 
					
						
							|  |  |  | 	void setStateTx(State state); | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  |     void handleSetMIMO(DeviceSampleMIMO* mimo); //!< Manage MIMO device setting
 | 
					
						
							| 
									
										
										
										
											2019-05-29 22:09:19 +02:00
										 |  |  |    	void iqCorrections(SampleVector::iterator begin, SampleVector::iterator end, int isource, bool imbalanceCorrection); | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | private slots: | 
					
						
							| 
									
										
										
										
											2019-08-14 02:56:15 +02:00
										 |  |  | 	void handleDataRxSync();           //!< Handle data when Rx samples have to be processed synchronously
 | 
					
						
							| 
									
										
										
										
											2019-09-25 18:39:17 +02:00
										 |  |  | 	void handleDataRxAsync(int streamIndex); //!< Handle data when Rx samples have to be processed asynchronously
 | 
					
						
							| 
									
										
										
										
											2019-10-19 05:07:24 +02:00
										 |  |  | 	void handleDataTxSync();           //!< Handle data when Tx samples have to be processed synchronously
 | 
					
						
							|  |  |  | 	void handleDataTxAsync(int streamIndex); //!< Handle data when Tx samples have to be processed asynchronously
 | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | 	void handleSynchronousMessages();  //!< Handle synchronous messages with the thread
 | 
					
						
							| 
									
										
										
										
											2019-05-15 18:51:10 +02:00
										 |  |  | 	void handleInputMessages();        //!< Handle input message queue
 | 
					
						
							| 
									
										
										
										
											2022-08-27 10:18:17 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | signals: | 
					
						
							|  |  |  | 	void stateChanged(); | 
					
						
							| 
									
										
										
										
											2019-05-13 01:55:12 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-02 20:15:19 +02:00
										 |  |  | #endif // SDRBASE_DSP_DSPDEVICEMIMOENGINE_H_
 |