@@ -220,20 +220,20 @@ def measure_duty_cycle(self, channel: str, timeout: float = 1) -> Tuple[float]:
220
220
self .configure_trigger (trigger_channel = channel , trigger_mode = "rising" )
221
221
tmp_map = self ._channel_one_map
222
222
self ._channel_one_map = channel
223
- t = self .capture (1 , 2 , modes = ["any" ], timeout = timeout )[0 ]
223
+ t = self .capture (1 , 3 , modes = ["any" ], timeout = timeout )[0 ]
224
224
self ._channel_one_map = tmp_map
225
225
self .configure_trigger (tmp_trigger_channel , tmp_trigger_mode )
226
226
227
- period = t [1 ]
227
+ period = t [2 ]
228
228
# First change is HIGH -> LOW since we trigger on rising.
229
- duty_cycle = t [0 ] / t [1 ]
229
+ duty_cycle = t [1 ] / t [2 ]
230
230
231
231
return period , duty_cycle
232
232
233
233
def capture (
234
234
self ,
235
235
channels : int ,
236
- events : int = CP .MAX_SAMPLES // 4 - 1 ,
236
+ events : int = CP .MAX_SAMPLES // 4 - 2 ,
237
237
timeout : float = None ,
238
238
modes : List [str ] = 4 * ("any" ,),
239
239
e2e_time : float = None ,
@@ -250,7 +250,7 @@ def capture(
250
250
ID2, ID3, and ID4, in that order.
251
251
events : int, optional
252
252
Number of logic events to capture on each channel. The default and maximum
253
- value is 2499 .
253
+ value is 2498 .
254
254
timeout : float, optional
255
255
Timeout in seconds before cancelling measurement. By default there is
256
256
no timeout.
@@ -289,7 +289,6 @@ def capture(
289
289
RuntimeError is the timeout is exceeded.
290
290
"""
291
291
self ._check_arguments (channels , events )
292
- events += 1 # Capture an extra event in case we get a spurious zero.
293
292
self .clear_buffer (0 , CP .MAX_SAMPLES )
294
293
self ._configure_trigger (channels )
295
294
modes = [digital_channel .MODES [m ] for m in modes ]
@@ -300,6 +299,8 @@ def capture(
300
299
):
301
300
c = self ._channels [c ]
302
301
c .events_in_buffer = events
302
+ # Capture an extra event in case we get a spurious zero.
303
+ c ._events_in_buffer = events + 2
303
304
c .datatype = "long" if channels < 3 else "int"
304
305
c .buffer_idx = 2500 * e * (1 if c .datatype == "int" else 2 )
305
306
c ._logic_mode = modes [e ]
@@ -312,19 +313,16 @@ def capture(
312
313
self ._capture_four (e2e_time )
313
314
314
315
if block :
315
- self ._wait_for_progress (old_progress , timeout )
316
- self ._timeout (events , timeout )
316
+ self ._wait_for_progress (timeout )
317
+ self ._timeout (events + 2 , start_time , timeout )
317
318
else :
318
319
return
319
320
320
- timestamps = self .fetch_data ()
321
- timestamps = [t [: events - 1 ] for t in timestamps ] # Remove extra events.
322
-
323
- return timestamps [:channels ] # Discard 4:th channel if user asked for 3.
321
+ return self .fetch_data ()[:channels ] # Discard 4:th channel if user asked for 3.
324
322
325
323
@staticmethod
326
324
def _check_arguments (channels : int , events : int ):
327
- max_events = CP .MAX_SAMPLES // 4 - 1
325
+ max_events = CP .MAX_SAMPLES // 4 - 2
328
326
if events > max_events :
329
327
raise ValueError (f"Events must be fewer than { max_events } ." )
330
328
elif channels < 0 or channels > 4 :
@@ -434,7 +432,10 @@ def fetch_data(self) -> List[np.ndarray]:
434
432
raw_timestamps = self ._fetch_long (c )
435
433
else :
436
434
raw_timestamps = self ._fetch_int (c )
437
- counter_values .append (self ._trim_zeros (c , raw_timestamps ))
435
+ # Remove extra events.
436
+ raw_timestamps = self ._trim_zeros (c , raw_timestamps )
437
+ raw_timestamps = raw_timestamps [: c .events_in_buffer ]
438
+ counter_values .append (raw_timestamps )
438
439
439
440
prescaler = [1 / 64 , 1 / 8 , 1.0 , 4.0 ][self ._prescaler ]
440
441
timestamps = [cv * prescaler for cv in counter_values ]
@@ -474,8 +475,6 @@ def _fetch_long(self, channel: digital_channel.DigitalInput) -> np.ndarray:
474
475
self ._device .get_ack ()
475
476
476
477
while lsb [- 1 ] == 0 :
477
- if len (lsb ) == 0 :
478
- return np .array ([])
479
478
lsb = lsb [:- 1 ]
480
479
481
480
# Second half of each long is stored in positions 2501-5000,
@@ -533,14 +532,16 @@ def get_progress(self) -> int:
533
532
buffer, the lowest value will be returned.
534
533
"""
535
534
active_channels = []
535
+ a = 0
536
536
for c in self ._channels .values ():
537
537
if c .events_in_buffer :
538
- active_channels .append (c )
538
+ active_channels .append (a * (1 if c .datatype == "int" else 2 ))
539
+ a += 1
539
540
540
541
p = CP .MAX_SAMPLES // 4
541
542
progress = self ._get_initial_states_and_progress ()[1 ]
542
- for i in range ( len ( active_channels )) :
543
- p = min (progress [i ], p )
543
+ for a in active_channels :
544
+ p = min (progress [a ], p )
544
545
545
546
return p
546
547
0 commit comments