diff options
author | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2024-07-18 22:17:16 -0400 |
---|---|---|
committer | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2024-07-18 22:17:16 -0400 |
commit | 24f0c5bed0d1ab6a4008fc40d141a670cf23cec3 (patch) | |
tree | ed93b01514c3cd3c37338d7cb120fbc3b8a69d32 /qolab | |
parent | 4df06dbf3d779d74f0a0f522c5656ba7abf14770 (diff) | |
download | qolab-24f0c5bed0d1ab6a4008fc40d141a670cf23cec3.tar.gz qolab-24f0c5bed0d1ab6a4008fc40d141a670cf23cec3.zip |
added heurestic to adjust chunk size for Waveform reader
If chunk very long it has probability to fail (at least over USB),
but small chunk takes forever to obtain the full Waveform.
So if get error, we decrease chunk size, otherwise increase it slowly
Diffstat (limited to 'qolab')
-rw-r--r-- | qolab/hardware/scope/rigolds1054z.py | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/qolab/hardware/scope/rigolds1054z.py b/qolab/hardware/scope/rigolds1054z.py index a9ff9cb..c0bc114 100644 --- a/qolab/hardware/scope/rigolds1054z.py +++ b/qolab/hardware/scope/rigolds1054z.py @@ -160,36 +160,41 @@ class RigolDS1054z(ScopeSCPI): print(preamble) Npnts = int(preamble[2]) wfRaw = np.zeros(Npnts, dtype=np.int8) - maxreadable = 200000 # 250000 is the maximum number of bytes readable in one go + maxreadable = 250000 # the maximum number of bytes readable in one go + chunk_size = maxreadable + errCnt = 0 strt = 1 - stp = min(maxreadable,Npnts) + stp = min(maxreadable, Npnts) while (strt <= Npnts): - import time - stp = strt - 1 + maxreadable + stp = strt - 1 + chunk_size stp = min(stp, Npnts) - print(f"{strt=} {stp=}") - # reading requested number of points in chunks of maxreadable - print("strt cnt") + # reading requested number of points in chunks self.write(f":WAVeform:STARt {strt}") - print(f"{self.wait_until_finished()}") - time.sleep(.1) - print("stop cnt") self.write(f":WAVeform:STOP {stp}") - print(f"{self.wait_until_finished()}") - time.sleep(.1) qstr = ":WAVeform:DATA?" - wfRawChunk = self.query_binary_values( - qstr, - datatype="b", - header_fmt="ieee", - container=np.array, - chunk_size=(maxreadable + 100), - ) - print(f"{self.wait_until_finished()}") - wfRaw[strt-1:stp] = wfRawChunk - strt += maxreadable - print("waiting") - time.sleep(1) + try: + wfRawChunk = self.query_binary_values( + qstr, + datatype="b", + header_fmt="ieee", + container=np.array, + chunk_size=(chunk_size + 100), + ) + if len(wfRawChunk) == 0: + continue # we need to repeat chunk read + wfRaw[strt-1:stp] = wfRawChunk + chunk_size = min(maxreadable, int(chunk_size*1.2)) + strt += chunk_size + except VisaIOError: + errCnt += 1 + print(f"ERROR count is {errCnt} while reading raw chunk the scope") + print(f"Current pointers are {strt=} {stp=} with {chunk_size=}") + chunk_size = max(1, int(np.ceil(chunk_size/2))) + print(f"new {chunk_size=}") + pass # we repeat this loop iteration again + + + print(f"final {chunk_size=}") if True: return wfRaw |