From 10bd5c779a8ae66cd7ca41bdbfde0130f383f709 Mon Sep 17 00:00:00 2001 From: "Andrew D. Zonenberg" Date: Sun, 28 Aug 2022 00:09:46 -0700 Subject: [PATCH] Refactored data model for filters starting with M. See #650. --- scopeprotocols/MDIODecoder.cpp | 12 ++-- scopeprotocols/MagnitudeFilter.cpp | 60 +++++++++++++------- scopeprotocols/MilStd1553Decoder.cpp | 19 +++++-- scopeprotocols/MovingAverageFilter.cpp | 72 ++++++++++++++++-------- scopeprotocols/MultimeterTrendFilter.cpp | 4 ++ scopeprotocols/MultiplyFilter.cpp | 57 ++++++++++++++----- 6 files changed, 156 insertions(+), 68 deletions(-) diff --git a/scopeprotocols/MDIODecoder.cpp b/scopeprotocols/MDIODecoder.cpp index 815e9c7d..d78f5267 100644 --- a/scopeprotocols/MDIODecoder.cpp +++ b/scopeprotocols/MDIODecoder.cpp @@ -91,8 +91,10 @@ void MDIODecoder::Refresh() } //Get the input data - auto mdio = GetDigitalInputWaveform(0); - auto mdc = GetDigitalInputWaveform(1); + auto mdio = GetInputWaveform(0); + auto mdc = GetInputWaveform(1); + mdio->PrepareForCpuAccess(); + mdc->PrepareForCpuAccess(); int phytype = m_parameters[m_typename].GetIntVal(); @@ -101,14 +103,15 @@ void MDIODecoder::Refresh() cap->m_timescale = 1; //SampleOnRisingEdges() gives us fs level timestamps cap->m_startTimestamp = mdc->m_startTimestamp; cap->m_startFemtoseconds = mdc->m_startFemtoseconds; + cap->PrepareForCpuAccess(); //Maintain MMD state across transactions int mmd_dev = 0; bool mmd_is_reg = false; //Sample the data stream at each clock edge - DigitalWaveform dmdio; - SampleOnRisingEdges(mdio, mdc, dmdio); + SparseDigitalWaveform dmdio; + SampleOnRisingEdgesBase(mdio, mdc, dmdio); size_t dlen = dmdio.m_samples.size(); for(size_t i=0; iMarkModifiedFromCpu(); } vector MDIODecoder::GetHeaders() diff --git a/scopeprotocols/MagnitudeFilter.cpp b/scopeprotocols/MagnitudeFilter.cpp index 0cf53116..497e1a72 100644 --- a/scopeprotocols/MagnitudeFilter.cpp +++ b/scopeprotocols/MagnitudeFilter.cpp @@ -71,35 +71,55 @@ string MagnitudeFilter::GetProtocolName() void MagnitudeFilter::Refresh() { //Make sure we've got valid inputs - if(!VerifyAllInputsOKAndAnalog()) + if(!VerifyAllInputsOK()) { SetData(NULL, 0); return; } //Get the input data - auto a = GetAnalogInputWaveform(0); - auto b = GetAnalogInputWaveform(1); - auto len = min(a->m_samples.size(), b->m_samples.size()); + auto a = GetInputWaveform(0); + auto b = GetInputWaveform(1); + a->PrepareForCpuAccess(); + b->PrepareForCpuAccess(); + auto len = min(a->size(), b->size()); //Copy Y axis units from input SetYAxisUnits(m_inputs[0].GetYAxisUnits(), 0); - //Set up the output waveform - auto cap = new AnalogWaveform; - cap->Resize(len); - cap->CopyTimestamps(a); + auto ua = dynamic_cast(a); + auto ub = dynamic_cast(b); + auto sa = dynamic_cast(a); + auto sb = dynamic_cast(b); - float* fa = (float*)__builtin_assume_aligned(&a->m_samples[0], 16); - float* fb = (float*)__builtin_assume_aligned(&b->m_samples[0], 16); - float* fdst = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16); - for(size_t i=0; im_timescale = a->m_timescale; - cap->m_startTimestamp = a->m_startTimestamp; - cap->m_startFemtoseconds = a->m_startFemtoseconds; - - SetData(cap, 0); + if(ua && ub) + { + //Set up the output waveform + auto cap = SetupEmptyUniformAnalogOutputWaveform(a, 0); + cap->Resize(len); + cap->PrepareForCpuAccess(); + + float* fa = (float*)__builtin_assume_aligned(ua->m_samples.GetCpuPointer(), 16); + float* fb = (float*)__builtin_assume_aligned(ub->m_samples.GetCpuPointer(), 16); + float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16); + for(size_t i=0; iMarkModifiedFromCpu(); + } + else if(sa && sb) + { + //Set up the output waveform + auto cap = SetupSparseOutputWaveform(sa, 0, 0, 0); + cap->Resize(len); + cap->PrepareForCpuAccess(); + + float* fa = (float*)__builtin_assume_aligned(sa->m_samples.GetCpuPointer(), 16); + float* fb = (float*)__builtin_assume_aligned(sb->m_samples.GetCpuPointer(), 16); + float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16); + for(size_t i=0; iMarkModifiedFromCpu(); + } } diff --git a/scopeprotocols/MilStd1553Decoder.cpp b/scopeprotocols/MilStd1553Decoder.cpp index 7315293a..656b6caf 100644 --- a/scopeprotocols/MilStd1553Decoder.cpp +++ b/scopeprotocols/MilStd1553Decoder.cpp @@ -84,14 +84,18 @@ void MilStd1553Decoder::Refresh() ClearPackets(); //Get the input data - if(!VerifyAllInputsOKAndAnalog()) + if(!VerifyAllInputsOK()) { SetData(NULL, 0); return; } - auto din = GetAnalogInputWaveform(0); - size_t len = din->m_samples.size(); + auto din = GetInputWaveform(0); + din->PrepareForCpuAccess(); + size_t len = din->size(); + + auto sdin = dynamic_cast(din); + auto udin = dynamic_cast(din); //Copy our time scales from the input auto cap = new MilStd1553Waveform; @@ -100,6 +104,7 @@ void MilStd1553Decoder::Refresh() cap->m_startFemtoseconds = din->m_startFemtoseconds; cap->m_triggerPhase = din->m_triggerPhase; SetData(cap, 0); + cap->PrepareForCpuAccess(); enum { @@ -151,18 +156,18 @@ void MilStd1553Decoder::Refresh() Packet* pack = NULL; for(size_t i=0; im_offsets[i]; + int64_t timestamp = ::GetOffset(sdin, udin, i); int64_t duration = timestamp - tbitstart; //Determine the current line state bool current_bit = last_bit; bool valid = false; - if(din->m_samples[i] > high) + if(GetValue(sdin, udin, i) > high) { current_bit = true; valid = true; } - else if(din->m_samples[i] < low) + else if(GetValue(sdin, udin, i) < low) { current_bit = false; valid = true; @@ -671,6 +676,8 @@ void MilStd1553Decoder::Refresh() last_bit = current_bit; } + + cap->MarkModifiedFromCpu(); } Gdk::Color MilStd1553Waveform::GetColor(size_t i) diff --git a/scopeprotocols/MovingAverageFilter.cpp b/scopeprotocols/MovingAverageFilter.cpp index 2f73ed91..7a8ab08e 100644 --- a/scopeprotocols/MovingAverageFilter.cpp +++ b/scopeprotocols/MovingAverageFilter.cpp @@ -72,15 +72,16 @@ string MovingAverageFilter::GetProtocolName() void MovingAverageFilter::Refresh() { - if(!VerifyAllInputsOKAndAnalog()) + if(!VerifyAllInputsOK()) { SetData(NULL, 0); return; } //Get the input data - auto din = GetAnalogInputWaveform(0); - size_t len = din->m_samples.size(); + auto din = GetInputWaveform(0); + din->PrepareForCpuAccess(); + size_t len = din->size(); size_t depth = m_parameters[m_depthname].GetIntVal(); if(len < depth) { @@ -91,27 +92,52 @@ void MovingAverageFilter::Refresh() m_xAxisUnit = m_inputs[0].m_channel->GetXAxisUnits(); SetYAxisUnits(m_inputs[0].GetYAxisUnits(), 0); - //Do the average - auto cap = new AnalogWaveform; - size_t nsamples = len - depth; size_t off = depth/2; - cap->Resize(nsamples); - //#pragma omp parallel for - for(size_t i=0; i(din); + auto udin = dynamic_cast(din); + + if(sdin) { - float v = 0; - for(size_t j=0; jm_samples[i+j]; - v /= depth; - - cap->m_offsets[i] = din->m_offsets[i+off]; - cap->m_durations[i] = din->m_durations[i+off]; - cap->m_samples[i] = v; + //Do the average + auto cap = SetupSparseOutputWaveform(sdin, 0, off, off); + cap->PrepareForCpuAccess(); + + //#pragma omp parallel for + for(size_t i=0; im_samples[i+j]; + v /= depth; + + cap->m_offsets[i] = sdin->m_offsets[i+off]; + cap->m_durations[i] = sdin->m_durations[i+off]; + cap->m_samples[i] = v; + } + SetData(cap, 0); + + cap->MarkModifiedFromCpu(); + } + else + { + //Do the average + auto cap = SetupEmptyUniformAnalogOutputWaveform(udin, 0); + cap->PrepareForCpuAccess(); + cap->Resize(nsamples); + //#pragma omp parallel for + for(size_t i=0; im_samples[i+j]; + v /= depth; + + cap->m_samples[i] = v; + } + SetData(cap, 0); + + cap->MarkModifiedFromCpu(); } - SetData(cap, 0); - - //Copy our time scales from the input - cap->m_timescale = din->m_timescale; - cap->m_startTimestamp = din->m_startTimestamp; - cap->m_startFemtoseconds = din->m_startFemtoseconds; } diff --git a/scopeprotocols/MultimeterTrendFilter.cpp b/scopeprotocols/MultimeterTrendFilter.cpp index dae0e6c0..066e802c 100644 --- a/scopeprotocols/MultimeterTrendFilter.cpp +++ b/scopeprotocols/MultimeterTrendFilter.cpp @@ -130,6 +130,8 @@ void MultimeterTrendFilter::OnDataReady(double prival, double secval) void MultimeterTrendFilter::AddSample(SparseAnalogWaveform* wfm, double value, double now) { + wfm->PrepareForCpuAccess(); + //Remove old samples size_t nmax = 4096; while(wfm->m_samples.size() > nmax) @@ -161,4 +163,6 @@ void MultimeterTrendFilter::AddSample(SparseAnalogWaveform* wfm, double value, d len = wfm->m_samples.size(); for(size_t i=0; im_offsets[i] -= dt; + + wfm->MarkModifiedFromCpu(); } diff --git a/scopeprotocols/MultiplyFilter.cpp b/scopeprotocols/MultiplyFilter.cpp index 0e46d66f..e1d28a86 100644 --- a/scopeprotocols/MultiplyFilter.cpp +++ b/scopeprotocols/MultiplyFilter.cpp @@ -71,29 +71,56 @@ string MultiplyFilter::GetProtocolName() void MultiplyFilter::Refresh() { //Make sure we've got valid inputs - if(!VerifyAllInputsOKAndAnalog()) + if(!VerifyAllInputsOK()) { SetData(NULL, 0); return; } //Get the input data - auto a = GetAnalogInputWaveform(0); - auto b = GetAnalogInputWaveform(1); - auto len = min(a->m_samples.size(), b->m_samples.size()); + auto a = GetInputWaveform(0); + auto b = GetInputWaveform(1); + auto len = min(a->size(), b->size()); + a->PrepareForCpuAccess(); + b->PrepareForCpuAccess(); //Multiply the units SetYAxisUnits(m_inputs[0].GetYAxisUnits() * m_inputs[1].GetYAxisUnits(), 0); - //Set up the output waveform - auto cap = SetupOutputWaveform(a, 0, 0, 0); - cap->m_samples.resize(len); - cap->m_offsets.resize(len); - cap->m_durations.resize(len); - - float* fa = (float*)__builtin_assume_aligned(&a->m_samples[0], 16); - float* fb = (float*)__builtin_assume_aligned(&b->m_samples[0], 16); - float* fdst = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16); - for(size_t i=0; i(a); + auto sb = dynamic_cast(b); + auto ua = dynamic_cast(a); + auto ub = dynamic_cast(b); + + if(sa && sb) + { + //Set up the output waveform + auto cap = SetupSparseOutputWaveform(sa, 0, 0, 0); + cap->Resize(len); + cap->PrepareForCpuAccess(); + + float* fa = (float*)__builtin_assume_aligned(sa->m_samples.GetCpuPointer(), 16); + float* fb = (float*)__builtin_assume_aligned(sb->m_samples.GetCpuPointer(), 16); + float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16); + for(size_t i=0; iMarkModifiedFromCpu(); + } + else if(ua && ub) + { + //Set up the output waveform + auto cap = SetupEmptyUniformAnalogOutputWaveform(sa, 0); + cap->Resize(len); + cap->PrepareForCpuAccess(); + + float* fa = (float*)__builtin_assume_aligned(ua->m_samples.GetCpuPointer(), 16); + float* fb = (float*)__builtin_assume_aligned(ub->m_samples.GetCpuPointer(), 16); + float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16); + for(size_t i=0; iMarkModifiedFromCpu(); + } }