1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-18 07:35:47 -05:00

scope trigger delay preparation #1

This commit is contained in:
f4exb 2015-07-20 22:51:49 +02:00
parent be6899ebfd
commit 3950ec4be9
5 changed files with 49 additions and 16 deletions

View File

@ -23,6 +23,7 @@ find_package(Qt5Multimedia 5.0 REQUIRED)
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
find_package(PkgConfig) find_package(PkgConfig)
find_package(Boost)
find_package(FFTW3F) find_package(FFTW3F)
############################################################################## ##############################################################################

View File

@ -1,6 +1,7 @@
#ifndef INCLUDE_SCOPEVIS_H #ifndef INCLUDE_SCOPEVIS_H
#define INCLUDE_SCOPEVIS_H #define INCLUDE_SCOPEVIS_H
#include <boost/circular_buffer.hpp>
#include "dsp/samplesink.h" #include "dsp/samplesink.h"
#include "util/export.h" #include "util/export.h"
#include "util/message.h" #include "util/message.h"
@ -21,7 +22,7 @@ public:
ScopeVis(GLScope* glScope = NULL); ScopeVis(GLScope* glScope = NULL);
void configure(MessageQueue* msgQueue, TriggerChannel triggerChannel, Real triggerLevel, bool triggerPositiveEdge); void configure(MessageQueue* msgQueue, TriggerChannel triggerChannel, Real triggerLevel, bool triggerPositiveEdge, uint triggerDelay);
void setOneShot(bool oneShot); void setOneShot(bool oneShot);
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
@ -42,22 +43,25 @@ private:
int getTriggerChannel() const { return m_triggerChannel; } int getTriggerChannel() const { return m_triggerChannel; }
Real getTriggerLevel() const { return m_triggerLevel; } Real getTriggerLevel() const { return m_triggerLevel; }
Real getTriggerPositiveEdge() const { return m_triggerPositiveEdge; } Real getTriggerPositiveEdge() const { return m_triggerPositiveEdge; }
uint getTriggerDelay() const { return m_triggerDelay; }
static MsgConfigureScopeVis* create(int triggerChannel, Real triggerLevel, bool triggerPositiveEdge) static MsgConfigureScopeVis* create(int triggerChannel, Real triggerLevel, bool triggerPositiveEdge, uint triggerDelay)
{ {
return new MsgConfigureScopeVis(triggerChannel, triggerLevel, triggerPositiveEdge); return new MsgConfigureScopeVis(triggerChannel, triggerLevel, triggerPositiveEdge, triggerDelay);
} }
private: private:
int m_triggerChannel; int m_triggerChannel;
Real m_triggerLevel; Real m_triggerLevel;
bool m_triggerPositiveEdge; bool m_triggerPositiveEdge;
uint m_triggerDelay;
MsgConfigureScopeVis(int triggerChannel, Real triggerLevel, bool triggerPositiveEdge) : MsgConfigureScopeVis(int triggerChannel, Real triggerLevel, bool triggerPositiveEdge, uint triggerDelay) :
Message(), Message(),
m_triggerChannel(triggerChannel), m_triggerChannel(triggerChannel),
m_triggerLevel(triggerLevel), m_triggerLevel(triggerLevel),
m_triggerPositiveEdge(triggerPositiveEdge) m_triggerPositiveEdge(triggerPositiveEdge),
m_triggerDelay(triggerDelay)
{ } { }
}; };
@ -68,12 +72,15 @@ private:
}; };
GLScope* m_glScope; GLScope* m_glScope;
std::vector<Complex> m_trace; std::vector<Complex> m_trace; //!< Raw trace to be used by GLScope
boost::circular_buffer<Complex> m_traceback; //!< FIFO for samples prior to triggering point to support trigger delay (when in triggered mode)
uint m_tracebackCount; //!< Count of samples stored into trace memory since triggering is active up to trace memory size
uint m_fill; uint m_fill;
TriggerState m_triggerState; TriggerState m_triggerState;
TriggerChannel m_triggerChannel; TriggerChannel m_triggerChannel;
Real m_triggerLevel; Real m_triggerLevel;
bool m_triggerPositiveEdge; bool m_triggerPositiveEdge;
uint m_triggerDelay; //!< Trigger delay in number of samples
bool m_triggerOneShot; bool m_triggerOneShot;
bool m_armed; bool m_armed;
int m_sampleRate; int m_sampleRate;

View File

@ -2,6 +2,7 @@
#include "gui/glscope.h" #include "gui/glscope.h"
#include "dsp/dspcommands.h" #include "dsp/dspcommands.h"
#include "util/messagequeue.h" #include "util/messagequeue.h"
#include <algorithm>
#include <cstdio> #include <cstdio>
#include <iostream> #include <iostream>
@ -11,6 +12,8 @@ MESSAGE_CLASS_DEFINITION(ScopeVis::MsgConfigureScopeVis, Message)
ScopeVis::ScopeVis(GLScope* glScope) : ScopeVis::ScopeVis(GLScope* glScope) :
m_glScope(glScope), m_glScope(glScope),
m_trace(96000), m_trace(96000),
m_traceback(96000),
m_tracebackCount(0),
m_fill(0), m_fill(0),
m_triggerState(Untriggered), m_triggerState(Untriggered),
m_triggerChannel(TriggerFreeRun), m_triggerChannel(TriggerFreeRun),
@ -22,9 +25,9 @@ ScopeVis::ScopeVis(GLScope* glScope) :
{ {
} }
void ScopeVis::configure(MessageQueue* msgQueue, TriggerChannel triggerChannel, Real triggerLevel, bool triggerPositiveEdge) void ScopeVis::configure(MessageQueue* msgQueue, TriggerChannel triggerChannel, Real triggerLevel, bool triggerPositiveEdge, uint triggerDelay)
{ {
Message* cmd = MsgConfigureScopeVis::create(triggerChannel, triggerLevel, triggerPositiveEdge); Message* cmd = MsgConfigureScopeVis::create(triggerChannel, triggerLevel, triggerPositiveEdge, triggerDelay);
cmd->submit(msgQueue, this); cmd->submit(msgQueue, this);
} }
@ -74,15 +77,24 @@ void ScopeVis::feed(SampleVector::const_iterator begin, SampleVector::const_iter
{ {
while(begin < end) while(begin < end)
{ {
if (triggerCondition(begin) ^ !m_triggerPositiveEdge) { bool trigger = triggerCondition(begin);
if (m_armed) { if ((trigger ^ !m_triggerPositiveEdge) && (m_tracebackCount > m_triggerDelay))
{
if (m_armed)
{
m_triggerState = Triggered; m_triggerState = Triggered;
m_armed = false; m_armed = false;
m_triggerPoint = begin; m_triggerPoint = begin;
// fill beginning of m_trace with delayed samples from the trace memory FIFO. Increment m_fill accordingly.
if (m_triggerDelay) { // do this process only if there is a delayed trigger
std::copy(m_traceback.end() - m_triggerDelay, m_traceback.end() - 1, m_trace.begin());
m_fill = m_triggerDelay; // Increment m_fill accordingly (from 0).
}
break; break;
} }
} }
else { else
{
m_armed = true; m_armed = true;
} }
++begin; ++begin;
@ -105,6 +117,7 @@ void ScopeVis::feed(SampleVector::const_iterator begin, SampleVector::const_iter
if (m_triggerOneShot) { if (m_triggerOneShot) {
m_triggerState = WaitForReset; m_triggerState = WaitForReset;
} else { } else {
m_tracebackCount = 0;
m_triggerState = Untriggered; m_triggerState = Untriggered;
} }
} }
@ -133,14 +146,20 @@ bool ScopeVis::handleMessageKeep(Message* message)
return true; return true;
} else if(MsgConfigureScopeVis::match(message)) { } else if(MsgConfigureScopeVis::match(message)) {
MsgConfigureScopeVis* conf = (MsgConfigureScopeVis*)message; MsgConfigureScopeVis* conf = (MsgConfigureScopeVis*)message;
m_tracebackCount = 0;
m_triggerState = Untriggered; m_triggerState = Untriggered;
m_triggerChannel = (TriggerChannel) conf->getTriggerChannel(); m_triggerChannel = (TriggerChannel) conf->getTriggerChannel();
m_triggerLevel = conf->getTriggerLevel(); m_triggerLevel = conf->getTriggerLevel();
m_triggerPositiveEdge = conf->getTriggerPositiveEdge(); m_triggerPositiveEdge = conf->getTriggerPositiveEdge();
m_triggerDelay = conf->getTriggerDelay();
if (m_triggerDelay >= m_traceback.size()) {
m_triggerDelay = m_traceback.size() - 1; // top sample in FIFO is always the triggering one (delay = 0)
}
std::cerr << "ScopeVis::handleMessageKeep:" std::cerr << "ScopeVis::handleMessageKeep:"
<< " m_triggerChannel: " << m_triggerChannel << " m_triggerChannel: " << m_triggerChannel
<< " m_triggerLevel: " << m_triggerLevel << " m_triggerLevel: " << m_triggerLevel
<< " m_triggerPositiveEdge: " << (m_triggerPositiveEdge ? "edge+" : "edge-") << std::endl; << " m_triggerPositiveEdge: " << (m_triggerPositiveEdge ? "edge+" : "edge-")
<< " m_triggerDelay: " << m_triggerDelay << std::endl;
return true; return true;
/* /*
} else if(DSPConfigureScopeVis::match(message)) { } else if(DSPConfigureScopeVis::match(message)) {
@ -175,6 +194,11 @@ void ScopeVis::setSampleRate(int sampleRate)
bool ScopeVis::triggerCondition(SampleVector::const_iterator& it) bool ScopeVis::triggerCondition(SampleVector::const_iterator& it)
{ {
Complex c(it->real()/32768.0, it->imag()/32768.0); Complex c(it->real()/32768.0, it->imag()/32768.0);
m_traceback.push_back(c); // store into trace memory FIFO
if (m_tracebackCount < m_traceback.size()) { // increment count up to trace memory size
m_tracebackCount++;
}
if (m_triggerChannel == TriggerChannelI) { if (m_triggerChannel == TriggerChannelI) {
return c.real() > m_triggerLevel; return c.real() > m_triggerLevel;
@ -203,6 +227,7 @@ void ScopeVis::setOneShot(bool oneShot)
m_triggerOneShot = oneShot; m_triggerOneShot = oneShot;
if ((m_triggerState == WaitForReset) && !oneShot) { if ((m_triggerState == WaitForReset) && !oneShot) {
m_tracebackCount = 0;
m_triggerState = Untriggered; m_triggerState = Untriggered;
} }
} }

View File

@ -180,7 +180,7 @@ void GLScopeGUI::applyTriggerSettings()
m_glScope->setTriggerChannel((ScopeVis::TriggerChannel) m_triggerChannel); m_glScope->setTriggerChannel((ScopeVis::TriggerChannel) m_triggerChannel);
m_glScope->setTriggerLevel(m_triggerLevel / 100.0); m_glScope->setTriggerLevel(m_triggerLevel / 100.0);
m_scopeVis->configure(m_messageQueue, (ScopeVis::TriggerChannel) m_triggerChannel, triggerLevel, m_triggerPositiveEdge); m_scopeVis->configure(m_messageQueue, (ScopeVis::TriggerChannel) m_triggerChannel, triggerLevel, m_triggerPositiveEdge, 0); // TODO: pass trigger delay as the last parameter
} }
void GLScopeGUI::setTrigLevelDisplay() void GLScopeGUI::setTrigLevelDisplay()

View File

@ -378,7 +378,7 @@ void GLSpectrum::updateHistogram(const std::vector<Real>& spectrum)
m_currentSpectrum = &spectrum; // Store spectrum for current spectrum line display m_currentSpectrum = &spectrum; // Store spectrum for current spectrum line display
#define NO_AVX //#define NO_AVX
#ifdef NO_AVX #ifdef NO_AVX
for(int i = 0; i < m_fftSize; i++) { for(int i = 0; i < m_fftSize; i++) {
int v = (int)((spectrum[i] - m_referenceLevel) * 100.0 / m_powerRange + 100.0); int v = (int)((spectrum[i] - m_referenceLevel) * 100.0 / m_powerRange + 100.0);
@ -410,7 +410,7 @@ void GLSpectrum::updateHistogram(const std::vector<Real>& spectrum)
if((v >= 0) && (v <= 99)) { if((v >= 0) && (v <= 99)) {
b = m_histogram + (i + j) * 100 + v; b = m_histogram + (i + j) * 100 + v;
if(*b < 220) if(*b < 220)
*b += 4; *b += m_histogramStroke; // was 4
else if(*b < 239) else if(*b < 239)
*b += 1; *b += 1;
} }