| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2017 F4EXB                                                      //
 | 
					
						
							|  |  |  | // written by Edouard Griffiths                                                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							| 
									
										
										
										
											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/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #include <QtGlobal>
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2017-02-13 03:23:29 +01:00
										 |  |  | #include <QMutexLocker>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:22:39 +02:00
										 |  |  | #include "scopevis.h"
 | 
					
						
							| 
									
										
										
										
											2021-06-05 19:26:26 +02:00
										 |  |  | #include "spectrumvis.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  | #include "dsp/dspcommands.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  | #include "dsp/glscopeinterface.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgConfigureScopeVis, Message) | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisAddTrigger, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisChangeTrigger, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisRemoveTrigger, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisMoveTrigger, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisFocusOnTrigger, Message) | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisAddTrace, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisChangeTrace, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisRemoveTrace, Message) | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisMoveTrace, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisFocusOnTrace, Message) | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisNGOneShot, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(ScopeVis::MsgScopeVisNGMemoryTrace, Message) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  | ScopeVis::ScopeVis() : | 
					
						
							|  |  |  |     m_glScope(nullptr), | 
					
						
							| 
									
										
										
										
											2021-06-05 19:26:26 +02:00
										 |  |  |     m_spectrumVis(nullptr), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_preTriggerDelay(0), | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |     m_livePreTriggerDelay(0), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_currentTriggerIndex(0), | 
					
						
							| 
									
										
										
										
											2017-02-13 11:30:40 +01:00
										 |  |  |     m_focusedTriggerIndex(0), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_triggerState(TriggerUntriggered), | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |     m_focusedTraceIndex(0), | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |     m_nbStreams(1), | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |     m_traceChunkSize(GLScopeSettings::m_traceChunkDefaultSize), | 
					
						
							|  |  |  |     m_traceSize(GLScopeSettings::m_traceChunkDefaultSize), | 
					
						
							|  |  |  |     m_liveTraceSize(GLScopeSettings::m_traceChunkDefaultSize), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_nbSamples(0), | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     m_timeBase(1), | 
					
						
							|  |  |  |     m_timeOfsProMill(0), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_traceStart(true), | 
					
						
							| 
									
										
										
										
											2019-06-14 16:58:09 +02:00
										 |  |  |     m_triggerLocation(0), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_sampleRate(0), | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |     m_liveSampleRate(0), | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |     m_traceDiscreteMemory(GLScopeSettings::m_nbTraceMemories), | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     m_freeRun(true), | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |     m_maxTraceDelay(0), | 
					
						
							|  |  |  |     m_triggerOneShot(false), | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |     m_triggerWaitForReset(false), | 
					
						
							|  |  |  |     m_currentTraceMemoryIndex(0) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |     setObjectName("ScopeVis"); | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |     m_traceDiscreteMemory.resize(GLScopeSettings::m_traceChunkDefaultSize); // arbitrary
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     m_convertBuffers.resize(GLScopeSettings::m_traceChunkDefaultSize); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |     for (int i = 0; i < (int) Projector::nbProjectionTypes; i++) { | 
					
						
							| 
									
										
										
										
											2018-02-24 10:29:27 +01:00
										 |  |  |         m_projectorCache[i] = 0.0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  |     connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | ScopeVis::~ScopeVis() | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  |     disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |     for (std::vector<TriggerCondition*>::iterator it = m_triggerConditions.begin(); it != m_triggerConditions.end(); ++ it) { | 
					
						
							|  |  |  |         delete *it; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  | void ScopeVis::setGLScope(GLScopeInterface* glScope) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_glScope = glScope; | 
					
						
							|  |  |  |     m_glScope->setTraces(&m_traces.m_tracesData, &m_traces.m_traces[0]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  | void ScopeVis::setLiveRate(int sampleRate) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |     m_liveSampleRate = sampleRate; | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_currentTraceMemoryIndex == 0) { // update only in live mode
 | 
					
						
							| 
									
										
										
										
											2019-11-24 10:12:58 +01:00
										 |  |  |         setSampleRate(m_liveSampleRate); | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::setSampleRate(int sampleRate) | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-20 10:41:49 +02:00
										 |  |  |     qDebug("ScopeVis::setSampleRate: %d S/s", sampleRate); | 
					
						
							| 
									
										
										
										
											2018-10-16 00:08:33 +02:00
										 |  |  |     m_sampleRate = sampleRate; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_glScope) { | 
					
						
							|  |  |  |         m_glScope->setSampleRate(m_sampleRate); | 
					
						
							| 
									
										
										
										
											2017-01-29 22:52:38 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  | void ScopeVis::setTraceSize(uint32_t traceSize, bool emitSignal) | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_traceSize = traceSize; | 
					
						
							|  |  |  |     m_traces.resize(m_traceSize); | 
					
						
							|  |  |  |     m_traceDiscreteMemory.resize(m_traceSize); | 
					
						
							|  |  |  |     initTraceBuffers(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_glScope) { | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |         m_glScope->setTraceSize(m_traceSize, emitSignal); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ScopeVis::setPreTriggerDelay(uint32_t preTriggerDelay, bool emitSignal) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_preTriggerDelay = preTriggerDelay; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_glScope) { | 
					
						
							|  |  |  |         m_glScope->setTriggerPre(m_preTriggerDelay, emitSignal); | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-12 10:47:03 +02:00
										 |  |  | void ScopeVis::setNbStreams(uint32_t nbStreams) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QMutexLocker configLocker(&m_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_nbStreams != nbStreams) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_traceDiscreteMemory.setNbStreams(nbStreams); | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         m_convertBuffers.setNbStreams(nbStreams); | 
					
						
							| 
									
										
										
										
											2021-06-12 10:47:03 +02:00
										 |  |  |         m_nbStreams = nbStreams; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  | void ScopeVis::configure( | 
					
						
							|  |  |  |     uint32_t traceSize, | 
					
						
							|  |  |  |     uint32_t timeBase, | 
					
						
							|  |  |  |     uint32_t timeOfsProMill, | 
					
						
							|  |  |  |     uint32_t triggerPre, | 
					
						
							|  |  |  |     bool freeRun | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |     QMutexLocker configLocker(&m_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     if (m_traceSize != traceSize) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |         setTraceSize(traceSize); | 
					
						
							| 
									
										
										
										
											2021-12-01 00:20:14 +01:00
										 |  |  |         m_settings.m_traceLenMult = traceSize / getTraceChunkSize(); | 
					
						
							| 
									
										
										
										
											2021-06-19 12:38:20 +02:00
										 |  |  |         m_triggerState = TriggerUntriggered; | 
					
						
							|  |  |  |         m_traces.resetControls(); | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_timeBase != timeBase) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_timeBase = timeBase; | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |         m_settings.m_time = timeBase; | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (m_glScope) { | 
					
						
							|  |  |  |             m_glScope->setTimeBase(m_timeBase); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_timeOfsProMill != timeOfsProMill) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_timeOfsProMill = timeOfsProMill; | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |         m_settings.m_timeOfs = timeOfsProMill; | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (m_glScope) { | 
					
						
							|  |  |  |             m_glScope->setTimeOfsProMill(m_timeOfsProMill); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     if (m_preTriggerDelay != triggerPre) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |         setPreTriggerDelay(triggerPre); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |         m_settings.m_trigPre = triggerPre; | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (freeRun != m_freeRun) { | 
					
						
							|  |  |  |         m_freeRun = freeRun; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     qDebug() << "ScopeVis::configure:" | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  |         << " m_nbStreams: " << m_nbStreams | 
					
						
							|  |  |  |         << " m_traceSize: " << m_traceSize | 
					
						
							|  |  |  |         << " m_timeOfsProMill: " << m_timeOfsProMill | 
					
						
							|  |  |  |         << " m_preTriggerDelay: " << m_preTriggerDelay | 
					
						
							|  |  |  |         << " m_freeRun: " << m_freeRun; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ((m_glScope) && (m_currentTraceMemoryIndex > 0)) { | 
					
						
							|  |  |  |         processMemoryTrace(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-07 21:57:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | void ScopeVis::configure( | 
					
						
							|  |  |  |     GLScopeSettings::DisplayMode displayMode, | 
					
						
							|  |  |  |     uint32_t traceIntensity, | 
					
						
							|  |  |  |     uint32_t gridIntensity | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QMutexLocker configLocker(&m_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_settings.m_displayMode = displayMode; | 
					
						
							|  |  |  |     m_settings.m_traceIntensity = traceIntensity; | 
					
						
							|  |  |  |     m_settings.m_gridIntensity = gridIntensity; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     qDebug() << "ScopeVis::configure:" | 
					
						
							|  |  |  |         << " displayMode: " << displayMode | 
					
						
							|  |  |  |         << " traceIntensity: " << traceIntensity | 
					
						
							|  |  |  |         << " gridIntensity: " << gridIntensity; | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  | void ScopeVis::addTrace(const GLScopeSettings::TraceData& traceData) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |     qDebug() << "ScopeVis::addTrace:" | 
					
						
							| 
									
										
										
										
											2021-08-09 02:21:12 +02:00
										 |  |  |             << " trace: " << m_traces.size() | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |             << " m_streamIndex: " << traceData.m_streamIndex | 
					
						
							| 
									
										
										
										
											2017-02-20 22:19:50 +01:00
										 |  |  |             << " m_amp: " << traceData.m_amp | 
					
						
							|  |  |  |             << " m_ofs: " << traceData.m_ofs | 
					
						
							|  |  |  |             << " m_traceDelay: " << traceData.m_traceDelay; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     m_traces.addTrace(traceData, m_traceSize); | 
					
						
							|  |  |  |     initTraceBuffers(); | 
					
						
							|  |  |  |     updateMaxTraceDelay(); | 
					
						
							|  |  |  |     computeDisplayTriggerLevels(); | 
					
						
							|  |  |  |     updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     m_settings.m_tracesData.push_back(traceData); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  | void ScopeVis::changeTrace(const GLScopeSettings::TraceData& traceData, uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |     qDebug() << "ScopeVis::changeTrace:" | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             << " trace: " << traceIndex | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |             << " m_streamIndex: " << traceData.m_streamIndex | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             << " m_amp: " << traceData.m_amp | 
					
						
							| 
									
										
										
										
											2017-02-17 01:54:55 +01:00
										 |  |  |             << " m_ofs: " << traceData.m_ofs | 
					
						
							|  |  |  |             << " m_traceDelay: " << traceData.m_traceDelay; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     bool doComputeTriggerLevelsOnDisplay = m_traces.isVerticalDisplayChange(traceData, traceIndex); | 
					
						
							|  |  |  |     m_traces.changeTrace(traceData, traceIndex); | 
					
						
							|  |  |  |     updateMaxTraceDelay(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (doComputeTriggerLevelsOnDisplay) { | 
					
						
							|  |  |  |         computeDisplayTriggerLevels(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (traceIndex < m_settings.m_tracesData.size()) { | 
					
						
							|  |  |  |         m_settings.m_tracesData[traceIndex] = traceData; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::removeTrace(uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |     qDebug() << "ScopeVis::removeTrace:" | 
					
						
							| 
									
										
										
										
											2017-02-20 22:19:50 +01:00
										 |  |  |             << " trace: " << traceIndex; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     m_traces.removeTrace(traceIndex); | 
					
						
							|  |  |  |     updateMaxTraceDelay(); | 
					
						
							|  |  |  |     computeDisplayTriggerLevels(); | 
					
						
							|  |  |  |     updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     unsigned int iDest = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (unsigned int iSource = 0; iSource < m_settings.m_tracesData.size(); iSource++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (iSource != traceIndex) { | 
					
						
							|  |  |  |             m_settings.m_tracesData[iDest++] = m_settings.m_tracesData[iSource]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-12 10:16:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_settings.m_tracesData.size() != 0) { | 
					
						
							|  |  |  |         m_settings.m_tracesData.pop_back(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::moveTrace(uint32_t traceIndex, bool upElseDown) | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |     qDebug() << "ScopeVis::moveTrace:" | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |             << " trace: " << traceIndex | 
					
						
							|  |  |  |             << " up: " << upElseDown; | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     m_traces.moveTrace(traceIndex, upElseDown); | 
					
						
							|  |  |  |     computeDisplayTriggerLevels(); | 
					
						
							|  |  |  |     updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int nextTraceIndex = (traceIndex + (upElseDown ? 1 : -1)) % m_settings.m_tracesData.size(); | 
					
						
							|  |  |  |     GLScopeSettings::TraceData nextTraceData = m_settings.m_tracesData[nextTraceIndex]; | 
					
						
							|  |  |  |     m_settings.m_tracesData[nextTraceIndex] = m_settings.m_tracesData[traceIndex]; | 
					
						
							|  |  |  |     m_settings.m_tracesData[traceIndex] = nextTraceData; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::focusOnTrace(uint32_t traceIndex) | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     if (traceIndex < m_traces.m_tracesData.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_focusedTraceIndex = traceIndex; | 
					
						
							|  |  |  |         computeDisplayTriggerLevels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_glScope) { | 
					
						
							|  |  |  |             m_glScope->setFocusedTraceIndex(m_focusedTraceIndex); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         updateGLScopeDisplay(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  | void ScopeVis::addTrigger(const GLScopeSettings::TriggerData& triggerData) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     m_triggerConditions.push_back(new TriggerCondition(triggerData)); | 
					
						
							|  |  |  |     m_triggerConditions.back()->initProjector(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  |     m_settings.m_triggersData.push_back(triggerData); | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  | void ScopeVis::changeTrigger(const GLScopeSettings::TriggerData& triggerData, uint32_t triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     if (triggerIndex < m_triggerConditions.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_triggerConditions[triggerIndex]->setData(triggerData); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (triggerIndex == m_focusedTriggerIndex) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             computeDisplayTriggerLevels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_glScope) { | 
					
						
							|  |  |  |                 m_glScope->setFocusedTriggerData(m_triggerConditions[m_focusedTriggerIndex]->m_triggerData); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             updateGLScopeDisplay(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (triggerIndex < m_settings.m_triggersData.size()) { | 
					
						
							|  |  |  |         m_settings.m_triggersData[triggerIndex] = triggerData; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::removeTrigger(uint32_t triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-01-30 00:36:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     if (triggerIndex < m_triggerConditions.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         TriggerCondition *triggerCondition = m_triggerConditions[triggerIndex]; | 
					
						
							|  |  |  |         m_triggerConditions.erase(m_triggerConditions.begin() + triggerIndex); | 
					
						
							|  |  |  |         delete triggerCondition; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     unsigned int iDest = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (unsigned int iSource = 0; iSource < m_settings.m_triggersData.size(); iSource++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (iSource != triggerIndex) { | 
					
						
							|  |  |  |             m_settings.m_triggersData[iDest++] = m_settings.m_triggersData[iSource]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-12 10:16:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_settings.m_triggersData.size() != 0) { | 
					
						
							|  |  |  |         m_settings.m_triggersData.pop_back(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::moveTrigger(uint32_t triggerIndex, bool upElseDown) | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     int nextTriggerIndex = (triggerIndex + (upElseDown ? 1 : -1)) % m_triggerConditions.size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     TriggerCondition *nextTrigger = m_triggerConditions[nextTriggerIndex]; | 
					
						
							|  |  |  |     m_triggerConditions[nextTriggerIndex] = m_triggerConditions[triggerIndex]; | 
					
						
							|  |  |  |     m_triggerConditions[triggerIndex] = nextTrigger; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     computeDisplayTriggerLevels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_glScope) { | 
					
						
							|  |  |  |         m_glScope->setFocusedTriggerData(m_triggerConditions[m_focusedTriggerIndex]->m_triggerData); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     updateGLScopeDisplay(); | 
					
						
							| 
									
										
										
										
											2021-06-11 00:21:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int nextTriggerIndexSettings = (triggerIndex + (upElseDown ? 1 : -1)) % m_settings.m_triggersData.size(); | 
					
						
							|  |  |  |     GLScopeSettings::TriggerData nextTriggerData = m_settings.m_triggersData[nextTriggerIndexSettings]; | 
					
						
							|  |  |  |     m_settings.m_triggersData[nextTriggerIndexSettings] = m_settings.m_triggersData[triggerIndex]; | 
					
						
							|  |  |  |     m_settings.m_triggersData[triggerIndex] = nextTriggerData; | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::focusOnTrigger(uint32_t triggerIndex) | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     if (triggerIndex < m_triggerConditions.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_focusedTriggerIndex = triggerIndex; | 
					
						
							|  |  |  |         computeDisplayTriggerLevels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_glScope) { | 
					
						
							|  |  |  |             m_glScope->setFocusedTriggerData(m_triggerConditions[m_focusedTriggerIndex]->m_triggerData); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         updateGLScopeDisplay(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::setOneShot(bool oneShot) | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     Message* cmd = MsgScopeVisNGOneShot::create(oneShot); | 
					
						
							|  |  |  |     getInputMessageQueue()->push(cmd); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::setMemoryIndex(uint32_t memoryIndex) | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     Message* cmd = MsgScopeVisNGMemoryTrace::create(memoryIndex); | 
					
						
							|  |  |  |     getInputMessageQueue()->push(cmd); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  | void ScopeVis::feed(const std::vector<SampleVector::const_iterator>& vbegin, int nbSamples) | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     std::vector<ComplexVector::const_iterator> vcbegin; | 
					
						
							|  |  |  |     std::vector<ComplexVector>& convertBuffers = m_convertBuffers.getBuffers(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (nbSamples > (int) m_convertBuffers.size()) { | 
					
						
							|  |  |  |         m_convertBuffers.resize(nbSamples); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (unsigned int s = 0; s < vbegin.size(); s++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::transform( | 
					
						
							|  |  |  |             vbegin[s], | 
					
						
							|  |  |  |             vbegin[s] + nbSamples, | 
					
						
							|  |  |  |             convertBuffers[s].begin(), | 
					
						
							|  |  |  |             [](const Sample& s) -> Complex { | 
					
						
							|  |  |  |                 return Complex{s.m_real / SDR_RX_SCALEF, s.m_imag / SDR_RX_SCALEF}; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         vcbegin.push_back(convertBuffers[s].begin()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     feed(vcbegin, nbSamples); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ScopeVis::feed(const std::vector<ComplexVector::const_iterator>& vbegin, int nbSamples) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  |     if (vbegin.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-21 00:47:17 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_currentTraceMemoryIndex > 0) { // in memory mode live trace is suspended
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!m_mutex.tryLock(0)) { // prevent conflicts with configuration process
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 07:51:31 +02:00
										 |  |  |     if (m_triggerWaitForReset) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_triggerLocation = 0; | 
					
						
							|  |  |  |         m_mutex.unlock(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     if (m_freeRun) { | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |         m_triggerLocation = nbSamples; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (m_triggerState == TriggerTriggered) { | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |         m_triggerLocation = nbSamples; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (m_triggerState == TriggerUntriggered) { | 
					
						
							| 
									
										
										
										
											2018-11-21 08:58:33 +01:00
										 |  |  |         m_triggerLocation = 0; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |         m_triggerLocation = nbSamples; | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |     // ComplexVector::const_iterator begin(vbegin[0]);
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     //const SampleVector::const_iterator end = vbegin[0] + nbSamples;
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     int triggerPointToEnd; | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     int remainder = nbSamples; | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     std::vector<ComplexVector::const_iterator> nvbegin(vbegin); | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |     //while (begin < end)
 | 
					
						
							|  |  |  |     while (remainder > 0) | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |         if (remainder < (int) m_traceSize) // buffer smaller than trace size (end - bagin) < m_traceSize
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             triggerPointToEnd = -1; | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             processTrace(nvbegin, remainder, triggerPointToEnd); // use all buffer
 | 
					
						
							| 
									
										
										
										
											2018-11-21 11:08:43 +01:00
										 |  |  |             m_triggerLocation = triggerPointToEnd < 0 ? 0 : triggerPointToEnd; // trim negative values
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             m_triggerLocation = m_triggerLocation > remainder ? remainder : m_triggerLocation; // trim past begin values
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:47:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             remainder = 0; // effectively breaks out the loop
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-11-21 00:47:17 +01:00
										 |  |  |         else // trace size fits in buffer
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-02-09 02:16:43 +01:00
										 |  |  |             triggerPointToEnd = -1; | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             processTrace(nvbegin, m_traceSize, triggerPointToEnd); // use part of buffer to fit trace size
 | 
					
						
							| 
									
										
										
										
											2018-11-21 11:08:43 +01:00
										 |  |  |             //m_triggerPoint = begin + m_traceSize - triggerPointToEnd;
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             m_triggerLocation = remainder + m_traceSize - triggerPointToEnd; // should always refer to end iterator
 | 
					
						
							| 
									
										
										
										
											2018-11-21 11:08:43 +01:00
										 |  |  |             m_triggerLocation = m_triggerLocation < 0 ? 0 : m_triggerLocation; // trim negative values
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             m_triggerLocation = m_triggerLocation > remainder ? remainder : m_triggerLocation; // trim past begin values
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (auto begin : nvbegin) { | 
					
						
							|  |  |  |                 begin += m_traceSize; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-21 00:47:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-31 14:30:10 +02:00
										 |  |  |             remainder -= m_traceSize; | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-13 03:23:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2017-02-08 22:22:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::processMemoryTrace() | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |     if ((m_currentTraceMemoryIndex > 0) && (m_currentTraceMemoryIndex <= m_traceDiscreteMemory.maxIndex())) | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-10-02 05:18:34 +02:00
										 |  |  |         int traceMemoryIndex = m_traceDiscreteMemory.currentIndex() - m_currentTraceMemoryIndex; // actual index in memory bank
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (traceMemoryIndex < 0) { | 
					
						
							| 
									
										
										
										
											2021-05-30 10:49:52 +02:00
										 |  |  |             traceMemoryIndex += GLScopeSettings::m_nbTraceMemories; | 
					
						
							| 
									
										
										
										
											2018-10-02 05:18:34 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         std::vector<ComplexVector::const_iterator> mend; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         m_traceDiscreteMemory.getEndPointAt(traceMemoryIndex, mend); | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         std::vector<ComplexVector::const_iterator> mbegin(mend.size()); | 
					
						
							| 
									
										
										
										
											2021-06-07 00:26:31 +02:00
										 |  |  |         TraceBackDiscreteMemory::moveIt(mend, mbegin, -m_traceSize); | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         std::vector<ComplexVector::const_iterator> mbegin_tb(mbegin.size()); | 
					
						
							| 
									
										
										
										
											2021-06-07 00:26:31 +02:00
										 |  |  |         TraceBackDiscreteMemory::moveIt(mbegin, mbegin_tb, -m_maxTraceDelay); | 
					
						
							| 
									
										
										
										
											2017-02-24 23:24:47 +01:00
										 |  |  |         m_nbSamples = m_traceSize + m_maxTraceDelay; | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |         processTraces(mbegin_tb, m_maxTraceDelay, true); // traceback
 | 
					
						
							|  |  |  |         processTraces(mbegin, m_traceSize, false); | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  | void ScopeVis::processTrace(const std::vector<ComplexVector::const_iterator>& vcbegin, int length, int& triggerPointToEnd) | 
					
						
							| 
									
										
										
										
											2017-02-08 22:22:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     std::vector<ComplexVector::const_iterator> vbegin(vcbegin); | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |     int firstRemainder = length; | 
					
						
							| 
									
										
										
										
											2017-02-08 22:22:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     // memory storage
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |     m_traceDiscreteMemory.writeCurrent(vbegin, length); | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 18:35:18 +02:00
										 |  |  |     // Removed in 4.2.4 may cause trigger bug
 | 
					
						
							|  |  |  |     // if (m_traceDiscreteMemory.current().absoluteFill() < m_traceSize)
 | 
					
						
							|  |  |  |     // {
 | 
					
						
							|  |  |  |     //     return; // not enough samples in memory
 | 
					
						
							|  |  |  |     // }
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     // trigger process
 | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  |     if ((m_freeRun) || (m_triggerConditions.size() == 0)) // immediate re-trigger
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-09 01:58:54 +01:00
										 |  |  |         if (m_triggerState == TriggerUntriggered) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_traceStart = true; // start trace processing
 | 
					
						
							|  |  |  |             m_nbSamples = m_traceSize + m_maxTraceDelay; | 
					
						
							|  |  |  |             m_triggerState = TriggerTriggered; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |     else if ((m_triggerState == TriggerUntriggered) || (m_triggerState == TriggerDelay)) // look for trigger or past trigger in delay mode
 | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |         TriggerCondition* triggerCondition = m_triggerConditions[m_currentTriggerIndex]; // current trigger condition
 | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |         int processed = 0; | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |         while (firstRemainder > 0) | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (m_triggerState == TriggerDelay) // delayed trigger
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                 if (triggerCondition->m_triggerDelayCount > 0) // skip samples during delay period
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |                     for (auto begin : vbegin) { | 
					
						
							|  |  |  |                         begin += triggerCondition->m_triggerDelayCount; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |                     processed += triggerCondition->m_triggerDelayCount; | 
					
						
							|  |  |  |                     firstRemainder -= triggerCondition->m_triggerDelayCount; | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                     triggerCondition->m_triggerDelayCount = 0; | 
					
						
							|  |  |  |                     continue; | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                 else // process trigger
 | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                     if (nextTrigger()) // move to next trigger and keep going
 | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         m_triggerComparator.reset(); | 
					
						
							|  |  |  |                         m_triggerState = TriggerUntriggered; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |                         for (auto begin : vbegin) { | 
					
						
							|  |  |  |                             ++begin; | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |                         ++processed; | 
					
						
							|  |  |  |                         --firstRemainder; | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                         continue; | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     else // this was the last trigger then start trace
 | 
					
						
							|  |  |  |                     { | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                         m_traceStart = true; // start trace processing
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                         m_nbSamples = m_traceSize + m_maxTraceDelay; | 
					
						
							|  |  |  |                         m_triggerComparator.reset(); | 
					
						
							|  |  |  |                         m_triggerState = TriggerTriggered; | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |                         triggerPointToEnd = firstRemainder; | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             uint32_t triggerStreamIndex = triggerCondition->m_triggerData.m_streamIndex; | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |             const Complex& s = *vbegin[triggerStreamIndex]; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (m_triggerComparator.triggered(s, *triggerCondition)) // matched the current trigger
 | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |                 if (triggerCondition->m_triggerData.m_triggerDelay > 0) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     triggerCondition->m_triggerDelayCount = triggerCondition->m_triggerData.m_triggerDelay; // initialize delayed samples counter
 | 
					
						
							|  |  |  |                     m_triggerState = TriggerDelay; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |                     for (auto begin : vbegin) { | 
					
						
							|  |  |  |                         ++begin; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |                     ++processed; | 
					
						
							|  |  |  |                     --firstRemainder; | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (nextTrigger()) // move to next trigger and keep going
 | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     m_triggerComparator.reset(); | 
					
						
							|  |  |  |                     m_triggerState = TriggerUntriggered; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else // this was the last trigger then start trace
 | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     m_traceStart = true; // start of trace processing
 | 
					
						
							|  |  |  |                     m_nbSamples = m_traceSize + m_maxTraceDelay; | 
					
						
							|  |  |  |                     m_triggerComparator.reset(); | 
					
						
							|  |  |  |                     m_triggerState = TriggerTriggered; | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |                     triggerPointToEnd = firstRemainder; | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-09 00:00:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             for (auto begin : vbegin) { | 
					
						
							|  |  |  |                 ++begin; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |             ++processed; | 
					
						
							|  |  |  |             --firstRemainder; | 
					
						
							| 
									
										
										
										
											2018-10-25 13:12:49 +02:00
										 |  |  |         } // look for trigger
 | 
					
						
							|  |  |  |     } // untriggered or delayed
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     // trace process
 | 
					
						
							| 
									
										
										
										
											2017-02-13 00:17:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     if (m_triggerState == TriggerTriggered) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-10-25 14:50:29 +02:00
										 |  |  |         int remainder; | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |         int count = firstRemainder; // number of samples in traceback buffer past the current point
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         std::vector<ComplexVector::const_iterator> mend; | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         m_traceDiscreteMemory.getCurrent(mend); | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |         std::vector<ComplexVector::const_iterator> mbegin(mend.size()); | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |         TraceBackDiscreteMemory::moveIt(mend, mbegin, -count); | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 13:54:33 +02:00
										 |  |  |         if (m_traceStart) // start of trace processing
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-10-27 19:45:42 +02:00
										 |  |  |             // if trace time is 1s or more the display is progressive so we have to clear it first
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             float traceTime = ((float) m_traceSize) / m_sampleRate; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (traceTime >= 1.0f) { | 
					
						
							|  |  |  |                 initTraceBuffers(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 14:50:29 +02:00
										 |  |  |             // process until begin point
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             if (m_maxTraceDelay > 0) | 
					
						
							|  |  |  |             { // trace back
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |                 std::vector<ComplexVector::const_iterator> tbegin(mbegin.size()); | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |                 TraceBackDiscreteMemory::moveIt(mbegin, tbegin, - m_preTriggerDelay - m_maxTraceDelay); | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                 processTraces(tbegin, m_maxTraceDelay, true); | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             if (m_preTriggerDelay > 0) | 
					
						
							|  |  |  |             { // pre-trigger
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |                 std::vector<ComplexVector::const_iterator> tbegin(mbegin.size()); | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |                 TraceBackDiscreteMemory::moveIt(mbegin, tbegin, -m_preTriggerDelay); | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                 processTraces(tbegin, m_preTriggerDelay); | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 14:50:29 +02:00
										 |  |  |             // process the rest of the trace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |             remainder = processTraces(mbegin, count); | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |             m_traceStart = false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-10-25 14:50:29 +02:00
										 |  |  |         else // process the current trace
 | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |             remainder = processTraces(mbegin, count); | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         if (remainder >= 0) // finished
 | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-06 11:12:27 +02:00
										 |  |  |             TraceBackDiscreteMemory::moveIt(mend, mbegin, -remainder); | 
					
						
							|  |  |  |             m_traceDiscreteMemory.setCurrentEndPoint(mbegin); | 
					
						
							| 
									
										
										
										
											2018-10-27 18:19:08 +02:00
										 |  |  |             m_traceDiscreteMemory.store(m_preTriggerDelay+remainder); // next memory trace.
 | 
					
						
							| 
									
										
										
										
											2017-02-07 07:45:42 +01:00
										 |  |  |             m_triggerState = TriggerUntriggered; | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |             m_triggerWaitForReset = m_triggerOneShot; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 00:17:59 +01:00
										 |  |  |             //if (m_glScope) m_glScope->incrementTraceCounter();
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 00:04:19 +01:00
										 |  |  |             // process remainder recursively
 | 
					
						
							|  |  |  |             if (remainder != 0) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2017-02-09 02:16:43 +01:00
										 |  |  |                 int mTriggerPointToEnd = -1; | 
					
						
							| 
									
										
										
										
											2021-06-07 00:05:37 +02:00
										 |  |  |                 processTrace(mbegin, remainder, mTriggerPointToEnd); | 
					
						
							| 
									
										
										
										
											2017-02-09 01:58:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 02:16:43 +01:00
										 |  |  |                 if (mTriggerPointToEnd >= 0) { | 
					
						
							|  |  |  |                     triggerPointToEnd = mTriggerPointToEnd; | 
					
						
							| 
									
										
										
										
											2017-02-09 01:58:54 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |                 //qDebug("ScopeVis::processTrace: process remainder recursively (%d %d)", mpoint, mTriggerPoint);
 | 
					
						
							| 
									
										
										
										
											2017-02-09 00:04:19 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | bool ScopeVis::nextTrigger() | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |     TriggerCondition *triggerCondition = m_triggerConditions[m_currentTriggerIndex]; // current trigger condition
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |     if (triggerCondition->m_triggerData.m_triggerRepeat > 0) | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |         if (triggerCondition->m_triggerCounter < triggerCondition->m_triggerData.m_triggerRepeat) | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |             triggerCondition->m_triggerCounter++; | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |             return true; // not final keep going
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |             triggerCondition->m_triggerCounter = 0; // reset for next time
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     if (m_triggerConditions.size() == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_currentTriggerIndex = 0; | 
					
						
							|  |  |  |         return false; // final
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (m_currentTriggerIndex < m_triggerConditions.size() - 1) // check if next trigger is available
 | 
					
						
							| 
									
										
										
										
											2017-02-09 18:45:06 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         m_currentTriggerIndex++; | 
					
						
							|  |  |  |         return true; // not final keep going
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // now this is really finished
 | 
					
						
							|  |  |  |         m_currentTriggerIndex = 0; | 
					
						
							|  |  |  |         return false; // final
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-01 18:31:16 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  | int ScopeVis::processTraces(const std::vector<ComplexVector::const_iterator>& vcbegin, int ilength, bool traceBack) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |     std::vector<ComplexVector::const_iterator> vbegin(vcbegin); | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     uint32_t shift = (m_timeOfsProMill / 1000.0) * m_traceSize; | 
					
						
							|  |  |  |     uint32_t length = m_traceSize / m_timeBase; | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |     int remainder = ilength; | 
					
						
							| 
									
										
										
										
											2021-06-25 10:31:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_spectrumVis) { | 
					
						
							|  |  |  |         m_spectrumVis->feed(vcbegin[0], vcbegin[0] + ilength, false); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-05 19:26:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |     while ((remainder > 0) && (m_nbSamples > 0)) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |         std::vector<TraceControl*>::iterator itCtl = m_traces.m_tracesControl.begin(); | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |         std::vector<GLScopeSettings::TraceData>::iterator itData = m_traces.m_tracesData.begin(); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         std::vector<float *>::iterator itTrace = m_traces.m_traces[m_traces.currentBufferIndex()].begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 10:03:09 +02:00
										 |  |  |         for (unsigned int ti = 0; itCtl != m_traces.m_tracesControl.end(); ++itCtl, ++itData, ++itTrace, ti++) | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |             if (traceBack && ((remainder) > itData->m_traceDelay)) { // before start of trace
 | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             Projector::ProjectionType projectionType = itData->m_projectionType; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |             if ((*itCtl)->m_traceCount[m_traces.currentBufferIndex()] < m_traceSize) | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                 uint32_t& traceCount = (*itCtl)->m_traceCount[m_traces.currentBufferIndex()]; // reference for code clarity
 | 
					
						
							| 
									
										
										
										
											2017-02-07 00:25:40 +01:00
										 |  |  |                 float v; | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                 uint32_t streamIndex = itData->m_streamIndex; | 
					
						
							| 
									
										
										
										
											2017-02-07 00:25:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |                 if (projectionType == Projector::ProjectionMagLin) | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                     v = ((*itCtl)->m_projector.run(*vbegin[streamIndex]) - itData->m_ofs)*itData->m_amp - 1.0f; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-06-26 00:43:19 +02:00
										 |  |  |                 else if (projectionType == Projector::ProjectionMagSq) | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                     Real magsq = (*itCtl)->m_projector.run(*vbegin[streamIndex]); | 
					
						
							| 
									
										
										
										
											2018-06-26 01:06:45 +02:00
										 |  |  |                     v = (magsq - itData->m_ofs)*itData->m_amp - 1.0f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if ((traceCount >= shift) && (traceCount < shift+length)) // power display overlay values construction
 | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         if (traceCount == shift) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             (*itCtl)->m_maxPow = 0.0f; | 
					
						
							|  |  |  |                             (*itCtl)->m_sumPow = 0.0f; | 
					
						
							|  |  |  |                             (*itCtl)->m_nbPow = 1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         if (magsq > 0.0f) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             if (magsq > (*itCtl)->m_maxPow) | 
					
						
							|  |  |  |                             { | 
					
						
							|  |  |  |                                 (*itCtl)->m_maxPow = magsq; | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                             (*itCtl)->m_sumPow += magsq; | 
					
						
							|  |  |  |                             (*itCtl)->m_nbPow++; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if ((m_nbSamples == 1) && ((*itCtl)->m_nbPow > 0)) // on last sample create power display overlay
 | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         double avgPow = (*itCtl)->m_sumPow / (*itCtl)->m_nbPow; | 
					
						
							|  |  |  |                         itData->m_textOverlay = QString("%1  %2").arg((*itCtl)->m_maxPow, 0, 'e', 2).arg(avgPow, 0, 'e', 2); | 
					
						
							|  |  |  |                         (*itCtl)->m_nbPow = 0; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2018-06-26 00:43:19 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |                 else if (projectionType == Projector::ProjectionMagDB) | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-24 21:09:11 +02:00
										 |  |  |                     Real re = vbegin[streamIndex]->real(); | 
					
						
							|  |  |  |                     Real im = vbegin[streamIndex]->imag(); | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                     double magsq = re*re + im*im; | 
					
						
							|  |  |  |                     float pdB = log10f(magsq) * 10.0f; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                     float p = pdB - (100.0f * itData->m_ofs); | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |                     v = ((p/50.0f) + 2.0f)*itData->m_amp - 1.0f; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                     if ((traceCount >= shift) && (traceCount < shift+length)) // power display overlay values construction
 | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                     { | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                         if (traceCount == shift) | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                         { | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                             (*itCtl)->m_maxPow = 0.0f; | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                             (*itCtl)->m_sumPow = 0.0f; | 
					
						
							|  |  |  |                             (*itCtl)->m_nbPow = 1; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                         if (magsq > 0.0f) | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                         { | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                             if (magsq > (*itCtl)->m_maxPow) | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                             { | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                                 (*itCtl)->m_maxPow = magsq; | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                             (*itCtl)->m_sumPow += magsq; | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                             (*itCtl)->m_nbPow++; | 
					
						
							| 
									
										
										
										
											2017-02-26 05:26:42 +01:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                     if ((m_nbSamples == 1) && ((*itCtl)->m_nbPow > 0)) // on last sample create power display overlay
 | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                     { | 
					
						
							| 
									
										
										
										
											2018-06-25 23:44:11 +02:00
										 |  |  |                         double avgPow = log10f((*itCtl)->m_sumPow / (*itCtl)->m_nbPow)*10.0; | 
					
						
							|  |  |  |                         double peakPow = log10f((*itCtl)->m_maxPow)*10.0; | 
					
						
							|  |  |  |                         double peakToAvgPow = peakPow - avgPow; | 
					
						
							|  |  |  |                         itData->m_textOverlay = QString("%1  %2  %3").arg(peakPow, 0, 'f', 1).arg(avgPow, 0, 'f', 1).arg(peakToAvgPow, 4, 'f', 1, ' '); | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |                         (*itCtl)->m_nbPow = 0; | 
					
						
							| 
									
										
										
										
											2017-02-26 04:46:02 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |                     v = ((*itCtl)->m_projector.run(*vbegin[streamIndex]) - itData->m_ofs) * itData->m_amp; | 
					
						
							| 
									
										
										
										
											2017-02-07 00:25:40 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 02:13:53 +01:00
										 |  |  |                 if(v > 1.0f) { | 
					
						
							|  |  |  |                     v = 1.0f; | 
					
						
							|  |  |  |                 } else if (v < -1.0f) { | 
					
						
							|  |  |  |                     v = -1.0f; | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 05:13:21 +01:00
										 |  |  |                 (*itTrace)[2*traceCount] | 
					
						
							|  |  |  |                            = traceCount - shift;   // display x
 | 
					
						
							|  |  |  |                 (*itTrace)[2*traceCount + 1] = v;  // display y
 | 
					
						
							|  |  |  |                 traceCount++; | 
					
						
							| 
									
										
										
										
											2021-07-15 10:03:09 +02:00
										 |  |  |             } // process one sample
 | 
					
						
							|  |  |  |         } // loop on traces
 | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 01:46:11 +02:00
										 |  |  |         for (unsigned int i = 0; i < vbegin.size(); i++) { | 
					
						
							|  |  |  |             ++vbegin[i]; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |         remainder--; | 
					
						
							| 
									
										
										
										
											2017-02-09 01:58:54 +01:00
										 |  |  |         m_nbSamples--; | 
					
						
							| 
									
										
										
										
											2021-07-15 10:03:09 +02:00
										 |  |  |     } // loop on samples
 | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-27 07:32:14 +02:00
										 |  |  |     float traceTime = ((float) m_traceSize) / m_sampleRate; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  |     if (m_glScope && (traceTime >= 1.0f)) { // display continuously if trace time is 1 second or more
 | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |         m_glScope->newTraces(m_traces.m_traces, m_traces.currentBufferIndex(), &m_traces.m_projectionTypes); | 
					
						
							| 
									
										
										
										
											2018-10-27 07:32:14 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  |     if (m_glScope && (m_nbSamples == 0)) // finished
 | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-11-19 18:49:12 +01:00
										 |  |  |         // display only at trace end if trace time is less than 1 second
 | 
					
						
							|  |  |  |         if (traceTime < 1.0f) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
 | 
					
						
							| 
									
										
										
										
											2020-11-04 08:59:16 +01:00
										 |  |  |             if (m_glScope->getProcessingTraceIndex().loadRelaxed() < 0) { | 
					
						
							| 
									
										
										
										
											2019-10-14 01:42:24 +02:00
										 |  |  |                 m_glScope->newTraces(m_traces.m_traces, m_traces.currentBufferIndex(), &m_traces.m_projectionTypes); | 
					
						
							| 
									
										
										
										
											2018-11-19 18:49:12 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |             if (m_glScope->getProcessingTraceIndex().load() < 0) { | 
					
						
							|  |  |  |                 m_glScope->newTraces(m_traces.m_traces, m_traces.currentBufferIndex(), &m_traces.m_projectionTypes); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-10-27 07:32:14 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-11-19 18:49:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // switch to next buffer only if it is not being processed by the scope
 | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
 | 
					
						
							| 
									
										
										
										
											2020-11-04 08:59:16 +01:00
										 |  |  |         if (m_glScope->getProcessingTraceIndex().loadRelaxed() != (((int) m_traces.currentBufferIndex() + 1) % 2)) { | 
					
						
							| 
									
										
										
										
											2018-11-19 18:49:12 +01:00
										 |  |  |             m_traces.switchBuffer(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  |         if (m_glScope->getProcessingTraceIndex().load() != (((int) m_traces.currentBufferIndex() + 1) % 2)) { | 
					
						
							|  |  |  |             m_traces.switchBuffer(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-11-19 18:49:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 08:36:49 +02:00
										 |  |  |         return remainder; // return remainder count
 | 
					
						
							| 
									
										
										
										
											2017-02-02 08:27:49 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return -1; // mark not finished
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-05 04:41:32 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  | void ScopeVis::handleInputMessages() | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-05-29 20:09:28 +02:00
										 |  |  | 	Message* message; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while ((message = m_inputMessageQueue.pop()) != nullptr) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (handleMessage(*message)) { | 
					
						
							|  |  |  | 			delete message; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | bool ScopeVis::handleMessage(const Message& message) | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |     if (DSPSignalNotification::match(message)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-07-11 10:45:17 +02:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         DSPSignalNotification& notif = (DSPSignalNotification&) message; | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  |         setLiveRate(notif.getSampleRate()); | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: DSPSignalNotification: m_sampleRate: " << m_sampleRate; | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     else if (MsgConfigureScopeVis::match(message)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							|  |  |  |         const MsgConfigureScopeVis& cmd = (const MsgConfigureScopeVis&) message; | 
					
						
							|  |  |  |         applySettings(cmd.getSettings(), cmd.getForce()); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisAddTrigger::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisAddTrigger"; | 
					
						
							| 
									
										
										
										
											2017-02-13 11:30:40 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisAddTrigger& conf = (MsgScopeVisAddTrigger&) message; | 
					
						
							|  |  |  |         addTrigger(conf.getTriggerData()); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisChangeTrigger::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-13 11:30:40 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisChangeTrigger& conf = (MsgScopeVisChangeTrigger&) message; | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         uint32_t triggerIndex = conf.getTriggerIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisChangeTrigger: " << triggerIndex; | 
					
						
							|  |  |  |         changeTrigger(conf.getTriggerData(), triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisRemoveTrigger::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-13 11:30:40 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisRemoveTrigger& conf = (MsgScopeVisRemoveTrigger&) message; | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         uint32_t triggerIndex = conf.getTriggerIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisRemoveTrigger: " << triggerIndex; | 
					
						
							|  |  |  |         removeTrigger(triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisMoveTrigger::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-26 19:14:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisMoveTrigger& conf = (MsgScopeVisMoveTrigger&) message; | 
					
						
							| 
									
										
										
										
											2017-02-26 19:14:27 +01:00
										 |  |  |         int triggerIndex = conf.getTriggerIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisMoveTrigger: " << triggerIndex; | 
					
						
							| 
									
										
										
										
											2017-02-26 19:14:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!conf.getMoveUp() && (triggerIndex == 0)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         moveTrigger(triggerIndex, conf.getMoveUp()); | 
					
						
							| 
									
										
										
										
											2017-02-26 19:14:27 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisFocusOnTrigger::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-07-11 10:45:17 +02:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisFocusOnTrigger& conf = (MsgScopeVisFocusOnTrigger&) message; | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         uint32_t triggerIndex = conf.getTriggerIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisFocusOnTrigger: " << triggerIndex; | 
					
						
							|  |  |  |         focusOnTrigger(triggerIndex); | 
					
						
							| 
									
										
										
										
											2017-02-11 10:36:10 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     else if (MsgScopeVisAddTrace::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisAddTrace"; | 
					
						
							| 
									
										
										
										
											2017-02-13 03:23:29 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisAddTrace& conf = (MsgScopeVisAddTrace&) message; | 
					
						
							|  |  |  |         addTrace(conf.getTraceData()); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     else if (MsgScopeVisChangeTrace::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-13 03:23:29 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisChangeTrace& conf = (MsgScopeVisChangeTrace&) message; | 
					
						
							| 
									
										
										
										
											2018-05-21 18:00:10 +02:00
										 |  |  |         uint32_t traceIndex = conf.getTraceIndex(); | 
					
						
							| 
									
										
										
										
											2021-07-12 19:37:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisChangeTrace: " << traceIndex; | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         changeTrace(conf.getTraceData(), traceIndex); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2017-01-31 08:26:13 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |     else if (MsgScopeVisRemoveTrace::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-13 03:23:29 +01:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         MsgScopeVisRemoveTrace& conf = (MsgScopeVisRemoveTrace&) message; | 
					
						
							| 
									
										
										
										
											2018-05-21 18:00:10 +02:00
										 |  |  |         uint32_t traceIndex = conf.getTraceIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisRemoveTrace: " << traceIndex; | 
					
						
							|  |  |  |         removeTrace(traceIndex); | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisMoveTrace::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisMoveTrace& conf = (MsgScopeVisMoveTrace&) message; | 
					
						
							| 
									
										
										
										
											2018-05-21 18:00:10 +02:00
										 |  |  |         uint32_t traceIndex = conf.getTraceIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisMoveTrace: " << traceIndex; | 
					
						
							|  |  |  |         moveTrace(traceIndex, conf.getMoveUp()); | 
					
						
							| 
									
										
										
										
											2017-02-26 11:26:23 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |     else if (MsgScopeVisFocusOnTrace::match(message)) | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-07-11 10:45:17 +02:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         MsgScopeVisFocusOnTrace& conf = (MsgScopeVisFocusOnTrace&) message; | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         uint32_t traceIndex = conf.getTraceIndex(); | 
					
						
							| 
									
										
										
										
											2021-06-09 22:32:45 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisFocusOnTrace: " << traceIndex; | 
					
						
							|  |  |  |         focusOnTrace(traceIndex); | 
					
						
							| 
									
										
										
										
											2017-02-13 01:32:02 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |     else if (MsgScopeVisNGOneShot::match(message)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-07-11 10:45:17 +02:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |         MsgScopeVisNGOneShot& conf = (MsgScopeVisNGOneShot&) message; | 
					
						
							|  |  |  |         bool oneShot = conf.getOneShot(); | 
					
						
							| 
									
										
										
										
											2020-10-08 07:51:31 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisNGOneShot: oneShot:" << oneShot; | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |         m_triggerOneShot = oneShot; | 
					
						
							| 
									
										
										
										
											2020-10-08 07:51:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (m_triggerWaitForReset && !oneShot) { | 
					
						
							|  |  |  |             m_triggerWaitForReset = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-26 06:06:59 +01:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2017-02-22 01:18:50 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  |     else if (MsgScopeVisNGMemoryTrace::match(message)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-07-11 10:45:17 +02:00
										 |  |  |         QMutexLocker configLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  |         MsgScopeVisNGMemoryTrace& conf = (MsgScopeVisNGMemoryTrace&) message; | 
					
						
							|  |  |  |         uint32_t memoryIndex = conf.getMemoryIndex(); | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage: MsgScopeVisNGMemoryTrace: " << memoryIndex; | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (memoryIndex != m_currentTraceMemoryIndex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |             // transition from live mode
 | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |             if (m_currentTraceMemoryIndex == 0) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |                 m_liveTraceSize = m_traceSize; | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |                 m_livePreTriggerDelay = m_preTriggerDelay; | 
					
						
							| 
									
										
										
										
											2018-10-16 00:31:45 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |             m_currentTraceMemoryIndex = memoryIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |             // transition to live mode
 | 
					
						
							|  |  |  |             if (m_currentTraceMemoryIndex == 0) | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-10-20 10:41:49 +02:00
										 |  |  |                 setLiveRate(m_liveSampleRate); // reset to live rate
 | 
					
						
							| 
									
										
										
										
											2018-10-16 18:43:46 +02:00
										 |  |  |                 setTraceSize(m_liveTraceSize, true); // reset to live trace size
 | 
					
						
							|  |  |  |                 setPreTriggerDelay(m_livePreTriggerDelay, true); // reset to live pre-trigger delay
 | 
					
						
							| 
									
										
										
										
											2018-10-16 05:10:35 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2017-02-24 23:24:47 +01:00
										 |  |  |                 processMemoryTrace(); | 
					
						
							| 
									
										
										
										
											2017-02-24 08:31:25 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-26 06:06:59 +01:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2017-02-23 08:18:03 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  |         qDebug() << "ScopeVis::handleMessage" << message.getIdentifier() << " not handled"; | 
					
						
							| 
									
										
										
										
											2017-02-03 08:27:03 +01:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-29 19:51:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  | void ScopeVis::applySettings(const GLScopeSettings& settings, bool force) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     (void) force; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_traces.size() > m_settings.m_tracesData.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (unsigned int i = m_traces.size(); i > m_settings.m_tracesData.size(); i--) { | 
					
						
							|  |  |  |             removeTrace(i-1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (unsigned int i = 0; i < m_settings.m_tracesData.size(); i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (i < m_traces.size()) { // change trace
 | 
					
						
							| 
									
										
										
										
											2021-12-01 00:20:14 +01:00
										 |  |  |             changeTrace(settings.m_tracesData[i], i); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         } else {  // add trace
 | 
					
						
							| 
									
										
										
										
											2021-12-01 00:20:14 +01:00
										 |  |  |             addTrace(settings.m_tracesData[i]); | 
					
						
							| 
									
										
										
										
											2021-06-09 01:02:20 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_settings = settings; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::updateMaxTraceDelay() | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     int maxTraceDelay = 0; | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  |     bool allocateCache = false; | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |     uint32_t projectorCounts[(int) Projector::nbProjectionTypes]; | 
					
						
							|  |  |  |     memset(projectorCounts, 0, ((int) Projector::nbProjectionTypes)*sizeof(uint32_t)); | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |     std::vector<GLScopeSettings::TraceData>::iterator itData = m_traces.m_tracesData.begin(); | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |     std::vector<TraceControl*>::iterator itCtrl = m_traces.m_tracesControl.begin(); | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  |     for (; itData != m_traces.m_tracesData.end(); ++itData, ++itCtrl) | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (itData->m_traceDelay > maxTraceDelay) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             maxTraceDelay = itData->m_traceDelay; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-15 18:48:31 +01:00
										 |  |  |         if (itData->m_projectionType < 0) { | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             itData->m_projectionType = Projector::ProjectionReal; | 
					
						
							| 
									
										
										
										
											2018-02-15 18:48:31 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-15 18:29:19 +02:00
										 |  |  |         if (m_nbStreams <= 1) // Works only for single stream mode. Fixes #872
 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (projectorCounts[(int) itData->m_projectionType] > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 allocateCache = true; | 
					
						
							|  |  |  |                 (*itCtrl)->m_projector.setCacheMaster(false); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 (*itCtrl)->m_projector.setCacheMaster(true); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         projectorCounts[(int) itData->m_projectionType]++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     itCtrl = m_traces.m_tracesControl.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; itCtrl != m_traces.m_tracesControl.end(); ++itCtrl) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (allocateCache) { | 
					
						
							| 
									
										
										
										
											2018-04-03 22:29:09 +02:00
										 |  |  |             (*itCtrl)->m_projector.setCache(m_projectorCache); | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2021-07-15 10:03:09 +02:00
										 |  |  |             (*itCtrl)->m_projector.setCache(nullptr); | 
					
						
							| 
									
										
										
										
											2017-02-19 04:46:15 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_maxTraceDelay = maxTraceDelay; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::initTraceBuffers() | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     int shift = (m_timeOfsProMill / 1000.0) * m_traceSize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector<float *>::iterator it0 = m_traces.m_traces[0].begin(); | 
					
						
							|  |  |  |     std::vector<float *>::iterator it1 = m_traces.m_traces[1].begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; it0 != m_traces.m_traces[0].end(); ++it0, ++it1) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |         for (unsigned int i = 0; i < m_traceSize; i++) | 
					
						
							| 
									
										
										
										
											2017-02-06 02:40:31 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             (*it0)[2*i] = (i - shift); // display x
 | 
					
						
							|  |  |  |             (*it0)[2*i + 1] = 0.0f;    // display y
 | 
					
						
							|  |  |  |             (*it1)[2*i] = (i - shift); // display x
 | 
					
						
							|  |  |  |             (*it1)[2*i + 1] = 0.0f;    // display y
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::computeDisplayTriggerLevels() | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-05-29 00:55:04 +02:00
										 |  |  |     std::vector<GLScopeSettings::TraceData>::iterator itData = m_traces.m_tracesData.begin(); | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for (; itData != m_traces.m_tracesData.end(); ++itData) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |         if ((m_focusedTriggerIndex < m_triggerConditions.size()) && (m_triggerConditions[m_focusedTriggerIndex]->m_projector.getProjectionType() == itData->m_projectionType)) | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-04-03 23:19:35 +02:00
										 |  |  |             float level = m_triggerConditions[m_focusedTriggerIndex]->m_triggerData.m_triggerLevel; | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |             float levelPowerLin = level + 1.0f; | 
					
						
							|  |  |  |             float levelPowerdB = (100.0f * (level - 1.0f)); | 
					
						
							|  |  |  |             float v; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 01:39:23 +02:00
										 |  |  |             if ((itData->m_projectionType == Projector::ProjectionMagLin) || (itData->m_projectionType == Projector::ProjectionMagSq)) | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |             { | 
					
						
							|  |  |  |                 v = (levelPowerLin - itData->m_ofs)*itData->m_amp - 1.0f; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-04-03 18:51:21 +02:00
										 |  |  |             else if (itData->m_projectionType == Projector::ProjectionMagDB) | 
					
						
							| 
									
										
										
										
											2017-02-11 08:35:33 +01:00
										 |  |  |             { | 
					
						
							|  |  |  |                 float ofsdB = itData->m_ofs * 100.0f; | 
					
						
							|  |  |  |                 v = ((levelPowerdB + 100.0f - ofsdB)*itData->m_amp)/50.0f - 1.0f; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 v = (level - itData->m_ofs) * itData->m_amp; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if(v > 1.0f) { | 
					
						
							|  |  |  |                 v = 1.0f; | 
					
						
							|  |  |  |             } else if (v < -1.0f) { | 
					
						
							|  |  |  |                 v = -1.0f; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             itData->m_triggerDisplayLevel = v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             itData->m_triggerDisplayLevel = 2.0f; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-02-25 04:35:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 17:18:58 +02:00
										 |  |  | void ScopeVis::updateGLScopeDisplay() | 
					
						
							| 
									
										
										
										
											2017-02-25 04:35:06 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-05-30 13:12:00 +02:00
										 |  |  |     if (!m_glScope) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |     if (m_currentTraceMemoryIndex > 0) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-25 04:35:06 +01:00
										 |  |  |         m_glScope->setConfigChanged(); | 
					
						
							|  |  |  |         processMemoryTrace(); | 
					
						
							| 
									
										
										
										
											2021-05-29 12:22:43 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-25 04:35:06 +01:00
										 |  |  |         m_glScope->updateDisplay(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |