ngscopeclient v0.1
ThunderScopeOscilloscope.h
Go to the documentation of this file.
1/***********************************************************************************************************************
2* *
3* libscopehal *
4* *
5* Copyright (c) 2012-2025 Andrew D. Zonenberg and contributors *
6* All rights reserved. *
7* *
8* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the *
9* following conditions are met: *
10* *
11* * Redistributions of source code must retain the above copyright notice, this list of conditions, and the *
12* following disclaimer. *
13* *
14* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the *
15* following disclaimer in the documentation and/or other materials provided with the distribution. *
16* *
17* * Neither the name of the author nor the names of any contributors may be used to endorse or promote products *
18* derived from this software without specific prior written permission. *
19* *
20* THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
21* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL *
22* THE AUTHORS BE HELD LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
23* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
26* POSSIBILITY OF SUCH DAMAGE. *
27* *
28***********************************************************************************************************************/
29
37#ifndef ThunderScopeOscilloscope_h
38#define ThunderScopeOscilloscope_h
39
40#include "RemoteBridgeOscilloscope.h"
41#include "../xptools/HzClock.h"
42
49{
50public:
53
54 //not copyable or assignable
56 ThunderScopeOscilloscope& operator=(const ThunderScopeOscilloscope& rhs) =delete;
57
58public:
59
60 //Device information
61 virtual unsigned int GetInstrumentTypes() const override;
62 virtual void FlushConfigCache() override;
63
64 //Channel configuration
65 virtual std::vector<OscilloscopeChannel::CouplingType> GetAvailableCouplings(size_t i) override;
66 virtual double GetChannelAttenuation(size_t i) override;
67 virtual void SetChannelAttenuation(size_t i, double atten) override;
68 virtual unsigned int GetChannelBandwidthLimit(size_t i) override;
69 virtual void SetChannelBandwidthLimit(size_t i, unsigned int limit_mhz) override;
70 virtual std::vector<unsigned int> GetChannelBandwidthLimiters(size_t i) override;
71 virtual OscilloscopeChannel* GetExternalTrigger() override;
72 virtual bool CanEnableChannel(size_t i) override;
73 virtual uint32_t GetInstrumentTypesForChannel(size_t i) const override;
74 virtual void SetChannelCoupling(size_t i, OscilloscopeChannel::CouplingType type) override;
75 virtual void EnableChannel(size_t i) override;
76
77 //Triggering
78 virtual Oscilloscope::TriggerMode PollTrigger() override;
79 virtual bool AcquireData() override;
80
81 // Captures
82 virtual void Start() override;
83 virtual void StartSingleTrigger() override;
84 virtual void ForceTrigger() override;
85
86 //Timebase
87 virtual std::vector<uint64_t> GetSampleRatesNonInterleaved() override;
88 virtual std::vector<uint64_t> GetSampleRatesInterleaved() override;
89 virtual std::set<InterleaveConflict> GetInterleaveConflicts() override;
90 virtual std::vector<uint64_t> GetSampleDepthsNonInterleaved() override;
91 virtual std::vector<uint64_t> GetSampleDepthsInterleaved() override;
92 virtual bool IsInterleaving() override;
93 virtual bool SetInterleaving(bool combine) override;
94 virtual bool CanInterleave() override;
95
96protected:
98 void RefreshSampleRate();
99
100 std::string GetChannelColor(size_t i);
101
104
106 std::map<size_t, double> m_channelAttenuations;
107
110
113
116
119
122
125
127 std::vector<std::unique_ptr<AcceleratorBuffer<int16_t> > > m_analogRawWaveformBuffers;
128
130 std::shared_ptr<QueueHandle> m_queue;
131
133 std::unique_ptr<vk::raii::CommandPool> m_pool;
134
136 std::unique_ptr<vk::raii::CommandBuffer> m_cmdBuf;
137
139 std::unique_ptr<ComputePipeline> m_conversionPipeline;
140
143
145 std::vector<unsigned int> m_bandwidthLimits;
146
147public:
148
149 static std::string GetDriverNameInternal();
150 OSCILLOSCOPE_INITPROC(ThunderScopeOscilloscope);
151};
152
153#endif
A parameter to a filter.
Definition: FilterParameter.h:86
Clock that measures rate at which it is called; windowed average.
Definition: HzClock.h:52
A single channel on an oscilloscope.
Definition: OscilloscopeChannel.h:49
TriggerMode
Definition: Oscilloscope.h:396
An oscilloscope connected over a SDK-to-SCPI bridge that follows our pattern (i.e....
Definition: RemoteBridgeOscilloscope.h:40
Abstraction of a transport layer for moving SCPI data between endpoints.
Definition: SCPITransport.h:47
Driver for talking to the TS.NET server controlling a ThunderScope.
Definition: ThunderScopeOscilloscope.h:49
virtual std::vector< uint64_t > GetSampleDepthsInterleaved() override
Get the legal memory depths for this scope in combined-channels mode.
Definition: ThunderScopeOscilloscope.cpp:609
virtual double GetChannelAttenuation(size_t i) override
Gets the probe attenuation for an input channel.
Definition: ThunderScopeOscilloscope.cpp:252
size_t m_analogChannelCount
Number of analog channels (always 4 at the moment)
Definition: ThunderScopeOscilloscope.h:103
virtual void FlushConfigCache() override
Instruments are allowed to cache configuration settings to reduce round trip queries to the device.
Definition: ThunderScopeOscilloscope.cpp:234
HzClock m_receiveClock
Counter of average trigger rate.
Definition: ThunderScopeOscilloscope.h:124
virtual OscilloscopeChannel * GetExternalTrigger() override
Returns the external trigger input channel, if we have one.
Definition: ThunderScopeOscilloscope.cpp:302
virtual bool IsInterleaving() override
Checks if the scope is currently combining channels.
Definition: ThunderScopeOscilloscope.cpp:616
virtual void SetChannelAttenuation(size_t i, double atten) override
Sets the probe attenuation used for an input channel.
Definition: ThunderScopeOscilloscope.cpp:258
std::unique_ptr< vk::raii::CommandBuffer > m_cmdBuf
Command buffer for sample conversion.
Definition: ThunderScopeOscilloscope.h:136
virtual void StartSingleTrigger() override
Arms the trigger for a single acquistion.
Definition: ThunderScopeOscilloscope.cpp:529
virtual std::vector< unsigned int > GetChannelBandwidthLimiters(size_t i) override
Gets the set of available bandwidth limiters for an input channel.
Definition: ThunderScopeOscilloscope.cpp:289
FilterParameter m_diag_hardwareWFMHz
Number of WFM/s acquired by hardware.
Definition: ThunderScopeOscilloscope.h:109
virtual bool CanInterleave() override
Returns true if we have no interleave conflicts, false if we have conflicts.
Definition: ThunderScopeOscilloscope.cpp:574
void ResetPerCaptureDiagnostics()
Reset performance counters at the start of a capture.
Definition: ThunderScopeOscilloscope.cpp:175
virtual std::vector< uint64_t > GetSampleDepthsNonInterleaved() override
Get the legal memory depths for this scope in all-channels mode.
Definition: ThunderScopeOscilloscope.cpp:586
virtual std::vector< uint64_t > GetSampleRatesNonInterleaved() override
Get the legal sampling rates (in Hz) for this scope in all-channels mode.
Definition: ThunderScopeOscilloscope.cpp:541
ThunderScopeOscilloscope(SCPITransport *transport)
Initialize the driver.
Definition: ThunderScopeOscilloscope.cpp:56
FilterParameter m_diag_receivedWFMHz
Number of WFM/s recieved by the driver.
Definition: ThunderScopeOscilloscope.h:112
static std::string GetDriverNameInternal()
Return the driver name "thunderscope".
Definition: ThunderScopeOscilloscope.cpp:229
virtual void Start() override
Starts the instrument in continuous trigger mode.
Definition: ThunderScopeOscilloscope.cpp:521
virtual uint32_t GetInstrumentTypesForChannel(size_t i) const override
Returns a bitfield describing the set of instrument types that a given channel supports.
Definition: ThunderScopeOscilloscope.cpp:220
virtual std::vector< uint64_t > GetSampleRatesInterleaved() override
Get the legal sampling rates (in Hz) for this scope in combined-channels mode.
Definition: ThunderScopeOscilloscope.cpp:566
std::string GetChannelColor(size_t i)
Color the channels based on our standard color sequence (blue-red-green-yellow)
Definition: ThunderScopeOscilloscope.cpp:188
virtual bool AcquireData() override
Pull data from the instrument.
Definition: ThunderScopeOscilloscope.cpp:315
virtual unsigned int GetInstrumentTypes() const override
Returns a bitfield describing the set of instrument types that this instrument supports.
Definition: ThunderScopeOscilloscope.cpp:215
virtual void SetChannelCoupling(size_t i, OscilloscopeChannel::CouplingType type) override
Sets the coupling used for an input channel.
Definition: ThunderScopeOscilloscope.cpp:638
virtual void ForceTrigger() override
Forces a single acquisition as soon as possible.
Definition: ThunderScopeOscilloscope.cpp:535
virtual bool SetInterleaving(bool combine) override
Configures the scope to combine channels.
Definition: ThunderScopeOscilloscope.cpp:622
virtual void SetChannelBandwidthLimit(size_t i, unsigned int limit_mhz) override
Sets the bandwidth limit for an input channel.
Definition: ThunderScopeOscilloscope.cpp:276
FilterParameter m_diag_droppedPercent
Percentage of waveforms which were dropped.
Definition: ThunderScopeOscilloscope.h:121
virtual std::vector< OscilloscopeChannel::CouplingType > GetAvailableCouplings(size_t i) override
Gets the set of legal coupling values for an input channel.
Definition: ThunderScopeOscilloscope.cpp:628
FilterParameter m_diag_droppedWFMs
Number of waveforms dropped because some part of the pipeline couldn't keep up.
Definition: ThunderScopeOscilloscope.h:118
virtual Oscilloscope::TriggerMode PollTrigger() override
Checks the curent trigger status.
Definition: ThunderScopeOscilloscope.cpp:308
FilterParameter m_diag_totalWFMs
Number of waveforms acquired during this session.
Definition: ThunderScopeOscilloscope.h:115
std::unique_ptr< vk::raii::CommandPool > m_pool
Command pool from which m_cmdBuf was allocated.
Definition: ThunderScopeOscilloscope.h:133
virtual bool CanEnableChannel(size_t i) override
Determines if a channel can be enabled.
Definition: ThunderScopeOscilloscope.cpp:684
std::vector< unsigned int > m_bandwidthLimits
Bandwidth limiters.
Definition: ThunderScopeOscilloscope.h:145
virtual unsigned int GetChannelBandwidthLimit(size_t i) override
Gets the bandwidth limit for an input channel.
Definition: ThunderScopeOscilloscope.cpp:270
std::unique_ptr< ComputePipeline > m_conversionPipeline
Compute pipeline for converting raw ADC codes to float32 samples.
Definition: ThunderScopeOscilloscope.h:139
std::map< size_t, double > m_channelAttenuations
Map of channel numbers to attenuation levels.
Definition: ThunderScopeOscilloscope.h:106
virtual void EnableChannel(size_t i) override
Turn a channel on, given the index.
Definition: ThunderScopeOscilloscope.cpp:246
std::shared_ptr< QueueHandle > m_queue
Vulkan queue used for sample conversion.
Definition: ThunderScopeOscilloscope.h:130
AcceleratorBuffer< uint32_t > m_clippingBuffer
Buffer for storing channel clip state.
Definition: ThunderScopeOscilloscope.h:142
std::vector< std::unique_ptr< AcceleratorBuffer< int16_t > > > m_analogRawWaveformBuffers
Buffers for storing raw ADC samples before converting to fp32.
Definition: ThunderScopeOscilloscope.h:127