1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-16 13:21:50 -05:00

ScopeNG: use dynamic storage for TraceControl objects

This commit is contained in:
f4exb 2018-04-03 22:29:09 +02:00
parent b8b2ceb47d
commit 26b4b50d23
2 changed files with 53 additions and 38 deletions

View File

@ -439,7 +439,7 @@ int ScopeVisNG::processTraces(const SampleVector::const_iterator& cbegin, const
while ((begin < end) && (m_nbSamples > 0)) while ((begin < end) && (m_nbSamples > 0))
{ {
std::vector<TraceControl>::iterator itCtl = m_traces.m_tracesControl.begin(); std::vector<TraceControl*>::iterator itCtl = m_traces.m_tracesControl.begin();
std::vector<TraceData>::iterator itData = m_traces.m_tracesData.begin(); std::vector<TraceData>::iterator itData = m_traces.m_tracesData.begin();
std::vector<float *>::iterator itTrace = m_traces.m_traces[m_traces.currentBufferIndex()].begin(); std::vector<float *>::iterator itTrace = m_traces.m_traces[m_traces.currentBufferIndex()].begin();
@ -451,21 +451,21 @@ int ScopeVisNG::processTraces(const SampleVector::const_iterator& cbegin, const
Projector::ProjectionType projectionType = itData->m_projectionType; Projector::ProjectionType projectionType = itData->m_projectionType;
if (itCtl->m_traceCount[m_traces.currentBufferIndex()] < m_traceSize) if ((*itCtl)->m_traceCount[m_traces.currentBufferIndex()] < m_traceSize)
{ {
uint32_t& traceCount = itCtl->m_traceCount[m_traces.currentBufferIndex()]; // reference for code clarity uint32_t& traceCount = (*itCtl)->m_traceCount[m_traces.currentBufferIndex()]; // reference for code clarity
float v; float v;
if (projectionType == Projector::ProjectionMagLin) if (projectionType == Projector::ProjectionMagLin)
{ {
v = (itCtl->m_projector.run(*begin) - itData->m_ofs)*itData->m_amp - 1.0f; v = ((*itCtl)->m_projector.run(*begin) - itData->m_ofs)*itData->m_amp - 1.0f;
} }
else if (projectionType == Projector::ProjectionMagDB) else if (projectionType == Projector::ProjectionMagDB)
{ {
// there is no processing advantage in direct calculation without projector // there is no processing advantage in direct calculation without projector
// uint32_t magsq = begin->m_real*begin->m_real + begin->m_imag*begin->m_imag; // uint32_t magsq = begin->m_real*begin->m_real + begin->m_imag*begin->m_imag;
// v = ((log10f(magsq/1073741824.0f)*0.2f - 2.0f*itData->m_ofs) + 2.0f)*itData->m_amp - 1.0f; // v = ((log10f(magsq/1073741824.0f)*0.2f - 2.0f*itData->m_ofs) + 2.0f)*itData->m_amp - 1.0f;
float pdB = itCtl->m_projector.run(*begin); float pdB = (*itCtl)->m_projector.run(*begin);
float p = pdB - (100.0f * itData->m_ofs); float p = pdB - (100.0f * itData->m_ofs);
v = ((p/50.0f) + 2.0f)*itData->m_amp - 1.0f; v = ((p/50.0f) + 2.0f)*itData->m_amp - 1.0f;
@ -473,34 +473,34 @@ int ScopeVisNG::processTraces(const SampleVector::const_iterator& cbegin, const
{ {
if (traceCount == shift) if (traceCount == shift)
{ {
itCtl->m_maxPow = -200.0f; (*itCtl)->m_maxPow = -200.0f;
itCtl->m_sumPow = 0.0f; (*itCtl)->m_sumPow = 0.0f;
itCtl->m_nbPow = 1; (*itCtl)->m_nbPow = 1;
} }
if (pdB > -200.0f) if (pdB > -200.0f)
{ {
if (pdB > itCtl->m_maxPow) if (pdB > (*itCtl)->m_maxPow)
{ {
itCtl->m_maxPow = pdB; (*itCtl)->m_maxPow = pdB;
} }
itCtl->m_sumPow += pdB; (*itCtl)->m_sumPow += pdB;
itCtl->m_nbPow++; (*itCtl)->m_nbPow++;
} }
} }
if ((m_nbSamples == 1) && (itCtl->m_nbPow > 0)) // on last sample create power display overlay if ((m_nbSamples == 1) && ((*itCtl)->m_nbPow > 0)) // on last sample create power display overlay
{ {
double avgPow = itCtl->m_sumPow / itCtl->m_nbPow; double avgPow = (*itCtl)->m_sumPow / (*itCtl)->m_nbPow;
double peakToAvgPow = itCtl->m_maxPow - avgPow; double peakToAvgPow = (*itCtl)->m_maxPow - avgPow;
itData->m_textOverlay = QString("%1 %2 %3").arg(itCtl->m_maxPow, 0, 'f', 1).arg(avgPow, 0, 'f', 1).arg(peakToAvgPow, 4, 'f', 1, ' '); itData->m_textOverlay = QString("%1 %2 %3").arg((*itCtl)->m_maxPow, 0, 'f', 1).arg(avgPow, 0, 'f', 1).arg(peakToAvgPow, 4, 'f', 1, ' ');
itCtl->m_nbPow = 0; (*itCtl)->m_nbPow = 0;
} }
} }
else else
{ {
v = (itCtl->m_projector.run(*begin) - itData->m_ofs) * itData->m_amp; v = ((*itCtl)->m_projector.run(*begin) - itData->m_ofs) * itData->m_amp;
} }
if(v > 1.0f) { if(v > 1.0f) {
@ -789,7 +789,7 @@ void ScopeVisNG::updateMaxTraceDelay()
uint32_t projectorCounts[(int) Projector::nbProjectionTypes]; uint32_t projectorCounts[(int) Projector::nbProjectionTypes];
memset(projectorCounts, 0, ((int) Projector::nbProjectionTypes)*sizeof(uint32_t)); memset(projectorCounts, 0, ((int) Projector::nbProjectionTypes)*sizeof(uint32_t));
std::vector<TraceData>::iterator itData = m_traces.m_tracesData.begin(); std::vector<TraceData>::iterator itData = m_traces.m_tracesData.begin();
std::vector<TraceControl>::iterator itCtrl = m_traces.m_tracesControl.begin(); std::vector<TraceControl*>::iterator itCtrl = m_traces.m_tracesControl.begin();
for (; itData != m_traces.m_tracesData.end(); ++itData, ++itCtrl) for (; itData != m_traces.m_tracesData.end(); ++itData, ++itCtrl)
{ {
@ -805,11 +805,11 @@ void ScopeVisNG::updateMaxTraceDelay()
if (projectorCounts[(int) itData->m_projectionType] > 0) if (projectorCounts[(int) itData->m_projectionType] > 0)
{ {
allocateCache = true; allocateCache = true;
itCtrl->m_projector.setCacheMaster(false); (*itCtrl)->m_projector.setCacheMaster(false);
} }
else else
{ {
itCtrl->m_projector.setCacheMaster(true); (*itCtrl)->m_projector.setCacheMaster(true);
} }
projectorCounts[(int) itData->m_projectionType]++; projectorCounts[(int) itData->m_projectionType]++;
@ -820,9 +820,9 @@ void ScopeVisNG::updateMaxTraceDelay()
for (; itCtrl != m_traces.m_tracesControl.end(); ++itCtrl) for (; itCtrl != m_traces.m_tracesControl.end(); ++itCtrl)
{ {
if (allocateCache) { if (allocateCache) {
itCtrl->m_projector.setCache(m_projectorCache); (*itCtrl)->m_projector.setCache(m_projectorCache);
} else { } else {
itCtrl->m_projector.setCache(0); (*itCtrl)->m_projector.setCache(0);
} }
} }

View File

@ -529,10 +529,12 @@ private:
m_triggerDelayCount(0), m_triggerDelayCount(0),
m_triggerCounter(0) m_triggerCounter(0)
{ {
qDebug("TriggerCondition");
} }
~TriggerCondition() ~TriggerCondition()
{ {
qDebug("~TriggerCondition");
} }
void initProjector() void initProjector()
@ -687,11 +689,13 @@ private:
TraceControl() : m_projector(Projector::ProjectionReal) TraceControl() : m_projector(Projector::ProjectionReal)
{ {
qDebug("TraceControl::TraceControl");
reset(); reset();
} }
~TraceControl() ~TraceControl()
{ {
qDebug("TraceControl::~TraceControl");
} }
void initProjector(Projector::ProjectionType projectionType) void initProjector(Projector::ProjectionType projectionType)
@ -715,7 +719,7 @@ private:
struct Traces struct Traces
{ {
std::vector<TraceControl> m_tracesControl; //!< Corresponding traces control data std::vector<TraceControl*> m_tracesControl; //!< Corresponding traces control data
std::vector<TraceData> m_tracesData; //!< Corresponding traces data std::vector<TraceData> m_tracesData; //!< Corresponding traces data
std::vector<float *> m_traces[2]; //!< Double buffer of traces processed by glScope std::vector<float *> m_traces[2]; //!< Double buffer of traces processed by glScope
int m_traceSize; //!< Current size of a trace in buffer int m_traceSize; //!< Current size of a trace in buffer
@ -750,11 +754,13 @@ private:
{ {
if (m_traces[0].size() < m_maxNbTraces) if (m_traces[0].size() < m_maxNbTraces)
{ {
qDebug("ScopeVisNG::addTrace");
m_traces[0].push_back(0); m_traces[0].push_back(0);
m_traces[1].push_back(0); m_traces[1].push_back(0);
m_tracesData.push_back(traceData); m_tracesData.push_back(traceData);
m_tracesControl.push_back(TraceControl()); m_tracesControl.push_back(new TraceControl());
m_tracesControl.back().initProjector(traceData.m_projectionType); TraceControl *traceControl = m_tracesControl.back();
traceControl->initProjector(traceData.m_projectionType);
resize(traceSize); resize(traceSize);
} }
@ -763,8 +769,9 @@ private:
void changeTrace(const TraceData& traceData, uint32_t traceIndex) void changeTrace(const TraceData& traceData, uint32_t traceIndex)
{ {
if (traceIndex < m_tracesControl.size()) { if (traceIndex < m_tracesControl.size()) {
m_tracesControl[traceIndex].releaseProjector(); TraceControl *traceControl = m_tracesControl[traceIndex];
m_tracesControl[traceIndex].initProjector(traceData.m_projectionType); traceControl->releaseProjector();
traceControl->initProjector(traceData.m_projectionType);
m_tracesData[traceIndex] = traceData; m_tracesData[traceIndex] = traceData;
} }
} }
@ -773,11 +780,14 @@ private:
{ {
if (traceIndex < m_tracesControl.size()) if (traceIndex < m_tracesControl.size())
{ {
qDebug("ScopeVisNG::removeTrace");
m_traces[0].erase(m_traces[0].begin() + traceIndex); m_traces[0].erase(m_traces[0].begin() + traceIndex);
m_traces[1].erase(m_traces[1].begin() + traceIndex); m_traces[1].erase(m_traces[1].begin() + traceIndex);
m_tracesControl[traceIndex].releaseProjector(); TraceControl *traceControl = m_tracesControl[traceIndex];
traceControl->releaseProjector();
m_tracesControl.erase(m_tracesControl.begin() + traceIndex); m_tracesControl.erase(m_tracesControl.begin() + traceIndex);
m_tracesData.erase(m_tracesData.begin() + traceIndex); m_tracesData.erase(m_tracesData.begin() + traceIndex);
delete traceControl;
resize(m_traceSize); // reallocate pointers resize(m_traceSize); // reallocate pointers
} }
@ -792,19 +802,24 @@ private:
int nextControlIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesControl.size()); int nextControlIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesControl.size());
int nextDataIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesData.size()); // should be the same int nextDataIndex = (traceIndex + (upElseDown ? 1 : -1)) % (m_tracesData.size()); // should be the same
m_tracesControl[traceIndex].releaseProjector(); TraceControl *traceControl = m_tracesControl[traceIndex];
m_tracesControl[nextControlIndex].releaseProjector(); TraceControl *nextTraceControl = m_tracesControl[nextControlIndex];
TraceControl nextControl = m_tracesControl[nextControlIndex]; traceControl->releaseProjector();
m_tracesControl[nextControlIndex] = m_tracesControl[traceIndex]; nextTraceControl->releaseProjector();
m_tracesControl[traceIndex] = nextControl;
m_tracesControl[nextControlIndex] = traceControl;
m_tracesControl[traceIndex] = nextTraceControl;
TraceData nextData = m_tracesData[nextDataIndex]; TraceData nextData = m_tracesData[nextDataIndex];
m_tracesData[nextDataIndex] = m_tracesData[traceIndex]; m_tracesData[nextDataIndex] = m_tracesData[traceIndex];
m_tracesData[traceIndex] = nextData; m_tracesData[traceIndex] = nextData;
m_tracesControl[traceIndex].initProjector(m_tracesData[traceIndex].m_projectionType); traceControl = m_tracesControl[traceIndex];
m_tracesControl[nextControlIndex].initProjector(m_tracesData[nextDataIndex].m_projectionType); nextTraceControl = m_tracesControl[nextControlIndex];
traceControl->initProjector(m_tracesData[traceIndex].m_projectionType);
nextTraceControl->initProjector(m_tracesData[nextDataIndex].m_projectionType);
} }
void resize(int traceSize) void resize(int traceSize)
@ -838,9 +853,9 @@ private:
{ {
evenOddIndex = !evenOddIndex; evenOddIndex = !evenOddIndex;
for (std::vector<TraceControl>::iterator it = m_tracesControl.begin(); it != m_tracesControl.end(); ++it) for (std::vector<TraceControl*>::iterator it = m_tracesControl.begin(); it != m_tracesControl.end(); ++it)
{ {
it->m_traceCount[currentBufferIndex()] = 0; (*it)->m_traceCount[currentBufferIndex()] = 0;
} }
} }