| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #ifndef INCLUDE_SCOPEVIS_H
 | 
					
						
							|  |  |  | #define INCLUDE_SCOPEVIS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-20 22:51:49 +02:00
										 |  |  | #include <boost/circular_buffer.hpp>
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #include "dsp/samplesink.h"
 | 
					
						
							|  |  |  | #include "util/export.h"
 | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | #include "util/message.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GLScope; | 
					
						
							|  |  |  | class MessageQueue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SDRANGELOVE_API ScopeVis : public SampleSink { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	enum TriggerChannel { | 
					
						
							|  |  |  | 		TriggerFreeRun, | 
					
						
							|  |  |  | 		TriggerChannelI, | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 		TriggerChannelQ, | 
					
						
							|  |  |  | 		TriggerMagLin, | 
					
						
							|  |  |  | 		TriggerMagDb, | 
					
						
							|  |  |  | 		TriggerPhase | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 21:38:36 +02:00
										 |  |  | 	static const uint m_traceChunkSize; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	ScopeVis(GLScope* glScope = NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  | 	void configure(MessageQueue* msgQueue,  | 
					
						
							|  |  |  |         TriggerChannel triggerChannel,  | 
					
						
							|  |  |  |         Real triggerLevel,  | 
					
						
							|  |  |  |         bool triggerPositiveEdge,  | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  |         bool triggerBothEdges, | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |         uint triggerPre, | 
					
						
							|  |  |  |         uint triggerDelay,  | 
					
						
							|  |  |  |         uint traceSize); | 
					
						
							| 
									
										
										
										
											2015-07-14 02:18:55 +02:00
										 |  |  | 	void setOneShot(bool oneShot); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-15 09:32:25 +01:00
										 |  |  | 	void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	void start(); | 
					
						
							|  |  |  | 	void stop(); | 
					
						
							| 
									
										
										
										
											2015-06-23 20:05:28 +02:00
										 |  |  | 	bool handleMessageKeep(Message* message); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	bool handleMessage(Message* message); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-07 01:17:16 +02:00
										 |  |  | 	void setSampleRate(int sampleRate); | 
					
						
							|  |  |  | 	int getSampleRate() const { return m_sampleRate; } | 
					
						
							| 
									
										
										
										
											2015-07-15 01:19:39 +02:00
										 |  |  | 	SampleVector::const_iterator getTriggerPoint() const { return m_triggerPoint; } | 
					
						
							| 
									
										
										
										
											2015-07-07 01:17:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 	class MsgConfigureScopeVis : public Message { | 
					
						
							|  |  |  | 		MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 		int getTriggerChannel() const { return m_triggerChannel; } | 
					
						
							|  |  |  | 		Real getTriggerLevel() const { return m_triggerLevel; } | 
					
						
							|  |  |  | 		Real getTriggerPositiveEdge() const { return m_triggerPositiveEdge; } | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  | 		Real getTriggerBothEdges() const { return m_triggerBothEdges; } | 
					
						
							| 
									
										
										
										
											2015-07-21 22:18:17 +02:00
										 |  |  |         uint getTriggerPre() const { return m_triggerPre; } | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |         uint getTriggerDelay() const { return m_triggerDelay; } | 
					
						
							| 
									
										
										
										
											2015-07-21 21:38:36 +02:00
										 |  |  |         uint getTraceSize() const { return m_traceSize; } | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  | 		static MsgConfigureScopeVis* create(int triggerChannel,  | 
					
						
							|  |  |  |             Real triggerLevel,  | 
					
						
							|  |  |  |             bool triggerPositiveEdge,  | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  |             bool triggerBothEdges, | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |             uint triggerPre, | 
					
						
							|  |  |  |             uint triggerDelay,  | 
					
						
							|  |  |  |             uint traceSize) | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  | 			return new MsgConfigureScopeVis(triggerChannel, | 
					
						
							|  |  |  | 					triggerLevel, | 
					
						
							|  |  |  | 					triggerPositiveEdge, | 
					
						
							|  |  |  | 					triggerBothEdges, | 
					
						
							|  |  |  | 					triggerPre, | 
					
						
							|  |  |  | 					triggerDelay, | 
					
						
							|  |  |  | 					traceSize); | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private: | 
					
						
							|  |  |  | 		int m_triggerChannel; | 
					
						
							|  |  |  | 		Real m_triggerLevel; | 
					
						
							|  |  |  | 		bool m_triggerPositiveEdge; | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  | 		bool m_triggerBothEdges; | 
					
						
							| 
									
										
										
										
											2015-07-21 22:18:17 +02:00
										 |  |  |         uint m_triggerPre; | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |         uint m_triggerDelay; | 
					
						
							| 
									
										
										
										
											2015-07-21 21:38:36 +02:00
										 |  |  |         uint m_traceSize; | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  | 		MsgConfigureScopeVis(int triggerChannel,  | 
					
						
							|  |  |  |                 Real triggerLevel,  | 
					
						
							|  |  |  |                 bool triggerPositiveEdge,  | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  |                 bool triggerBothEdges, | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |                 uint triggerPre, | 
					
						
							|  |  |  |                 uint triggerDelay, | 
					
						
							|  |  |  |                 uint traceSize) : | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 			Message(), | 
					
						
							|  |  |  | 			m_triggerChannel(triggerChannel), | 
					
						
							|  |  |  | 			m_triggerLevel(triggerLevel), | 
					
						
							| 
									
										
										
										
											2015-07-20 22:51:49 +02:00
										 |  |  | 			m_triggerPositiveEdge(triggerPositiveEdge), | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  | 			m_triggerBothEdges(triggerBothEdges), | 
					
						
							| 
									
										
										
										
											2015-07-21 22:18:17 +02:00
										 |  |  |             m_triggerPre(triggerPre), | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |             m_triggerDelay(triggerDelay), | 
					
						
							| 
									
										
										
										
											2015-07-21 21:38:36 +02:00
										 |  |  |             m_traceSize(traceSize) | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 		{ } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      *  TriggerState: | 
					
						
							|  |  |  |      *  | 
					
						
							|  |  |  |      *            send a                       Trigger condition                                               +--------------------+ | 
					
						
							|  |  |  |      *          dummy trace                    - Immediate                              m_triggerOneShot       |                    | | 
					
						
							|  |  |  |      *  Config -------------> Untriggered ----------------------------------> Triggered ----------------> WaitForReset              | | 
					
						
							|  |  |  |      *                         ^ ^ |                                             ^  |                          |  ^                 | | 
					
						
							|  |  |  |      *                         | | |           - Delayed         Delay expired   |  |                          |  | setOneShot(true)| | 
					
						
							|  |  |  |      *                         | | +---------------------> Delay ----------------+  |                          |  +-----------------+ | 
					
						
							|  |  |  |      *                         | |                                !m_triggerOneShot |                          | | 
					
						
							|  |  |  |      *                         | +--------------------------------------------------+        setOneShot(false) | | 
					
						
							|  |  |  |      *                         +-------------------------------------------------------------------------------+ | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	enum TriggerState { | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  | 		Untriggered,  //!< Search for trigger
 | 
					
						
							|  |  |  |         Config,       //!< New configuration has just been received
 | 
					
						
							|  |  |  | 		Triggered,    //!< Trigger was kicked off
 | 
					
						
							|  |  |  | 		WaitForReset, //!< Wait for release from GUI
 | 
					
						
							|  |  |  |         Delay         //!< Trigger delay engaged
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GLScope* m_glScope; | 
					
						
							| 
									
										
										
										
											2015-07-20 22:51:49 +02:00
										 |  |  | 	std::vector<Complex> m_trace;                //!< Raw trace to be used by GLScope
 | 
					
						
							| 
									
										
										
										
											2015-07-21 21:38:36 +02:00
										 |  |  | 	boost::circular_buffer<Complex> m_traceback; //!< FIFO for samples prior to triggering point to support pre-trigger (when in triggered mode)
 | 
					
						
							|  |  |  |     uint m_tracebackCount;                       //!< Count of samples stored into trace memory since triggering is active up to trace memory size
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	uint m_fill; | 
					
						
							|  |  |  | 	TriggerState m_triggerState; | 
					
						
							|  |  |  | 	TriggerChannel m_triggerChannel; | 
					
						
							| 
									
										
										
										
											2015-07-13 23:38:10 +02:00
										 |  |  | 	Real m_triggerLevel; | 
					
						
							| 
									
										
										
										
											2015-07-13 10:46:51 +02:00
										 |  |  | 	bool m_triggerPositiveEdge; | 
					
						
							| 
									
										
										
										
											2015-07-23 06:52:12 +02:00
										 |  |  | 	bool m_triggerBothEdges; | 
					
						
							|  |  |  | 	bool m_prevTrigger; | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |     uint m_triggerPre; //!< Pre-trigger delay in number of samples
 | 
					
						
							| 
									
										
										
										
											2015-07-14 02:18:55 +02:00
										 |  |  | 	bool m_triggerOneShot; | 
					
						
							| 
									
										
										
										
											2015-07-14 00:04:34 +02:00
										 |  |  | 	bool m_armed; | 
					
						
							| 
									
										
										
										
											2015-07-23 04:58:27 +02:00
										 |  |  |     uint m_triggerDelay;      //!< Trigger delay in number of trace sizes
 | 
					
						
							|  |  |  |     uint m_triggerDelayCount; //!< trace sizes delay counter
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	int m_sampleRate; | 
					
						
							| 
									
										
										
										
											2015-07-15 01:19:39 +02:00
										 |  |  | 	SampleVector::const_iterator m_triggerPoint; | 
					
						
							| 
									
										
										
										
											2015-07-13 23:38:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	bool triggerCondition(SampleVector::const_iterator& it); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // INCLUDE_SCOPEVIS_H
 |