From 901bab0113cdf924d963278a6194556a9f143451 Mon Sep 17 00:00:00 2001 From: James Wah Date: Fri, 6 Feb 2026 09:13:52 +1100 Subject: [PATCH 1/2] _lowLevelClear*: clear the correct buffers when downsampling is used Where downsampling is supported, the PicoScope APIs allow you to set separate buffers for each downsampling mode, so that you can get multiple different outputs from a single acquisition. These buffers are separate from each other and also from the regular/non-downsampled buffer, so they also need to be cleared separately. This patch adds a downsample[Ratio]Mode argument to the _lowLevelClear* functions, and provides appropriate values during the high level getData calls. --- picoscope/picobase.py | 4 ++-- picoscope/ps2000.py | 2 +- picoscope/ps2000a.py | 5 +++-- picoscope/ps3000.py | 2 +- picoscope/ps3000a.py | 4 ++-- picoscope/ps4000.py | 4 ++-- picoscope/ps4000a.py | 9 +++++---- picoscope/ps5000.py | 9 +++++---- picoscope/ps5000a.py | 4 ++-- picoscope/ps6000.py | 9 +++++---- picoscope/ps6000a.py | 10 +++++----- 11 files changed, 33 insertions(+), 29 deletions(-) diff --git a/picoscope/picobase.py b/picoscope/picobase.py index e02d788..7174c4c 100644 --- a/picoscope/picobase.py +++ b/picoscope/picobase.py @@ -728,7 +728,7 @@ def getDataRaw(self, channel='A', numSamples=0, startIndex=0, segmentIndex) # necessary or else the next call to getValues will try to fill # this array unless it is a call trying to read the same channel. - self._lowLevelClearDataBuffer(channel, segmentIndex) + self._lowLevelClearDataBuffer(channel, downSampleMode, segmentIndex) # overflow is a bitwise mask overflow = bool(overflow & (1 << channel)) @@ -797,7 +797,7 @@ def getDataRawBulk(self, channel='A', numSamples=0, fromSegment=0, # don't leave the API thinking these can be written to later for i, segment in enumerate(range(fromSegment, toSegment + 1)): - self._lowLevelClearDataBuffer(channel, segment) + self._lowLevelClearDataBuffer(channel, downSampleMode, segment) return (data, numSamples, overflow) diff --git a/picoscope/ps2000.py b/picoscope/ps2000.py index 2b5993b..db14972 100644 --- a/picoscope/ps2000.py +++ b/picoscope/ps2000.py @@ -295,7 +295,7 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, self.channelBuffersPtr[channel] = dataPtr self.channelBuffersLen[channel] = numSamples - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): self.channelBuffersPtr[channel] = c_void_p() self.channelBuffersLen[channel] = 0 diff --git a/picoscope/ps2000a.py b/picoscope/ps2000a.py index 4858aaa..5cefc44 100644 --- a/picoscope/ps2000a.py +++ b/picoscope/ps2000a.py @@ -379,11 +379,12 @@ def _lowLevelSetMultipleDataBuffers(self, channel, data, downSampleMode): downSampleMode, i) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): """Clear the data in the picoscope.""" m = self.lib.ps2000aSetDataBuffer( c_int16(self.handle), c_enum(channel), - c_void_p(), c_uint32(0), c_uint32(segmentIndex), c_enum(0)) + c_void_p(), c_uint32(0), + c_uint32(segmentIndex), c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, diff --git a/picoscope/ps3000.py b/picoscope/ps3000.py index a3be722..1f860e2 100644 --- a/picoscope/ps3000.py +++ b/picoscope/ps3000.py @@ -282,7 +282,7 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, self.channelBuffersPtr[channel] = dataPtr self.channelBuffersLen[channel] = numSamples - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): self.channelBuffersPtr[channel] = c_void_p() self.channelBuffersLen[channel] = 0 diff --git a/picoscope/ps3000a.py b/picoscope/ps3000a.py index cf48b66..d30bf05 100644 --- a/picoscope/ps3000a.py +++ b/picoscope/ps3000a.py @@ -406,12 +406,12 @@ def _lowLevelSetMultipleDataBuffers(self, channel, data, downSampleMode): downSampleMode, i) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps3000aSetDataBuffer(c_int16(self.handle), c_enum(channel), c_void_p(), c_uint32(0), c_uint32(segmentIndex), - c_enum(0)) + c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, diff --git a/picoscope/ps4000.py b/picoscope/ps4000.py index 4388f05..c7a27f6 100644 --- a/picoscope/ps4000.py +++ b/picoscope/ps4000.py @@ -384,7 +384,7 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, dataPtr, c_uint32(numSamples)) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps4000SetDataBuffer(c_int16(self.handle), c_enum(channel), c_void_p(), c_uint32(0), c_enum(0)) self.checkResult(m) @@ -542,7 +542,7 @@ def _lowLevelSetDataBuffers(self, channel, bufferMax, bufferMin, c_uint32(bufferLth)) self.checkResult(m) - def _lowLevelClearDataBuffers(self, channel): + def _lowLevelClearDataBuffers(self, channel, downSampleRatioMode): m = self.lib.ps4000SetDataBuffers( c_int16(self.handle), c_enum(channel), diff --git a/picoscope/ps4000a.py b/picoscope/ps4000a.py index b24f8fe..cb3cb68 100644 --- a/picoscope/ps4000a.py +++ b/picoscope/ps4000a.py @@ -494,11 +494,12 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, c_uint32(downSampleMode)) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps4000aSetDataBuffer(c_int16(self.handle), c_enum(channel), - c_void_p(), c_uint32(0), c_uint32(0), - c_enum(0)) + c_void_p(), c_uint32(0), + c_uint32(segmentIndex), + c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, @@ -673,7 +674,7 @@ def _lowLevelSetDataBuffers(self, channel, bufferMax, bufferMin, c_uint32(bufferLth)) self.checkResult(m) - def _lowLevelClearDataBuffers(self, channel): + def _lowLevelClearDataBuffers(self, channel, downSampleRatioMode): m = self.lib.ps4000aSetDataBuffers( c_int16(self.handle), c_enum(channel), diff --git a/picoscope/ps5000.py b/picoscope/ps5000.py index 9bc0d74..18c51e6 100644 --- a/picoscope/ps5000.py +++ b/picoscope/ps5000.py @@ -346,9 +346,10 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, c_enum(downSampleMode)) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps5000SetDataBuffer(c_int16(self.handle), c_enum(channel), - c_void_p(), c_uint32(0), c_enum(0)) + c_void_p(), c_uint32(0), + c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, @@ -497,10 +498,10 @@ def _lowLevelSetDataBuffers(self, channel, bufferMax, bufferMin, c_enum(downSampleRatioMode)) self.checkResult(m) - def _lowLevelClearDataBuffers(self, channel): + def _lowLevelClearDataBuffers(self, channel, downSampleRatioMode): m = self.lib.ps5000SetDataBuffers( c_int16(self.handle), c_enum(channel), - c_void_p(), c_void_p(), c_uint32(0), c_enum(0)) + c_void_p(), c_void_p(), c_uint32(0), c_enum(downSampleRatioMode)) self.checkResult(m) # Bulk values. diff --git a/picoscope/ps5000a.py b/picoscope/ps5000a.py index b439df4..cee6284 100644 --- a/picoscope/ps5000a.py +++ b/picoscope/ps5000a.py @@ -450,12 +450,12 @@ def _lowLevelSetDataBufferBulk(self, channel, data, segmentIndex, downSampleMode, segmentIndex) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps5000aSetDataBuffer(c_int16(self.handle), c_enum(channel), c_void_p(), c_uint32(0), c_uint32(segmentIndex), - c_enum(0)) + c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, diff --git a/picoscope/ps6000.py b/picoscope/ps6000.py index 06622c3..a626012 100644 --- a/picoscope/ps6000.py +++ b/picoscope/ps6000.py @@ -374,9 +374,10 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, c_enum(downSampleMode)) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps6000SetDataBuffer(c_int16(self.handle), c_enum(channel), - c_void_p(), c_uint32(0), c_enum(0)) + c_void_p(), c_uint32(0), + c_enum(downSampleMode)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio, @@ -499,10 +500,10 @@ def _lowLevelSetDataBuffers(self, channel, bufferMax, bufferMin, c_enum(downSampleRatioMode)) self.checkResult(m) - def _lowLevelClearDataBuffers(self, channel): + def _lowLevelClearDataBuffers(self, downSampleRatioMode, channel): m = self.lib.ps6000SetDataBuffers( c_int16(self.handle), c_enum(channel), - c_void_p(), c_void_p(), c_uint32(0), c_enum(0)) + c_void_p(), c_void_p(), c_uint32(0), c_enum(downSampleRatioMode)) self.checkResult(m) # Bulk values. diff --git a/picoscope/ps6000a.py b/picoscope/ps6000a.py index a235044..ed572f5 100644 --- a/picoscope/ps6000a.py +++ b/picoscope/ps6000a.py @@ -543,8 +543,7 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, self.ACTIONS['add']) self.checkResult(m) - def _lowLevelClearDataBuffer(self, channel, segmentIndex, - downSampleMode=0): + def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): """Clear the buffer for the chosen channel, segment, downSampleMode.""" if downSampleMode == 0: downSampleMode = self.RATIO_MODE['raw'] @@ -558,7 +557,8 @@ def _lowLevelClearDataBuffer(self, channel, segmentIndex, self.ACTIONS['clear_this']) self.checkResult(m) - def _lowLevelClearDataBufferAll(self, channel=1, segmentIndex=0): + def _lowLevelClearDataBufferAll(self, channel=1, downSampleMode=0, + segmentIndex=0): """Clear all the stored buffers for all channels.""" m = self.lib.ps6000aSetDataBuffer(c_int16(self.handle), c_enum(channel), @@ -566,7 +566,7 @@ def _lowLevelClearDataBufferAll(self, channel=1, segmentIndex=0): c_int32(0), self.DATA_TYPES['int16'], c_uint64(segmentIndex), - c_enum(0), + c_enum(downSampleMode), self.ACTIONS['clear_all']) self.checkResult(m) @@ -743,7 +743,7 @@ def _lowLevelSetDataBuffers(self, channel, bufferMax, bufferMin, c_enum(downSampleMode)) self.checkResult(m) - def _lowLevelClearDataBuffers(self, channel): + def _lowLevelClearDataBuffers(self, downSampleMode, channel): raise NotImplementedError() m = self.lib.ps6000aSetDataBuffers( c_int16(self.handle), c_enum(channel), From 92124c3ad803c75e1d5118041fea63225f8c5d9c Mon Sep 17 00:00:00 2001 From: James Wah Date: Fri, 6 Feb 2026 09:21:21 +1100 Subject: [PATCH 2/2] ps4000: remove an unused function argument --- picoscope/ps4000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/picoscope/ps4000.py b/picoscope/ps4000.py index c7a27f6..e0ebbb1 100644 --- a/picoscope/ps4000.py +++ b/picoscope/ps4000.py @@ -386,7 +386,7 @@ def _lowLevelSetDataBuffer(self, channel, data, downSampleMode, def _lowLevelClearDataBuffer(self, channel, downSampleMode, segmentIndex): m = self.lib.ps4000SetDataBuffer(c_int16(self.handle), c_enum(channel), - c_void_p(), c_uint32(0), c_enum(0)) + c_void_p(), c_uint32(0)) self.checkResult(m) def _lowLevelGetValues(self, numSamples, startIndex, downSampleRatio,