68 ,
m_rev(wfm->m_revision)
127 const std::string& color,
129 Unit xunit = Unit::UNIT_FS);
134 {
return m_filters; }
138 {
return m_filters.size(); }
148 m_filters.erase(
this);
155 const std::string& name,
157 uint8_t flags = 0)
override;
165 {
AddStream(
Unit(Unit::UNIT_COUNTS), name, Stream::STREAM_TYPE_PROTOCOL); }
173 {
AddStream(
Unit(Unit::UNIT_COUNTS), name, Stream::STREAM_TYPE_DIGITAL); }
199 virtual void AddRef()
override;
200 virtual void Release()
override;
229 virtual void Refresh()
override;
232 virtual void Refresh(vk::raii::CommandBuffer& cmdBuf, std::shared_ptr<QueueHandle> queue)
override;
239 virtual float GetVoltageRange(
size_t stream)
override;
240 virtual void SetVoltageRange(
float range,
size_t stream)
override;
242 virtual float GetOffset(
size_t stream)
override;
243 virtual void SetOffset(
float offset,
size_t stream)
override;
260 virtual void LoadInputs(
const YAML::Node& node,
IDTable& table)
override;
352 static float InterpolateTime(T* cap,
size_t a,
float voltage)
354 AssertTypeIsAnalogWaveform(cap);
357 float fa = cap->m_samples[a];
358 float fb = cap->m_samples[a+1];
359 bool ag = (fa > voltage);
360 bool bg = (fb > voltage);
361 if( (ag && bg) || (!ag && !bg) )
365 float slope = (fb - fa);
366 float delta = voltage - fa;
367 return delta / slope;
373 return InterpolateTime(s, a, voltage);
375 return InterpolateTime(u, a, voltage);
381 static float InterpolateTime(
386 size_t a,
float voltage)
389 return InterpolateTime(sp, sn, a, voltage);
391 return InterpolateTime(up, un, a, voltage);
405 static void GetMinMaxVoltage(T* cap,
float& vmin,
float& vmax)
407 AssertTypeIsAnalogWaveform(cap);
411 for(
float f : cap->m_samples)
427 AssertTypeIsAnalogWaveform(cap);
431 for(
float f : cap->m_samples)
457 AssertTypeIsAnalogWaveform(cap);
460 float tmp = -FLT_MAX;
461 for(
float f : cap->m_samples)
487 AssertTypeIsAnalogWaveform(cap);
491 float delta = vmax - vmin;
492 const int nbins = 100;
498 for(
int i=0; i<(nbins/4); i++)
507 float fbin = (idx + 0.5f)/nbins;
508 return fbin*delta + vmin;
529 AssertTypeIsAnalogWaveform(cap);
533 float delta = vmax - vmin;
534 const int nbins = 100;
540 for(
int i=(nbins*3)/4; i<nbins; i++)
549 float fbin = (idx + 0.5f)/nbins;
550 return fbin*delta + vmin;
571 AssertTypeIsAnalogWaveform(cap);
576 for(
float f : cap->m_samples)
578 return sum / cap->m_samples.size();
603 static std::vector<size_t>
MakeHistogram(T* cap,
float low,
float high,
size_t bins)
605 AssertTypeIsAnalogWaveform(cap);
607 std::vector<size_t> ret;
608 for(
size_t i=0; i<bins; i++)
615 float delta = high-low;
617 for(
float v : cap->m_samples)
619 float fbin = (v-low) / delta;
620 size_t bin = floor(fbin * bins);
624 bin = std::min(bin, bins-1);
660 static std::vector<size_t> MakeHistogramClipped(T* cap,
float low,
float high,
size_t bins)
662 AssertTypeIsAnalogWaveform(cap);
664 std::vector<size_t> ret;
665 for(
size_t i=0; i<bins; i++)
672 float delta = high-low;
674 for(
float v : cap->m_samples)
676 float fbin = (v-low) / delta;
678 size_t bin =
static_cast<ssize_t
>(floor(fbin * bins));
699 template<
class T,
class R,
class S>
704 AssertTypeIsDigitalWaveform(clock);
705 AssertSampleTypesAreSame(data, &samples);
714 size_t len = clock->size();
715 size_t dlen = data->size();
718 for(
size_t i=1; i<len; i++)
721 if(clock->m_samples[i] == clock->m_samples[i-1])
726 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
739 FillDurationsAVX2(samples);
742 FillDurationsGeneric(samples);
774 SampleOnAnyEdges(udata, uclock, samples);
775 else if(udata && sclock)
776 SampleOnAnyEdges(udata, sclock, samples);
777 else if(sdata && sclock)
778 SampleOnAnyEdges(sdata, sclock, samples);
779 else if(sdata && uclock)
780 SampleOnAnyEdges(sdata, uclock, samples);
795 template<
class T,
class R,
class S>
800 AssertTypeIsDigitalWaveform(clock);
801 AssertTypeIsSparseWaveform(&samples);
802 AssertSampleTypesAreSame(data, &samples);
810 size_t len = clock->size();
811 size_t dlen = data->size();
814 for(
size_t i=1; i<len; i++)
817 if(!(clock->m_samples[i] && !clock->m_samples[i-1]))
822 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
835 FillDurationsAVX2(samples);
838 FillDurationsGeneric(samples);
870 SampleOnRisingEdges(udata, uclock, samples);
871 else if(udata && sclock)
872 SampleOnRisingEdges(udata, sclock, samples);
873 else if(sdata && sclock)
874 SampleOnRisingEdges(sdata, sclock, samples);
875 else if(sdata && uclock)
876 SampleOnRisingEdges(sdata, uclock, samples);
891 template<
class T,
class R,
class S>
896 AssertTypeIsDigitalWaveform(clock);
897 AssertTypeIsSparseWaveform(&samples);
898 AssertSampleTypesAreSame(data, &samples);
906 size_t len = clock->size();
907 size_t dlen = data->size();
910 for(
size_t i=1; i<len; i++)
913 if(!(!clock->m_samples[i] && clock->m_samples[i-1]))
918 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
931 FillDurationsAVX2(samples);
934 FillDurationsGeneric(samples);
950 template<
class T,
class R>
955 AssertTypeIsAnalogWaveform(data);
956 AssertTypeIsDigitalWaveform(clock);
964 size_t len = clock->size();
965 size_t dlen = data->size();
968 for(
size_t i=1; i<len; i++)
971 if(clock->m_samples[i] == clock->m_samples[i-1])
976 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
983 int64_t delta = clkstart - tsample;
984 float frac = delta * 1.0 / data->m_timescale;
994 FillDurationsAVX2(samples);
997 FillDurationsGeneric(samples);
1029 SampleOnAnyEdgesWithInterpolation(udata, uclock, samples);
1030 else if(udata && sclock)
1031 SampleOnAnyEdgesWithInterpolation(udata, sclock, samples);
1032 else if(sdata && sclock)
1033 SampleOnAnyEdgesWithInterpolation(sdata, sclock, samples);
1034 else if(sdata && uclock)
1035 SampleOnAnyEdgesWithInterpolation(sdata, uclock, samples);
1072 static void FindPeaks(
UniformAnalogWaveform* data,
float peak_threshold, std::vector<int64_t>& peak_indices);
1073 static void FindPeaks(
SparseAnalogWaveform* data,
float peak_threshold, std::vector<int64_t>& peak_indices);
1075 static void FindZeroCrossingsBase(
WaveformBase* data,
float threshold, std::vector<int64_t>& edges)
1095 static void FindFallingEdges(
1099 FindFallingEdges(sdata, edges);
1101 FindFallingEdges(udata, edges);
1104 static void FindPeaks(
1108 FindPeaks(sdata, peak_threshold, peak_indices);
1110 FindPeaks(udata, peak_threshold, peak_indices);
1131 static void ClearAnalysisCache();
1141 sigc::signal<void()> signal_outputsChanged()
1156 typedef Filter* (*CreateProcType)(
const std::string&);
1157 static void DoAddDecoderClass(
const std::string& name, CreateProcType proc);
1159 static void EnumProtocols(std::vector<std::string>& names);
1160 static Filter* CreateFilter(
const std::string& protocol,
const std::string& color =
"#ffffff");
1164 typedef std::map< std::string, CreateProcType > CreateMapType;
1165 static CreateMapType m_createprocs;
1168 static std::set<Filter*> m_filters;
1171 static std::map<std::string, unsigned int> m_instanceCount;
1174 static std::mutex m_cacheMutex;
1175 static std::map<std::pair<WaveformBase*, float>, std::vector<int64_t> > m_zeroCrossingCache;
1178#define PROTOCOL_DECODER_INITPROC(T) \
1179 static Filter* CreateInstance(const std::string& color) \
1181 return new T(color); \
1183 virtual std::string GetProtocolDisplayName() override \
1184 { return GetProtocolName(); }
1186#define AddDecoderClass(T) Filter::DoAddDecoderClass(T::GetProtocolName(), T::CreateInstance)
Declaration of FlowGraphNode.
Declaration of OscilloscopeChannel.
A buffer of memory which may be used by GPU acceleration.
Definition: AcceleratorBuffer.h:158
void push_back(const T &value)
Adds a new element to the end of the container, allocating space if needed.
Definition: AcceleratorBuffer.h:720
Abstract base class for all filter graph blocks which are not physical instrument channels.
Definition: Filter.h:95
void AddDigitalStream(const std::string &name)
Helper method for constructors that adds a new STREAM_TYPE_DIGITAL output stream.
Definition: Filter.h:172
static float GetMaxVoltage(SparseAnalogWaveform *s, UniformAnalogWaveform *u)
Gets the lowest voltage of a waveform.
Definition: Filter.h:472
virtual void Refresh() override
Evaluates a filter graph node.
Definition: Filter.cpp:816
virtual size_t AddStream(Unit yunit, const std::string &name, Stream::StreamType stype, uint8_t flags=0) override
Adds a new data stream to the channel.
Definition: Filter.cpp:1513
void UseDefaultName(bool use)
Specifies whether we're using an auto-generated name or not.
Definition: Filter.h:185
bool VerifyAllInputsOKAndSparseOrUniformDigital()
Returns true if every input to the filter is non-NULL and has a non-empty, digital waveform present.
Definition: Filter.cpp:241
SparseDigitalWaveform * SetupEmptySparseDigitalOutputWaveform(WaveformBase *din, size_t stream)
Sets up an digital output waveform and copies basic metadata from the input.
Definition: Filter.cpp:1163
static void FindZeroCrossings(SparseAnalogWaveform *data, float threshold, std::vector< int64_t > &edges)
Find zero crossings in a waveform, interpolating as necessary.
Definition: Filter.cpp:395
__attribute__((noinline)) static float GetAvgVoltage(T *cap)
Gets the average voltage of a waveform.
Definition: Filter.h:568
static void FindRisingEdges(UniformAnalogWaveform *data, float threshold, std::vector< int64_t > &edges)
Find rising edges in a waveform, interpolating to sub-sample resolution as necessary.
Definition: Filter.cpp:318
virtual bool ShouldPersistWaveform() override
Determine whether the channel's waveform(s) should be persisted to a session file.
Definition: Filter.cpp:937
bool VerifyInputOK(size_t i, bool allowEmpty=false)
Returns true if a given input to the filter is non-NULL (and, optionally has a non-empty waveform pre...
Definition: Filter.cpp:130
static int64_t GetNextEventTimestamp(SparseWaveformBase *wfm, size_t i, size_t len, int64_t timestamp)
Gets the timestamp of the next event (if any) on a waveform.
Definition: Filter.cpp:1271
static void PrepareForCpuAccess(SparseWaveform< T > *s, UniformWaveform< T > *u)
Prepares a sparse or uniform analog waveform for CPU access.
Definition: Filter.h:1042
__attribute__((noinline)) static void SampleOnRisingEdges(T *data
Samples a waveform on the rising edges of a clock.
__attribute__((noinline)) static void SampleOnAnyEdges(T *data
Samples a waveform on all edges of a clock.
static std::vector< size_t > MakeHistogram(SparseAnalogWaveform *s, UniformAnalogWaveform *u, float low, float high, size_t bins)
Makes a histogram from a waveform with the specified number of bins.
Definition: Filter.h:640
virtual void ClearStreams() override
Clears out any existing streams.
Definition: Filter.cpp:1506
static void AdvanceToTimestamp(SparseWaveformBase *wfm, size_t &i, size_t len, int64_t timestamp)
Advance the waveform to a given timestamp.
Definition: Filter.cpp:1297
UniformAnalogWaveform * SetupEmptyUniformAnalogOutputWaveform(WaveformBase *din, size_t stream, bool clear=true)
Sets up an analog output waveform and copies basic metadata from the input.
Definition: Filter.cpp:1055
__attribute__((noinline)) static void SampleOnAnyEdgesWithInterpolation(T *data
Samples an analog waveform on all edges of a clock, interpolating linearly to get sub-sample accuracy...
virtual void ClearSweeps()
Clears any integrated data from past triggers (e.g. eye patterns).
Definition: Filter.cpp:80
static size_t GetNumInstances()
Get all currently existing filters.
Definition: Filter.h:137
__attribute__((noinline)) static void SampleOnRisingEdgesBase(WaveformBase *data
Samples a waveform on rising edges of a clock.
static float GetMinVoltage(SparseAnalogWaveform *s, UniformAnalogWaveform *u)
Gets the lowest voltage of a waveform.
Definition: Filter.h:442
SparseAnalogWaveform * SetupEmptySparseAnalogOutputWaveform(WaveformBase *din, size_t stream, bool clear=true)
Sets up an analog output waveform and copies basic metadata from the input.
Definition: Filter.cpp:1092
Category m_category
Category this filter should be displayed under.
Definition: Filter.h:267
static void PrepareForGpuAccess(SparseWaveform< T > *s, UniformWaveform< T > *u)
Prepares a sparse or uniform analog waveform for GPU access.
Definition: Filter.h:1054
bool VerifyAllInputsOKAndSparseDigital()
Returns true if every input to the filter is non-NULL and has a non-empty, sparsely sampled digital w...
Definition: Filter.cpp:217
virtual void SetDefaultName()
Sets the name of a filter based on its inputs.
Definition: Filter.cpp:1374
std::vector< float > m_ranges
Y axis range of each output stream.
Definition: Filter.h:248
void HideFromList()
Removes this filter from the global list.
Definition: Filter.h:146
static std::set< Filter * > GetAllInstances()
Get all currently existing filters.
Definition: Filter.h:133
unsigned int m_instanceNum
Instance number (for auto naming)
Definition: Filter.h:1153
__attribute__((noinline)) static float GetMinVoltage(T *cap)
Gets the lowest voltage of a waveform.
Definition: Filter.h:424
static int64_t GetNextEventTimestampScaled(SparseWaveformBase *wfm, size_t i, size_t len, int64_t timestamp)
Gets the timestamp of the next event (if any) on a waveform.
Definition: Filter.cpp:1318
UniformDigitalWaveform * SetupEmptyUniformDigitalOutputWaveform(WaveformBase *din, size_t stream)
Sets up an digital output waveform and copies basic metadata from the input.
Definition: Filter.cpp:1128
std::vector< float > m_offsets
Y axis offset of each output stream.
Definition: Filter.h:251
bool m_usingDefault
If true, we're using an auto-generated name.
Definition: Filter.h:270
static int64_t GetNextEventTimestamp(SparseWaveformBase *swfm, UniformWaveformBase *uwfm, size_t i, size_t len, int64_t timestamp)
Gets the timestamp of the next sample in a waveform, which may be sparse or uniform.
Definition: Filter.h:286
static void AdvanceToTimestampScaled(SparseWaveformBase *wfm, size_t &i, size_t len, int64_t timestamp)
Advance the waveform to a given timestamp.
Definition: Filter.cpp:1344
__attribute__((noinline)) static std
Makes a histogram from a waveform with the specified number of bins.
Definition: Filter.h:602
static float GetTopVoltage(SparseAnalogWaveform *swfm, UniformAnalogWaveform *uwfm)
Gets the top voltage of a waveform which may be sparse or uniform.
Definition: Filter.h:556
bool IsUsingDefaultName()
Return true if we're using an autogenerated name, false if customized.
Definition: Filter.h:193
Category GetCategory()
Returns the category for displaying this filter in the browser.
Definition: Filter.h:210
__attribute__((noinline)) static float GetBaseVoltage(T *cap)
Gets the most probable "0" level for a digital waveform.
Definition: Filter.h:484
Category
Category the filter should be displayed under in the GUI.
Definition: Filter.h:108
__attribute__((noinline)) static float GetTopVoltage(T *cap)
Gets the most probable "1" level for a digital waveform.
Definition: Filter.h:526
SparseDigitalWaveform * SetupSparseDigitalOutputWaveform(SparseWaveformBase *din, size_t stream, size_t skipstart, size_t skipend)
Sets up a digital output waveform and copies timebase configuration from the input.
Definition: Filter.cpp:1235
__attribute__((noinline)) static void SampleOnAnyEdgesBase(WaveformBase *data
Samples a waveform on all edges of a clock.
__attribute__((noinline)) static float GetMaxVoltage(T *cap)
Gets the highest voltage of a waveform.
Definition: Filter.h:454
static float InterpolateValue(SparseAnalogWaveform *cap, size_t index, float frac_ticks)
Interpolates the actual value of a point between two samples.
Definition: Filter.cpp:1002
virtual void LoadParameters(const YAML::Node &node, IDTable &table) override
Load configuration from a save file.
Definition: Filter.cpp:876
sigc::signal< void()> m_outputsChangedSignal
Signal emitted when the set of output streams changes.
Definition: Filter.h:1146
__attribute__((noinline)) static void GetMinMaxVoltage(T *cap
Gets the lowest and highest voltage of a waveform.
__attribute__((noinline)) static void SampleOnAnyEdgesBaseWithInterpolation(WaveformBase *data
Samples an analog waveform on all edges of a clock, interpolating linearly to get sub-sample accuracy...
static float GetAvgVoltage(SparseAnalogWaveform *swfm, UniformAnalogWaveform *uwfm)
Gets the average voltage of a waveform which may be sparse or uniform.
Definition: Filter.h:584
SparseAnalogWaveform * SetupSparseOutputWaveform(SparseWaveformBase *din, size_t stream, size_t skipstart, size_t skipend)
Sets up an analog output waveform and copies timebase configuration from the input.
Definition: Filter.cpp:1201
virtual std::string GetProtocolDisplayName()=0
Gets the display name of this protocol (for use in menus, save files, etc). Must be unique.
virtual void AutoscaleVertical(size_t stream)
Adjusts gain and offset such that the active waveform occupies the entire vertical area of the plot.
Definition: Filter.cpp:1523
static float GetBaseVoltage(SparseAnalogWaveform *swfm, UniformAnalogWaveform *uwfm)
Gets the base voltage of a waveform which may be sparse or uniform.
Definition: Filter.h:514
size_t GetRefCount()
Returns the current reference count.
Definition: Filter.h:203
bool VerifyAllInputsOKAndUniformAnalog()
Returns true if every input to the filter is non-NULL and has a non-empty, uniformly sampled analog w...
Definition: Filter.cpp:169
__attribute__((noinline)) static void SampleOnFallingEdges(T *data
Samples a waveform on the falling edges of a clock.
virtual YAML::Node SerializeConfiguration(IDTable &table) override
Serializes this trigger's configuration to a YAML string.
Definition: Filter.cpp:836
__attribute__((noinline)) static float InterpolateTime(T *cap
Interpolates the actual time of a threshold crossing between two samples.
bool VerifyAllInputsOKAndSparseAnalog()
Returns true if every input to the filter is non-NULL and has a non-empty, sparsely sampled analog wa...
Definition: Filter.cpp:193
bool VerifyAllInputsOK(bool allowEmpty=false)
Returns true if every input to the filter is non-NULL (and, optionally has a non-empty waveform prese...
Definition: Filter.cpp:155
void AddProtocolStream(const std::string &name)
Helper method for constructors that adds a new STREAM_TYPE_PROTOCOL output stream.
Definition: Filter.h:164
virtual bool NeedsConfig()
Determines if we need to display the configuration / setup dialog.
Definition: Filter.cpp:1494
Bidirectional table mapping integer IDs in scopesession files to object pointers.
Definition: IDTable.h:49
A single channel on an oscilloscope.
Definition: OscilloscopeChannel.h:49
size_t m_refcount
Number of references (channel is disabled when last ref is released)
Definition: OscilloscopeChannel.h:163
Wrapper around a Vulkan Queue, protected by mutex for thread safety.
Definition: QueueManager.h:53
StreamType
General data type stored in a stream.
Definition: Stream.h:58
A unit of measurement, plus conversion to pretty-printed output.
Definition: Unit.h:57
int64_t GetOffsetScaled(T *wfm, size_t i)
Returns the offset of a sample from the start of the waveform, in X axis units.
Definition: Waveform.h:702