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;
353 auto cap =
dynamic_cast<T*
>(
GetData(stream));
390 static float InterpolateTime(T* cap,
size_t a,
float voltage)
392 AssertTypeIsAnalogWaveform(cap);
395 float fa = cap->m_samples[a];
396 float fb = cap->m_samples[a+1];
397 bool ag = (fa > voltage);
398 bool bg = (fb > voltage);
399 if( (ag && bg) || (!ag && !bg) )
403 float slope = (fb - fa);
404 float delta = voltage - fa;
405 return delta / slope;
411 return InterpolateTime(s, a, voltage);
413 return InterpolateTime(u, a, voltage);
419 static float InterpolateTime(
424 size_t a,
float voltage)
427 return InterpolateTime(sp, sn, a, voltage);
429 return InterpolateTime(up, un, a, voltage);
443 static void GetMinMaxVoltage(T* cap,
float& vmin,
float& vmax)
445 AssertTypeIsAnalogWaveform(cap);
449 for(
float f : cap->m_samples)
465 AssertTypeIsAnalogWaveform(cap);
469 for(
float f : cap->m_samples)
495 AssertTypeIsAnalogWaveform(cap);
498 float tmp = -FLT_MAX;
499 for(
float f : cap->m_samples)
525 AssertTypeIsAnalogWaveform(cap);
529 float delta = vmax - vmin;
530 const int nbins = 100;
536 for(
int i=0; i<(nbins/4); i++)
545 float fbin = (idx + 0.5f)/nbins;
546 return fbin*delta + vmin;
567 AssertTypeIsAnalogWaveform(cap);
571 float delta = vmax - vmin;
572 const int nbins = 100;
578 for(
int i=(nbins*3)/4; i<nbins; i++)
587 float fbin = (idx + 0.5f)/nbins;
588 return fbin*delta + vmin;
609 AssertTypeIsAnalogWaveform(cap);
614 for(
float f : cap->m_samples)
616 return sum / cap->m_samples.size();
641 static std::vector<size_t>
MakeHistogram(T* cap,
float low,
float high,
size_t bins)
643 AssertTypeIsAnalogWaveform(cap);
645 std::vector<size_t> ret;
646 for(
size_t i=0; i<bins; i++)
653 float delta = high-low;
655 for(
float v : cap->m_samples)
657 float fbin = (v-low) / delta;
658 size_t bin = floor(fbin * bins);
662 bin = std::min(bin, bins-1);
698 static std::vector<size_t> MakeHistogramClipped(T* cap,
float low,
float high,
size_t bins)
700 AssertTypeIsAnalogWaveform(cap);
702 std::vector<size_t> ret;
703 for(
size_t i=0; i<bins; i++)
710 float delta = high-low;
712 for(
float v : cap->m_samples)
714 float fbin = (v-low) / delta;
716 size_t bin =
static_cast<ssize_t
>(floor(fbin * bins));
737 template<
class T,
class R,
class S>
742 AssertTypeIsDigitalWaveform(clock);
743 AssertSampleTypesAreSame(data, &samples);
750 size_t len = clock->size();
751 size_t dlen = data->size();
758 samples.
Resize(clock->size());
763 for(
size_t i=1; i<len; i++)
766 if(clock->m_samples[i] == clock->m_samples[i-1])
771 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
778 samples.
m_samples[nout] = data->m_samples[ndata];
786 samples.
Reserve(1 * 1024 * 1024);
791 for(
size_t i=1; i<len; i++)
794 if(clock->m_samples[i] == clock->m_samples[i-1])
799 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
813 FillDurationsAVX2(samples);
816 FillDurationsGeneric(samples);
848 SampleOnAnyEdges(udata, uclock, samples);
849 else if(udata && sclock)
850 SampleOnAnyEdges(udata, sclock, samples);
851 else if(sdata && sclock)
852 SampleOnAnyEdges(sdata, sclock, samples);
853 else if(sdata && uclock)
854 SampleOnAnyEdges(sdata, uclock, samples);
869 template<
class T,
class R,
class S>
874 AssertTypeIsDigitalWaveform(clock);
875 AssertTypeIsSparseWaveform(&samples);
876 AssertSampleTypesAreSame(data, &samples);
880 samples.
Reserve(1 * 1024 * 1024);
886 size_t len = clock->size();
887 size_t dlen = data->size();
890 for(
size_t i=1; i<len; i++)
893 if(!(clock->m_samples[i] && !clock->m_samples[i-1]))
898 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
911 FillDurationsAVX2(samples);
914 FillDurationsGeneric(samples);
946 SampleOnRisingEdges(udata, uclock, samples);
947 else if(udata && sclock)
948 SampleOnRisingEdges(udata, sclock, samples);
949 else if(sdata && sclock)
950 SampleOnRisingEdges(sdata, sclock, samples);
951 else if(sdata && uclock)
952 SampleOnRisingEdges(sdata, uclock, samples);
967 template<
class T,
class R,
class S>
972 AssertTypeIsDigitalWaveform(clock);
973 AssertTypeIsSparseWaveform(&samples);
974 AssertSampleTypesAreSame(data, &samples);
978 samples.
Reserve(1 * 1024 * 1024);
984 size_t len = clock->size();
985 size_t dlen = data->size();
988 for(
size_t i=1; i<len; i++)
991 if(!(!clock->m_samples[i] && clock->m_samples[i-1]))
996 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
1009 FillDurationsAVX2(samples);
1012 FillDurationsGeneric(samples);
1028 template<
class T,
class R>
1030 static void SampleOnAnyEdgesWithInterpolation(T* data, R* clock,
SparseAnalogWaveform& samples)
1033 AssertTypeIsAnalogWaveform(data);
1034 AssertTypeIsDigitalWaveform(clock);
1038 samples.
Reserve(1 * 1024 * 1024);
1044 size_t len = clock->size();
1045 size_t dlen = data->size();
1048 for(
size_t i=1; i<len; i++)
1051 if(clock->m_samples[i] == clock->m_samples[i-1])
1056 while( (ndata+1 < dlen) && (
GetOffsetScaled(data, ndata+1) < clkstart) )
1063 int64_t delta = clkstart - tsample;
1064 float frac = delta * 1.0 / data->m_timescale;
1074 FillDurationsAVX2(samples);
1077 FillDurationsGeneric(samples);
1109 SampleOnAnyEdgesWithInterpolation(udata, uclock, samples);
1110 else if(udata && sclock)
1111 SampleOnAnyEdgesWithInterpolation(udata, sclock, samples);
1112 else if(sdata && sclock)
1113 SampleOnAnyEdgesWithInterpolation(sdata, sclock, samples);
1114 else if(sdata && uclock)
1115 SampleOnAnyEdgesWithInterpolation(sdata, uclock, samples);
1144 static void FindZeroCrossings(
SparseAnalogWaveform* data,
float threshold, std::vector<int64_t>& edges);
1145 static void FindZeroCrossings(
UniformAnalogWaveform* data,
float threshold, std::vector<int64_t>& edges);
1152 static void FindPeaks(
UniformAnalogWaveform* data,
float peak_threshold, std::vector<int64_t>& peak_indices);
1153 static void FindPeaks(
SparseAnalogWaveform* data,
float peak_threshold, std::vector<int64_t>& peak_indices);
1155 static void FindZeroCrossingsBase(
WaveformBase* data,
float threshold, std::vector<int64_t>& edges)
1161 FindZeroCrossings(udata, threshold, edges);
1163 FindZeroCrossings(sdata, threshold, edges);
1175 static void FindFallingEdges(
1179 FindFallingEdges(sdata, edges);
1181 FindFallingEdges(udata, edges);
1184 static void FindPeaks(
1188 FindPeaks(sdata, peak_threshold, peak_indices);
1190 FindPeaks(udata, peak_threshold, peak_indices);
1193 static void FindZeroCrossings(
1197 FindZeroCrossings(sdata, threshold, edges);
1199 FindZeroCrossings(udata, threshold, edges);
1202 static void FindZeroCrossings(
1206 FindZeroCrossings(sdata, edges);
1208 FindZeroCrossings(udata, edges);
1211 static void ClearAnalysisCache();
1215 FILTER_TYPE_LOWPASS,
1216 FILTER_TYPE_HIGHPASS,
1217 FILTER_TYPE_BANDPASS,
1224 float stopbandAtten,
1227 static float Bessel(
float x);
1237 sigc::signal<void()> signal_outputsChanged()
1252 typedef Filter* (*CreateProcType)(
const std::string&);
1253 static void DoAddDecoderClass(
const std::string& name, CreateProcType proc);
1255 static void EnumProtocols(std::vector<std::string>& names);
1256 static Filter* CreateFilter(
const std::string& protocol,
const std::string& color =
"#ffffff");
1260 typedef std::map< std::string, CreateProcType > CreateMapType;
1261 static CreateMapType m_createprocs;
1264 static std::set<Filter*> m_filters;
1267 static std::map<std::string, unsigned int> m_instanceCount;
1270 static std::mutex m_cacheMutex;
1271 static std::map<std::pair<WaveformBase*, float>, std::vector<int64_t> > m_zeroCrossingCache;
1274#define PROTOCOL_DECODER_INITPROC(T) \
1275 static Filter* CreateInstance(const std::string& color) \
1277 return new T(color); \
1279 virtual std::string GetProtocolDisplayName() override \
1280 { return GetProtocolName(); }
1282#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:752
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:510
virtual void Refresh() override
Evaluates a filter graph node.
Definition: Filter.cpp:823
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:1598
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:1170
__attribute__((noinline)) static float GetAvgVoltage(T *cap)
Gets the average voltage of a waveform.
Definition: Filter.h:606
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:944
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:1278
T * SetupEmptyWaveform(WaveformBase *din, size_t stream, bool clear=true)
Sets up an empty output waveform and copies basic metadata from the input.
Definition: Filter.h:350
static void PrepareForCpuAccess(SparseWaveform< T > *s, UniformWaveform< T > *u)
Prepares a sparse or uniform analog waveform for CPU access.
Definition: Filter.h:1122
__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:678
virtual void ClearStreams() override
Clears out any existing streams.
Definition: Filter.cpp:1591
static void AdvanceToTimestamp(SparseWaveformBase *wfm, size_t &i, size_t len, int64_t timestamp)
Advance the waveform to a given timestamp.
Definition: Filter.cpp:1304
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:1062
__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:480
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:1099
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:1134
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:1459
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:1249
__attribute__((noinline)) static float GetMinVoltage(T *cap)
Gets the lowest voltage of a waveform.
Definition: Filter.h:462
static float Bessel(float x)
0th order Bessel function
Definition: Filter.cpp:1436
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:1325
UniformDigitalWaveform * SetupEmptyUniformDigitalOutputWaveform(WaveformBase *din, size_t stream)
Sets up an digital output waveform and copies basic metadata from the input.
Definition: Filter.cpp:1135
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:1351
__attribute__((noinline)) static std
Makes a histogram from a waveform with the specified number of bins.
Definition: Filter.h:640
static float GetTopVoltage(SparseAnalogWaveform *swfm, UniformAnalogWaveform *uwfm)
Gets the top voltage of a waveform which may be sparse or uniform.
Definition: Filter.h:594
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:522
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:564
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:1242
__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:492
static float InterpolateValue(SparseAnalogWaveform *cap, size_t index, float frac_ticks)
Interpolates the actual value of a point between two samples.
Definition: Filter.cpp:1009
virtual void LoadParameters(const YAML::Node &node, IDTable &table) override
Load configuration from a save file.
Definition: Filter.cpp:883
sigc::signal< void()> m_outputsChangedSignal
Signal emitted when the set of output streams changes.
Definition: Filter.h:1242
__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:622
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:1208
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:1608
static float GetBaseVoltage(SparseAnalogWaveform *swfm, UniformAnalogWaveform *uwfm)
Gets the base voltage of a waveform which may be sparse or uniform.
Definition: Filter.h:552
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:843
__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
static void CalculateFIRCoefficients(float fa, float fb, float stopbandAtten, FIRFilterType type, AcceleratorBuffer< float > &coefficients)
Calculates FIR coefficients.
Definition: Filter.cpp:1388
virtual bool NeedsConfig()
Determines if we need to display the configuration / setup dialog.
Definition: Filter.cpp:1579
Bidirectional table mapping integer IDs in scopesession files to object pointers.
Definition: IDTable.h:51
void SetData(WaveformBase *pNew, size_t stream)
Sets the waveform data for a given stream, replacing any previous waveform.
Definition: InstrumentChannel.cpp:139
WaveformBase * GetData(size_t stream)
Get the contents of a data stream.
Definition: InstrumentChannel.h:184
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:165
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:741