| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2023-11-19 06:43:20 +01:00
										 |  |  | // Copyright (C) 2017-2021, 2023 Edouard Griffiths, F4EXB <f4exb06@gmail.com>    //
 | 
					
						
							|  |  |  | // Copyright (C) 2019 Martin Hauke <mardnh@gmx.de>                               //
 | 
					
						
							|  |  |  | // Copyright (C) 2020 Kacper Michajłow <kasper93@gmail.com>                      //
 | 
					
						
							|  |  |  | // Copyright (C) 2022 Jiří Pinkava <jiri.pinkava@rossum.ai>                      //
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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                  //
 | 
					
						
							| 
									
										
										
										
											2019-04-11 14:43:33 +02:00
										 |  |  | // (at your option) any later version.                                           //
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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_SCOPEVISNG_H_
 | 
					
						
							|  |  |  | #define SDRBASE_DSP_SCOPEVISNG_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 04:35:08 +01:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2017-02-11 20:44:00 +01:00
										 |  |  | #include <QColor>
 | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  | #include <QByteArray>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2020-11-03 13:52:12 +01:00
										 |  |  | #include <cmath>
 | 
					
						
							| 
									
										
										
										
											2017-02-10 04:35:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | #include "dsp/dsptypes.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  | #include "dsp/projector.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  | #include "dsp/glscopesettings.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-20 13:49:21 +01:00
										 |  |  | #include "export.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | #include "util/message.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  | #include "util/messagequeue.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | #include "util/doublebuffer.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-31 18:36:04 +02:00
										 |  |  | #include "util/doublebuffermultiple.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 18:48:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  | class GLScopeInterface; | 
					
						
							| 
									
										
										
										
											2021-06-05 19:26:26 +02:00
										 |  |  | class SpectrumVis; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 11:19:44 +02:00
										 |  |  | class SDRBASE_API ScopeVis : public QObject { | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  |     Q_OBJECT | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     // === messages ===
 | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgConfigureScopeVis : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         const GLScopeSettings& getSettings() const { return m_settings; } | 
					
						
							|  |  |  |         bool getForce() const { return m_force; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         static MsgConfigureScopeVis* create(const GLScopeSettings& settings, bool force) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             return new MsgConfigureScopeVis(settings, force); | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         GLScopeSettings m_settings; | 
					
						
							|  |  |  |         bool m_force; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         MsgConfigureScopeVis(const GLScopeSettings& settings, bool force) : | 
					
						
							|  |  |  |             Message(), | 
					
						
							|  |  |  |             m_settings(settings), | 
					
						
							|  |  |  |             m_force(force) | 
					
						
							|  |  |  |         { } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisAddTrigger : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisAddTrigger* create( | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |                 const GLScopeSettings::TriggerData& triggerData) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisAddTrigger(triggerData); | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         const GLScopeSettings::TriggerData& getTriggerData() const { return m_triggerData; } | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         GLScopeSettings::TriggerData m_triggerData; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisAddTrigger(const GLScopeSettings::TriggerData& triggerData) : | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |             m_triggerData(triggerData) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisChangeTrigger : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisChangeTrigger* create( | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |             const GLScopeSettings::TriggerData& triggerData, uint32_t triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisChangeTrigger(triggerData, triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         const GLScopeSettings::TriggerData& getTriggerData() const { return m_triggerData; } | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         uint32_t getTriggerIndex() const { return m_triggerIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         GLScopeSettings::TriggerData m_triggerData; | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         uint32_t m_triggerIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisChangeTrigger(const GLScopeSettings::TriggerData& triggerData, uint32_t triggerIndex) : | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |             m_triggerData(triggerData), | 
					
						
							|  |  |  |             m_triggerIndex(triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisRemoveTrigger : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisRemoveTrigger* create( | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |                 uint32_t triggerIndex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisRemoveTrigger(triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         uint32_t getTriggerIndex() const { return m_triggerIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_triggerIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisRemoveTrigger(uint32_t triggerIndex) : | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             m_triggerIndex(triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisMoveTrigger : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisMoveTrigger* create( | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |                 uint32_t triggerIndex, | 
					
						
							|  |  |  |                 bool moveUpElseDown) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisMoveTrigger(triggerIndex, moveUpElseDown); | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         uint32_t getTriggerIndex() const { return m_triggerIndex; } | 
					
						
							|  |  |  |         bool getMoveUp() const { return m_moveUpElseDown; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_triggerIndex; | 
					
						
							|  |  |  |         bool m_moveUpElseDown; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisMoveTrigger(uint32_t triggerIndex, bool moveUpElseDown) : | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |             m_triggerIndex(triggerIndex), | 
					
						
							|  |  |  |             m_moveUpElseDown(moveUpElseDown) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisFocusOnTrigger : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisFocusOnTrigger* create( | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |                 uint32_t triggerIndex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisFocusOnTrigger(triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         uint32_t getTriggerIndex() const { return m_triggerIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_triggerIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisFocusOnTrigger(uint32_t triggerIndex) : | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |             m_triggerIndex(triggerIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisAddTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         static MsgScopeVisAddTrace* create( | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |                 const GLScopeSettings::TraceData& traceData) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             return new MsgScopeVisAddTrace(traceData); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         const GLScopeSettings::TraceData& getTraceData() const { return m_traceData; } | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         GLScopeSettings::TraceData m_traceData; | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisAddTrace(const GLScopeSettings::TraceData& traceData) : | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |             m_traceData(traceData) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisChangeTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         static MsgScopeVisChangeTrace* create( | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |                 const GLScopeSettings::TraceData& traceData, uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             return new MsgScopeVisChangeTrace(traceData, traceIndex); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         const GLScopeSettings::TraceData& getTraceData() const { return m_traceData; } | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         uint32_t getTraceIndex() const { return m_traceIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         GLScopeSettings::TraceData m_traceData; | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         uint32_t m_traceIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisChangeTrace(GLScopeSettings::TraceData traceData, uint32_t traceIndex) : | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |             m_traceData(traceData), | 
					
						
							|  |  |  |             m_traceIndex(traceIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisRemoveTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         static MsgScopeVisRemoveTrace* create( | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |                 uint32_t traceIndex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             return new MsgScopeVisRemoveTrace(traceIndex); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         uint32_t getTraceIndex() const { return m_traceIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_traceIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisRemoveTrace(uint32_t traceIndex) : | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  |             m_traceIndex(traceIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisMoveTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisMoveTrace* create( | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |                 uint32_t traceIndex, | 
					
						
							|  |  |  |                 bool moveUpElseDown) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisMoveTrace(traceIndex, moveUpElseDown); | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         uint32_t getTraceIndex() const { return m_traceIndex; } | 
					
						
							|  |  |  |         bool getMoveUp() const { return m_moveUpElseDown; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_traceIndex; | 
					
						
							|  |  |  |         bool m_moveUpElseDown; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisMoveTrace(uint32_t traceIndex, bool moveUpElseDown) : | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |             m_traceIndex(traceIndex), | 
					
						
							|  |  |  |             m_moveUpElseDown(moveUpElseDown) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisFocusOnTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         static MsgScopeVisFocusOnTrace* create( | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |                 uint32_t traceIndex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |             return new MsgScopeVisFocusOnTrace(traceIndex); | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         uint32_t getTraceIndex() const { return m_traceIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_traceIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisFocusOnTrace(uint32_t traceIndex) : | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |             m_traceIndex(traceIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisNGOneShot : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         static MsgScopeVisNGOneShot* create( | 
					
						
							|  |  |  |                 bool oneShot) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return new MsgScopeVisNGOneShot(oneShot); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bool getOneShot() const { return m_oneShot; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         bool m_oneShot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         MsgScopeVisNGOneShot(bool oneShot) : | 
					
						
							|  |  |  |             m_oneShot(oneShot) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  |     // ---------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:50:33 +02:00
										 |  |  |     class SDRBASE_API MsgScopeVisNGMemoryTrace : public Message { | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  |         MESSAGE_CLASS_DECLARATION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         static MsgScopeVisNGMemoryTrace* create( | 
					
						
							|  |  |  |                 uint32_t memoryIndex) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return new MsgScopeVisNGMemoryTrace(memoryIndex); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 23:24:47 +01:00
										 |  |  |         uint32_t getMemoryIndex() const { return m_memoryIndex; } | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         uint32_t m_memoryIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         MsgScopeVisNGMemoryTrace(uint32_t memoryIndex) : | 
					
						
							|  |  |  |             m_memoryIndex(memoryIndex) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     ScopeVis(); | 
					
						
							|  |  |  |     virtual ~ScopeVis(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void setGLScope(GLScopeInterface* glScope); | 
					
						
							|  |  |  |     void setSpectrumVis(SpectrumVis *spectrumVis) { m_spectrumVis = spectrumVis; } | 
					
						
							| 
									
										
										
										
											2023-07-09 01:19:39 +02:00
										 |  |  |     void setSSBSpectrum(bool ssbSpectrum) { m_ssbSpectrum = ssbSpectrum; } | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void setLiveRate(int sampleRate); | 
					
						
							| 
									
										
										
										
											2021-06-12 10:47:03 +02:00
										 |  |  |     void setNbStreams(uint32_t nbStreams); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     void configure( | 
					
						
							|  |  |  |         uint32_t traceSize, | 
					
						
							|  |  |  |         uint32_t timeBase, | 
					
						
							|  |  |  |         uint32_t timeOfsProMill, | 
					
						
							|  |  |  |         uint32_t triggerPre, | 
					
						
							|  |  |  |         bool freeRun | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     void configure( | 
					
						
							|  |  |  |         GLScopeSettings::DisplayMode displayMode, | 
					
						
							|  |  |  |         uint32_t traceIntensity, | 
					
						
							|  |  |  |         uint32_t gridIntensity | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     void setOneShot(bool oneShot); | 
					
						
							|  |  |  |     void setMemoryIndex(uint32_t memoryIndex); | 
					
						
							|  |  |  |     void setTraceChunkSize(uint32_t chunkSize) { m_traceChunkSize = chunkSize; } | 
					
						
							|  |  |  |     uint32_t getTraceChunkSize() const { return m_traceChunkSize; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QByteArray serializeMemory() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         SimpleSerializer s(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         s.writeU32(1, m_traceSize); | 
					
						
							|  |  |  |         s.writeU32(2, m_preTriggerDelay); | 
					
						
							|  |  |  |         s.writeS32(3, m_sampleRate); | 
					
						
							|  |  |  |         QByteArray buffer = m_traceDiscreteMemory.serialize(); | 
					
						
							|  |  |  |         s.writeBlob(4, buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return s.final(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool deserializeMemory(const QByteArray& data) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         SimpleDeserializer d(data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(!d.isValid()) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d.getVersion() == 1) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             uint32_t traceSize, preTriggerDelay; | 
					
						
							|  |  |  |             int sampleRate; | 
					
						
							|  |  |  |             QByteArray buf; | 
					
						
							|  |  |  |             bool traceDiscreteMemorySuccess; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             d.readU32(1, &traceSize, GLScopeSettings::m_traceChunkDefaultSize); | 
					
						
							|  |  |  |             d.readU32(2, &preTriggerDelay, 0); | 
					
						
							|  |  |  |             d.readS32(3, &sampleRate, 0); | 
					
						
							|  |  |  |             setSampleRate(sampleRate); | 
					
						
							|  |  |  |             setTraceSize(traceSize, true); | 
					
						
							|  |  |  |             setPreTriggerDelay(preTriggerDelay, true); | 
					
						
							|  |  |  |             d.readBlob(4, &buf); | 
					
						
							|  |  |  |             traceDiscreteMemorySuccess = m_traceDiscreteMemory.deserialize(buf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (traceDiscreteMemorySuccess && (m_glScope) && (m_currentTraceMemoryIndex > 0)) { | 
					
						
							|  |  |  |                 processMemoryTrace(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return traceDiscreteMemorySuccess; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void getTriggerData(GLScopeSettings::TriggerData& triggerData, uint32_t triggerIndex) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (triggerIndex < m_triggerConditions.size()) { | 
					
						
							|  |  |  |             triggerData = m_triggerConditions[triggerIndex]->m_triggerData; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void getTraceData(GLScopeSettings::TraceData& traceData, uint32_t traceIndex) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (traceIndex < m_traces.m_tracesData.size()) { | 
					
						
							|  |  |  |             traceData = m_traces.m_tracesData[traceIndex]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const GLScopeSettings::TriggerData& getTriggerData(uint32_t triggerIndex) const { return m_triggerConditions[triggerIndex]->m_triggerData; } | 
					
						
							|  |  |  |     const std::vector<GLScopeSettings::TraceData>& getTracesData() const { return m_traces.m_tracesData; } | 
					
						
							|  |  |  |     uint32_t getNbTriggers() const { return m_triggerConditions.size(); } | 
					
						
							|  |  |  |     uint32_t getNbTraces() const { return m_traces.size(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void feed(const std::vector<SampleVector::const_iterator>& vbegin, int nbSamples); | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     void feed(const std::vector<ComplexVector::const_iterator>& vbegin, int nbSamples); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     //virtual void start();
 | 
					
						
							|  |  |  |     //virtual void stop();
 | 
					
						
							|  |  |  |     bool handleMessage(const Message& message); | 
					
						
							|  |  |  |     int getTriggerLocation() const { return m_triggerLocation; } | 
					
						
							|  |  |  |     bool getFreeRun() const { return m_freeRun; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Trigger stuff | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     enum TriggerState | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         TriggerUntriggered, //!< Trigger is not kicked off yet (or trigger list is empty)
 | 
					
						
							|  |  |  |         TriggerTriggered,   //!< Trigger has been kicked off
 | 
					
						
							|  |  |  |         TriggerDelay,       //!< Trigger conditions have been kicked off but it is waiting for delay before final kick off
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct TriggerCondition | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |         Projector m_projector; | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         GLScopeSettings::TriggerData m_triggerData; //!< Trigger data
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |         bool m_prevCondition;         //!< Condition (above threshold) at previous sample
 | 
					
						
							|  |  |  |         uint32_t m_triggerDelayCount; //!< Counter of samples for delay
 | 
					
						
							| 
									
										
										
										
											2019-07-22 23:14:23 +02:00
										 |  |  |         uint32_t m_triggerCounter;    //!< Counter of trigger occurrences
 | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |         uint32_t m_trues;             //!< Count of true conditions for holdoff processing
 | 
					
						
							|  |  |  |         uint32_t m_falses;            //!< Count of false conditions for holdoff processing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         TriggerCondition(const GLScopeSettings::TriggerData& triggerData) : | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             m_projector(Projector::ProjectionReal), | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             m_triggerData(triggerData), | 
					
						
							|  |  |  |             m_prevCondition(false), | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |             m_triggerDelayCount(0), | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |             m_triggerCounter(0), | 
					
						
							|  |  |  |             m_trues(0), | 
					
						
							|  |  |  |             m_falses(0) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |         ~TriggerCondition() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 02:45:49 +01:00
										 |  |  |         void initProjector() | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |             m_projector.settProjectionType(m_triggerData.m_projectionType); | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 02:45:49 +01:00
										 |  |  |         void releaseProjector() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |         void setData(const GLScopeSettings::TriggerData& triggerData) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             m_triggerData = triggerData; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |             if (m_projector.getProjectionType() != m_triggerData.m_projectionType) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |                 m_projector.settProjectionType(m_triggerData.m_projectionType); | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             m_prevCondition = false; | 
					
						
							|  |  |  |             m_triggerDelayCount = 0; | 
					
						
							|  |  |  |             m_triggerCounter = 0; | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |             m_trues = 0; | 
					
						
							|  |  |  |             m_falses = 0; | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-26 19:14:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         void operator=(const TriggerCondition& other) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             setData(other.m_triggerData); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Complex trace stuff | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     typedef DoubleBufferSimple<Complex> TraceBuffer; | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct TraceBackBuffer | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     	TraceBuffer m_traceBuffer; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     	TraceBackBuffer() { | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     		m_endPoint = m_traceBuffer.getCurrent(); | 
					
						
							|  |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     	void resize(uint32_t size) { | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     		m_traceBuffer.resize(size); | 
					
						
							|  |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     	void reset() { | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |     	    m_traceBuffer.reset(); | 
					
						
							|  |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     	void write(const ComplexVector::const_iterator begin, int nbSamples) { | 
					
						
							| 
									
										
										
										
											2021-05-31 18:36:04 +02:00
										 |  |  |     		m_traceBuffer.write(begin, nbSamples); | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	unsigned int absoluteFill() const { | 
					
						
							|  |  |  |     		return m_traceBuffer.absoluteFill(); | 
					
						
							|  |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void current(ComplexVector::iterator& it) { | 
					
						
							| 
									
										
										
										
											2021-05-31 19:35:14 +02:00
										 |  |  |             m_traceBuffer.getCurrent(it); | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         QByteArray serialize() const | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SimpleSerializer s(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             QByteArray buffer = m_traceBuffer.serialize(); | 
					
						
							|  |  |  |             unsigned int endDelta = m_endPoint - m_traceBuffer.begin(); | 
					
						
							|  |  |  |             s.writeU32(1, endDelta); | 
					
						
							|  |  |  |             s.writeBlob(2, buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return s.final(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bool deserialize(const QByteArray& data) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SimpleDeserializer d(data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if(!d.isValid()) { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (d.getVersion() == 1) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 unsigned int tmpUInt; | 
					
						
							|  |  |  |                 QByteArray buf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 d.readU32(1, &tmpUInt, 0); | 
					
						
							|  |  |  |                 d.readBlob(2, &buf); | 
					
						
							|  |  |  |                 m_traceBuffer.deserialize(buf); | 
					
						
							|  |  |  |                 m_endPoint = m_traceBuffer.begin() + tmpUInt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-05-31 19:35:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void setEndPoint(const ComplexVector::const_iterator& endPoint) { | 
					
						
							| 
									
										
										
										
											2021-05-31 19:35:14 +02:00
										 |  |  |             m_endPoint = endPoint; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         ComplexVector::const_iterator getEndPoint() { | 
					
						
							| 
									
										
										
										
											2021-05-31 19:35:14 +02:00
										 |  |  |             return m_endPoint; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void getEndPoint(ComplexVector::const_iterator& it) { | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |             it = m_endPoint; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 19:35:14 +02:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     	ComplexVector::const_iterator m_endPoint; | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |     typedef std::vector<TraceBackBuffer> TraceBackBufferStream; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     struct ConvertBuffers | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ConvertBuffers(uint32_t nbStreams = 1) : | 
					
						
							|  |  |  |             m_convertBuffers(nbStreams) | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void setNbStreams(uint32_t nbStreams) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_convertBuffers.resize(nbStreams); | 
					
						
							|  |  |  |             resize(m_size); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void resize(unsigned int size) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             for (unsigned int s = 0; s < m_convertBuffers.size(); s++) { | 
					
						
							|  |  |  |                 m_convertBuffers[s].resize(size); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             m_size = size; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         unsigned int size() const { | 
					
						
							|  |  |  |             return m_size; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         std::vector<ComplexVector>& getBuffers() { | 
					
						
							|  |  |  |             return m_convertBuffers; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         unsigned int m_size; | 
					
						
							|  |  |  |         std::vector<ComplexVector> m_convertBuffers; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     struct TraceBackDiscreteMemory | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Give memory size in number of traces | 
					
						
							|  |  |  |     	 */ | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         TraceBackDiscreteMemory(uint32_t size, uint32_t nbStreams = 1) : | 
					
						
							|  |  |  |             m_traceBackBuffersStreams(nbStreams), | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             m_memSize(size), | 
					
						
							|  |  |  |             m_currentMemIndex(0), | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |             m_maxMemIndex(0), | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             m_traceSize(0) | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	{ | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |             for (unsigned int s = 0; s < m_traceBackBuffersStreams.size(); s++) { | 
					
						
							|  |  |  |         		m_traceBackBuffersStreams[s].resize(m_memSize); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |         void setNbStreams(uint32_t nbStreams) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_traceBackBuffersStreams.resize(nbStreams); | 
					
						
							| 
									
										
										
										
											2021-06-23 22:06:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for (unsigned int s = 0; s < m_traceBackBuffersStreams.size(); s++) { | 
					
						
							|  |  |  |                 m_traceBackBuffersStreams[s].resize(m_memSize); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |             resize(m_traceSize); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Resize all trace buffers in memory | 
					
						
							|  |  |  |     	 */ | 
					
						
							|  |  |  |     	void resize(uint32_t size) | 
					
						
							|  |  |  |     	{ | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     	    m_traceSize = size; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |             for (unsigned int s = 0; s < m_traceBackBuffersStreams.size(); s++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 for (std::vector<TraceBackBuffer>::iterator it = m_traceBackBuffersStreams[s].begin(); it != m_traceBackBuffersStreams[s].end(); ++it) { | 
					
						
							|  |  |  |                     it->resize(2*m_traceSize); // was multiplied by 4
 | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Move index forward by one position and return reference to the trace at this position | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     	 * Copy a trace length of samples into the new memory slot | 
					
						
							| 
									
										
										
										
											2018-10-27 18:19:08 +02:00
										 |  |  |          * samplesToReport are the number of samples to report on the next trace | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	 */ | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         void store(int samplesToReport) | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	{ | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     	    uint32_t nextMemIndex = m_currentMemIndex < (m_memSize-1) ? m_currentMemIndex+1 : 0; | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for (unsigned int s = 0; s < m_traceBackBuffersStreams.size(); s++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_traceBackBuffersStreams[s][nextMemIndex].reset(); | 
					
						
							|  |  |  |                 m_traceBackBuffersStreams[s][nextMemIndex].write( | 
					
						
							|  |  |  |                     m_traceBackBuffersStreams[s][m_currentMemIndex].getEndPoint() - samplesToReport, | 
					
						
							|  |  |  |                     samplesToReport | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     	    m_currentMemIndex = nextMemIndex; | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (m_currentMemIndex > m_maxMemIndex) { | 
					
						
							|  |  |  |                 m_maxMemIndex = m_currentMemIndex; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Return current memory index | 
					
						
							|  |  |  |     	 */ | 
					
						
							|  |  |  |     	uint32_t currentIndex() const { return m_currentMemIndex; } | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Return max memory index processed | 
					
						
							|  |  |  |     	 */ | 
					
						
							|  |  |  |     	uint32_t maxIndex() const { return m_maxMemIndex; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  |     	/**
 | 
					
						
							|  |  |  |     	 * Serializer | 
					
						
							|  |  |  |     	 */ | 
					
						
							|  |  |  |         QByteArray serialize() const | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SimpleSerializer s(1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |             s.writeU32(1, m_traceBackBuffersStreams.size()); | 
					
						
							|  |  |  |             s.writeU32(2, m_memSize); | 
					
						
							|  |  |  |             s.writeU32(3, m_currentMemIndex); | 
					
						
							|  |  |  |             s.writeU32(4, m_traceSize); | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |             for (unsigned int is = 0; is < m_traceBackBuffersStreams.size(); is++) | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 SimpleSerializer ss(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 for (unsigned int i = 0; i < m_memSize; i++) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     QByteArray buffer = m_traceBackBuffersStreams[is][i].serialize(); | 
					
						
							|  |  |  |                     ss.writeBlob(i, buffer); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 s.writeBlob(5+is, ss.final()); | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return s.final(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							|  |  |  |          * Deserializer | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         bool deserialize(const QByteArray& data) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SimpleDeserializer d(data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if(!d.isValid()) { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (d.getVersion() == 1) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 unsigned int nbStreams; | 
					
						
							|  |  |  |                 d.readU32(1, &nbStreams, 0); | 
					
						
							|  |  |  |                 d.readU32(2, &m_memSize, 0); | 
					
						
							|  |  |  |                 d.readU32(3, &m_currentMemIndex, 0); | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |                 uint32_t traceSize; | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 d.readU32(4, &traceSize, 0); | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 for (unsigned int is = 0; is < nbStreams; is++) | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                     if (is >= m_traceBackBuffersStreams.size()) { | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     m_traceBackBuffersStreams[is].resize(m_memSize); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (traceSize != m_traceSize) { | 
					
						
							|  |  |  |                         resize(traceSize); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     QByteArray streamData; | 
					
						
							|  |  |  |                     d.readBlob(5+is, &streamData); | 
					
						
							|  |  |  |                     SimpleDeserializer ds(streamData); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     for (unsigned int i = 0; i < m_memSize; i++) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         QByteArray buffer; | 
					
						
							|  |  |  |                         ds.readBlob(i, &buffer); | 
					
						
							|  |  |  |                         m_traceBackBuffersStreams[is][i].deserialize(buffer); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2018-10-15 08:45:44 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |          * Get current point at current memory position (first stream) | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void getCurrent(ComplexVector::iterator& it) { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             current().current(it); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |          * Get current points at current memory position | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void getCurrent(std::vector<ComplexVector::const_iterator>& vit) | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             vit.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (unsigned int is = 0; is < m_traceBackBuffersStreams.size(); is++) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |                 ComplexVector::iterator it; | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 current(is).current(it); | 
					
						
							|  |  |  |                 vit.push_back(it); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							|  |  |  |          * Set end point at current memory position (first stream) | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void setCurrentEndPoint(const ComplexVector::iterator& it) { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             current().setEndPoint(it); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |          * Set end points at current memory position | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void setCurrentEndPoint(const std::vector<ComplexVector::const_iterator>& vit) | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             for (unsigned int is = 0; is < vit.size(); is++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (is >= m_traceBackBuffersStreams.size()) { | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 current(is).setEndPoint(vit[is]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							|  |  |  |          * Get end point at given memory position (first stream) | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void getEndPointAt(int index, ComplexVector::const_iterator& mend) { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             at(index).getEndPoint(mend); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |          * Get end points at given memory position | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void getEndPointAt(int index, std::vector<ComplexVector::const_iterator>& vend) | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             vend.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (unsigned int is = 0; is < m_traceBackBuffersStreams.size(); is++) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |                 ComplexVector::const_iterator mend; | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 at(index, is).getEndPoint(mend); | 
					
						
							|  |  |  |                 vend.push_back(mend); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							|  |  |  |          * Write trace at current memory position (first stream) | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void writeCurrent(const ComplexVector::const_iterator& begin, int length) { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             current().write(begin, length); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |          * Write traces at current memory position | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         void writeCurrent(const std::vector<ComplexVector::const_iterator>& vbegin, int length) | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             for (unsigned int i = 0; i < vbegin.size(); i++) { | 
					
						
							| 
									
										
										
										
											2021-07-13 17:28:21 +02:00
										 |  |  |                 current(i).write(vbegin[i], length); | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /**
 | 
					
						
							|  |  |  |          * Move buffer iterator by a certain amount (first stream) | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         static void moveIt(const ComplexVector::const_iterator& x, ComplexVector::const_iterator& y, int amount) { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             y = x + amount; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         /**
 | 
					
						
							|  |  |  |          * Move buffers iterators by a certain amount | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         static void moveIt(const std::vector<ComplexVector::const_iterator>& vx, std::vector<ComplexVector::const_iterator>& vy, int amount) | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             for (unsigned int i = 0; i < vx.size(); i++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (i >= vy.size()) { | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 vy[i] = vx[i] + amount; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         std::vector<TraceBackBufferStream> m_traceBackBuffersStreams; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         uint32_t m_memSize; | 
					
						
							|  |  |  |         uint32_t m_currentMemIndex; | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |         uint32_t m_maxMemIndex; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         uint32_t m_traceSize; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         TraceBackBuffer& current(uint32_t streamIndex = 0) { //!< Return trace at current memory position
 | 
					
						
							|  |  |  |             return m_traceBackBuffersStreams[streamIndex][m_currentMemIndex]; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |         TraceBackBuffer& at(int index, uint32_t streamIndex = 0) { //!< Return trace at given memory position
 | 
					
						
							|  |  |  |             return m_traceBackBuffersStreams[streamIndex][index]; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Displayable trace stuff | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     struct TraceControl | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         Projector m_projector;    //!< Projector transform from complex trace to real (displayable) trace
 | 
					
						
							|  |  |  |         uint32_t m_traceCount[2]; //!< Count of samples processed (double buffered)
 | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |         double m_maxPow;          //!< Maximum power over the current trace for MagDB overlay display
 | 
					
						
							|  |  |  |         double m_sumPow;          //!< Cumulative power over the current trace for MagDB overlay display
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         int m_nbPow;              //!< Number of power samples over the current trace for MagDB overlay display
 | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |         TraceControl() : m_projector(Projector::ProjectionReal) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |             reset(); | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         ~TraceControl() | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |         void initProjector(Projector::ProjectionType projectionType) | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |             m_projector.settProjectionType(projectionType); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 18:28:19 +01:00
										 |  |  |         void releaseProjector() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         void reset() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_traceCount[0] = 0; | 
					
						
							|  |  |  |             m_traceCount[1] = 0; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |             m_maxPow = 0.0f; | 
					
						
							|  |  |  |             m_sumPow = 0.0f; | 
					
						
							|  |  |  |             m_nbPow = 0; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct Traces | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |         std::vector<TraceControl*> m_tracesControl;   //!< Corresponding traces control data
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         std::vector<GLScopeSettings::TraceData> m_tracesData; //!< Corresponding traces data
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         std::vector<float *> m_traces[2];             //!< Double buffer of traces processed by glScope
 | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |         std::vector<Projector::ProjectionType> m_projectionTypes; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         int m_traceSize;                              //!< Current size of a trace in buffer
 | 
					
						
							|  |  |  |         int m_maxTraceSize;                           //!< Maximum Size of a trace in buffer
 | 
					
						
							|  |  |  |         bool evenOddIndex;                            //!< Even (true) or odd (false) index
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         Traces() : | 
					
						
							|  |  |  |             m_traceSize(0), | 
					
						
							|  |  |  |             m_maxTraceSize(0), | 
					
						
							|  |  |  |             evenOddIndex(true), | 
					
						
							|  |  |  |             m_x0(0), | 
					
						
							|  |  |  |             m_x1(0) | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ~Traces() | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |             for (std::vector<TraceControl*>::iterator it = m_tracesControl.begin(); it != m_tracesControl.end(); ++it) { | 
					
						
							|  |  |  |                 delete *it; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_x0) { | 
					
						
							|  |  |  |                 delete[] m_x0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_x1) { | 
					
						
							|  |  |  |                 delete[] m_x1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |             m_maxTraceSize = 0; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         bool isVerticalDisplayChange(const GLScopeSettings::TraceData& traceData, uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-02-10 18:28:19 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |         	return (m_tracesData[traceIndex].m_projectionType != traceData.m_projectionType) | 
					
						
							|  |  |  |         			|| (m_tracesData[traceIndex].m_amp != traceData.m_amp) | 
					
						
							| 
									
										
										
										
											2017-02-12 02:12:06 +01:00
										 |  |  | 					|| (m_tracesData[traceIndex].m_ofs != traceData.m_ofs | 
					
						
							|  |  |  | 					|| (m_tracesData[traceIndex].m_traceColor != traceData.m_traceColor)); | 
					
						
							| 
									
										
										
										
											2017-02-10 18:28:19 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         void addTrace(const GLScopeSettings::TraceData& traceData, int traceSize) | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |             if (m_traces[0].size() < GLScopeSettings::m_maxNbTraces) | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-08-09 02:21:12 +02:00
										 |  |  |                 qDebug("ScopeVis::Traces::addTrace"); | 
					
						
							|  |  |  |                 m_traces[0].push_back(nullptr); | 
					
						
							|  |  |  |                 m_traces[1].push_back(nullptr); | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |                 m_tracesData.push_back(traceData); | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |                 m_projectionTypes.push_back(traceData.m_projectionType); | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 m_tracesControl.push_back(new TraceControl()); | 
					
						
							|  |  |  |                 TraceControl *traceControl = m_tracesControl.back(); | 
					
						
							|  |  |  |                 traceControl->initProjector(traceData.m_projectionType); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |                 resize(traceSize); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         void changeTrace(const GLScopeSettings::TraceData& traceData, uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             if (traceIndex < m_tracesControl.size()) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 TraceControl *traceControl = m_tracesControl[traceIndex]; | 
					
						
							|  |  |  |                 traceControl->releaseProjector(); | 
					
						
							|  |  |  |                 traceControl->initProjector(traceData.m_projectionType); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |                 m_tracesData[traceIndex] = traceData; | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |                 m_projectionTypes[traceIndex] = traceData.m_projectionType; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         void removeTrace(uint32_t traceIndex) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (traceIndex < m_tracesControl.size()) | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-08-09 02:21:12 +02:00
										 |  |  |                 qDebug("ScopeVis::Traces::removeTrace"); | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |                 m_traces[0].erase(m_traces[0].begin() + traceIndex); | 
					
						
							|  |  |  |                 m_traces[1].erase(m_traces[1].begin() + traceIndex); | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |                 m_projectionTypes.erase(m_projectionTypes.begin() + traceIndex); | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 TraceControl *traceControl = m_tracesControl[traceIndex]; | 
					
						
							|  |  |  |                 traceControl->releaseProjector(); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |                 m_tracesControl.erase(m_tracesControl.begin() + traceIndex); | 
					
						
							|  |  |  |                 m_tracesData.erase(m_tracesData.begin() + traceIndex); | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 delete traceControl; | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 resize(m_traceSize); // reallocate pointers
 | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void moveTrace(uint32_t traceIndex, bool upElseDown) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if ((!upElseDown) && (traceIndex == 0)) { | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int nextControlIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesControl.size()); | 
					
						
							|  |  |  |             int nextDataIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesData.size()); // should be the same
 | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |             int nextProjectionTypeIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_projectionTypes.size()); // should be the same
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Projector::ProjectionType nextType = m_projectionTypes[traceIndex]; | 
					
						
							|  |  |  |             m_projectionTypes[nextProjectionTypeIndex] = m_projectionTypes[traceIndex]; | 
					
						
							|  |  |  |             m_projectionTypes[traceIndex] = nextType; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |             TraceControl *traceControl = m_tracesControl[traceIndex]; | 
					
						
							|  |  |  |             TraceControl *nextTraceControl = m_tracesControl[nextControlIndex]; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |             traceControl->releaseProjector(); | 
					
						
							|  |  |  |             nextTraceControl->releaseProjector(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             m_tracesControl[nextControlIndex] = traceControl; | 
					
						
							|  |  |  |             m_tracesControl[traceIndex] = nextTraceControl; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |             GLScopeSettings::TraceData nextData = m_tracesData[nextDataIndex]; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |             m_tracesData[nextDataIndex] = m_tracesData[traceIndex]; | 
					
						
							|  |  |  |             m_tracesData[traceIndex] = nextData; | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |             traceControl = m_tracesControl[traceIndex]; | 
					
						
							|  |  |  |             nextTraceControl = m_tracesControl[nextControlIndex]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             traceControl->initProjector(m_tracesData[traceIndex].m_projectionType); | 
					
						
							|  |  |  |             nextTraceControl->initProjector(m_tracesData[nextDataIndex].m_projectionType); | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void resize(int traceSize) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_traceSize = traceSize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_traceSize > m_maxTraceSize) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |                 delete[] m_x0; | 
					
						
							|  |  |  |                 delete[] m_x1; | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |                 m_x0 = new float[2*m_traceSize*GLScopeSettings::m_maxNbTraces]; | 
					
						
							|  |  |  |                 m_x1 = new float[2*m_traceSize*GLScopeSettings::m_maxNbTraces]; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |                 m_maxTraceSize = m_traceSize; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             std::fill_n(m_x0, 2*m_traceSize*m_traces[0].size(), 0.0f); | 
					
						
							|  |  |  |             std::fill_n(m_x1, 2*m_traceSize*m_traces[0].size(), 0.0f); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |             for (unsigned int i = 0; i < m_traces[0].size(); i++) | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |             { | 
					
						
							|  |  |  |                 (m_traces[0])[i] = &m_x0[2*m_traceSize*i]; | 
					
						
							|  |  |  |                 (m_traces[1])[i] = &m_x1[2*m_traceSize*i]; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         uint32_t currentBufferIndex() const { return evenOddIndex? 0 : 1; } | 
					
						
							|  |  |  |         uint32_t size() const { return m_tracesControl.size(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void switchBuffer() | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |             evenOddIndex = !evenOddIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |             for (std::vector<TraceControl*>::iterator it = m_tracesControl.begin(); it != m_tracesControl.end(); ++it) { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 (*it)->m_traceCount[currentBufferIndex()] = 0; | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-19 12:38:20 +02:00
										 |  |  |         void resetControls() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             for (auto traceControl : m_tracesControl) { | 
					
						
							|  |  |  |                 traceControl->reset(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-16 01:06:15 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |         float *m_x0; | 
					
						
							|  |  |  |         float *m_x1; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |     class TriggerComparator | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         TriggerComparator() : m_level(0), m_reset(true) { | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             computeLevels(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         bool triggered(const Complex& s, TriggerCondition& triggerCondition) | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (triggerCondition.m_triggerData.m_triggerLevel != m_level) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_level = triggerCondition.m_triggerData.m_triggerLevel; | 
					
						
							|  |  |  |                 computeLevels(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             bool condition, trigger; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             if (triggerCondition.m_projector.getProjectionType() == Projector::ProjectionMagDB) { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |                 condition = triggerCondition.m_projector.run(s) > m_levelPowerDB; | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             } else if (triggerCondition.m_projector.getProjectionType() == Projector::ProjectionMagLin) { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |                 condition = triggerCondition.m_projector.run(s) > m_levelPowerLin; | 
					
						
							| 
									
										
										
										
											2020-11-02 22:06:29 +01:00
										 |  |  |             } else if (triggerCondition.m_projector.getProjectionType() == Projector::ProjectionMagSq) { | 
					
						
							|  |  |  |                 condition = triggerCondition.m_projector.run(s) > m_levelPowerLin; | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2017-02-13 22:52:42 +01:00
										 |  |  |                 condition = triggerCondition.m_projector.run(s) > m_level; | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-27 23:16:56 +02:00
										 |  |  |             if (condition) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                 if (triggerCondition.m_trues < triggerCondition.m_triggerData.m_triggerHoldoff) { | 
					
						
							| 
									
										
										
										
											2018-10-27 23:16:56 +02:00
										 |  |  |                     condition = false; | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                     triggerCondition.m_trues++; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                     triggerCondition.m_falses = 0; | 
					
						
							| 
									
										
										
										
											2018-10-27 23:16:56 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                 if (triggerCondition.m_falses < triggerCondition.m_triggerData.m_triggerHoldoff) { | 
					
						
							| 
									
										
										
										
											2018-10-27 23:16:56 +02:00
										 |  |  |                     condition = true; | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                     triggerCondition.m_falses++; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2018-10-28 01:38:58 +02:00
										 |  |  |                     triggerCondition.m_trues = 0; | 
					
						
							| 
									
										
										
										
											2018-10-27 23:16:56 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             if (m_reset) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 triggerCondition.m_prevCondition = condition; | 
					
						
							|  |  |  |                 m_reset = false; | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (triggerCondition.m_triggerData.m_triggerBothEdges) { | 
					
						
							|  |  |  |                 trigger = triggerCondition.m_prevCondition ? !condition : condition; // This is a XOR between bools
 | 
					
						
							|  |  |  |             } else if (triggerCondition.m_triggerData.m_triggerPositiveEdge) { | 
					
						
							|  |  |  |                 trigger = !triggerCondition.m_prevCondition && condition; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 trigger = triggerCondition.m_prevCondition && !condition; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //            if (trigger) {
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | //                qDebug("ScopeVis::triggered: %s/%s %f/%f",
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  | //                        triggerCondition.m_prevCondition ? "T" : "F",
 | 
					
						
							|  |  |  | //                        condition ? "T" : "F",
 | 
					
						
							|  |  |  | //                        triggerCondition.m_projector->run(s),
 | 
					
						
							|  |  |  | //                        triggerCondition.m_triggerData.m_triggerLevel);
 | 
					
						
							|  |  |  | //            }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             triggerCondition.m_prevCondition = condition; | 
					
						
							|  |  |  |             return trigger; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         void reset() { | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             m_reset = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |         void computeLevels() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_levelPowerLin = m_level + 1.0f; | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |             m_levelPowerDB = (100.0f * (m_level - 1.0f)); | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Real m_level; | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |         Real m_levelPowerDB; | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |         Real m_levelPowerLin; | 
					
						
							|  |  |  |         bool m_reset; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |     GLScopeInterface* m_glScope; | 
					
						
							| 
									
										
										
										
											2021-06-05 19:26:26 +02:00
										 |  |  |     SpectrumVis *m_spectrumVis; | 
					
						
							| 
									
										
										
										
											2023-07-09 01:19:39 +02:00
										 |  |  |     bool m_ssbSpectrum; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     GLScopeSettings m_settings; | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  |     MessageQueue m_inputMessageQueue; | 
					
						
							| 
									
										
										
										
											2017-02-07 18:50:08 +01:00
										 |  |  |     uint32_t m_preTriggerDelay;                    //!< Pre-trigger delay in number of samples
 | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |     uint32_t m_livePreTriggerDelay;                //!< Pre-trigger delay in number of samples in live mode
 | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |     std::vector<TriggerCondition*> m_triggerConditions; //!< Chain of triggers
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     uint32_t m_currentTriggerIndex;                //!< Index of current index in the chain
 | 
					
						
							|  |  |  |     uint32_t m_focusedTriggerIndex;                //!< Index of the trigger that has focus
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     TriggerState m_triggerState;                   //!< Current trigger state
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     Traces m_traces;                               //!< Displayable traces
 | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |     int m_focusedTraceIndex;                       //!< Index of the trace that has focus
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |     uint32_t m_nbStreams; | 
					
						
							| 
									
										
										
										
											2019-09-12 18:19:28 +02:00
										 |  |  |     uint32_t m_traceChunkSize;                     //!< Trace length unit size in number of samples
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     uint32_t m_traceSize;                          //!< Size of traces in number of samples
 | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |     uint32_t m_liveTraceSize;                      //!< Size of traces in number of samples in live mode
 | 
					
						
							| 
									
										
										
										
											2017-02-09 01:58:54 +01:00
										 |  |  |     int m_nbSamples;                               //!< Number of samples yet to process in one complex trace
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     uint32_t m_timeBase;                           //!< Trace display time divisor
 | 
					
						
							|  |  |  |     uint32_t m_timeOfsProMill;                     //!< Start trace shift in 1/1000 trace size
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  |     bool m_traceStart;                             //!< Trace is at start point
 | 
					
						
							| 
									
										
										
										
											2018-11-21 08:58:33 +01:00
										 |  |  |     int m_triggerLocation;                         //!< Trigger location from end point
 | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  |     int m_sampleRate;                              //!< Actual sample rate being used
 | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |     int m_liveSampleRate;                          //!< Sample rate in live mode
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     TraceBackDiscreteMemory m_traceDiscreteMemory; //!< Complex trace memory
 | 
					
						
							|  |  |  |     ConvertBuffers m_convertBuffers;               //!< Sample to Complex conversions
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     bool m_freeRun;                                //!< True if free running (trigger globally disabled)
 | 
					
						
							|  |  |  |     int m_maxTraceDelay;                           //!< Maximum trace delay
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |     TriggerComparator m_triggerComparator;         //!< Compares sample level to trigger level
 | 
					
						
							| 
									
										
										
										
											2022-09-15 21:59:42 +02:00
										 |  |  |     QRecursiveMutex m_mutex; | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |     Real m_projectorCache[(int) Projector::nbProjectionTypes]; | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |     bool m_triggerOneShot;                         //!< True when one shot mode is active
 | 
					
						
							|  |  |  |     bool m_triggerWaitForReset;                    //!< In one shot mode suspended until reset by UI
 | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |     uint32_t m_currentTraceMemoryIndex;            //!< The current index of trace in memory (0: current)
 | 
					
						
							| 
									
										
										
										
											2017-02-07 18:50:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void applySettings(const GLScopeSettings& settings, bool force = false); | 
					
						
							|  |  |  |     void addTrace(const GLScopeSettings::TraceData& traceData); | 
					
						
							|  |  |  |     void changeTrace(const GLScopeSettings::TraceData& traceData, uint32_t traceIndex); | 
					
						
							|  |  |  |     void removeTrace(uint32_t traceIndex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     void moveTrace(uint32_t traceIndex, bool upElseDown); | 
					
						
							|  |  |  |     void focusOnTrace(uint32_t traceIndex); | 
					
						
							|  |  |  |     void addTrigger(const GLScopeSettings::TriggerData& triggerData); | 
					
						
							|  |  |  |     void changeTrigger(const GLScopeSettings::TriggerData& triggerData, uint32_t triggerIndex); | 
					
						
							|  |  |  |     void removeTrigger(uint32_t triggerIndex); | 
					
						
							|  |  |  |     void moveTrigger(uint32_t triggerIndex, bool upElseDown); | 
					
						
							|  |  |  |     void focusOnTrigger(uint32_t triggerIndex); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-02 18:18:37 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Moves on to the next trigger if any or increments trigger count if in repeat mode | 
					
						
							|  |  |  |      * - If not final it returns true | 
					
						
							|  |  |  |      * - If final i.e. signal is actually triggerd it returns false | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     bool nextTrigger(); //!< Returns true if not final
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 22:22:27 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Process a sample trace which length is at most the trace length (m_traceSize) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     void processTrace(const std::vector<ComplexVector::const_iterator>& vbegin, int length, int& triggerPointToEnd); | 
					
						
							| 
									
										
										
										
											2017-02-08 22:22:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * process a trace in memory at current trace index in memory | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void processMemoryTrace(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-02 18:18:37 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Process traces from complex trace memory buffer. | 
					
						
							|  |  |  |      * - if finished it returns the number of unprocessed samples left in the buffer | 
					
						
							|  |  |  |      * - if not finished it returns -1 | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     int processTraces(const std::vector<ComplexVector::const_iterator>& vbegin, int length, bool traceBack = false); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Get maximum trace delay | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void updateMaxTraceDelay(); | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |      * Initialize trace buffers | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     void initTraceBuffers(); | 
					
						
							| 
									
										
										
										
											2017-02-10 18:28:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Calculate trigger levels on display | 
					
						
							|  |  |  |      * - every time a trigger condition focus changes TBD | 
					
						
							|  |  |  |      * - every time the focused trigger condition changes its projection type or level | 
					
						
							|  |  |  |      * - every time a trace data changes: projection type, amp, offset | 
					
						
							|  |  |  |      * - every time a trace data is added or removed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |     void computeDisplayTriggerLevels(); | 
					
						
							| 
									
										
										
										
											2017-02-25 04:35:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Update glScope display | 
					
						
							|  |  |  |      * - Live trace: call glScipe update method | 
					
						
							|  |  |  |      * - Trace in memory: call process memory trace | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Set the actual sample rate | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void setSampleRate(int sampleRate); | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Set the traces size | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |     void setTraceSize(uint32_t traceSize, bool emitSignal = false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Set the pre trigger delay | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void setPreTriggerDelay(uint32_t preTriggerDelay, bool emitSignal = false); | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private slots: | 
					
						
							|  |  |  |     void handleInputMessages(); | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* SDRBASE_DSP_SCOPEVISNG_H_ */
 |