19
19
20
20
class LogicAnalyzer :
21
21
def __init__ (self , device : packet_handler .Handler = None ):
22
- self .H = device
23
22
self ._device = device
24
23
self ._channels = {
25
24
d : digital_channel .DigitalInput (d ) for d in digital_channel .DIGITAL_INPUTS
@@ -167,13 +166,13 @@ def capture(
167
166
channels : int ,
168
167
events : int = CP .MAX_SAMPLES // 4 - 1 ,
169
168
timeout : float = None ,
170
- e2e_time : float = 0 ,
171
169
modes : List [str ] = 4 * ("any" ,),
170
+ e2e_time : float = None ,
172
171
block : bool = True ,
173
172
):
173
+ self ._check_arguments (channels , events )
174
174
events += 1 # Capture an extra event in case we get a spurious zero.
175
175
self .clear_buffer (0 , CP .MAX_SAMPLES )
176
- self ._invalidate_buffer ()
177
176
self ._configure_trigger (channels )
178
177
modes = [digital_channel .MODES [m ] for m in modes ]
179
178
old_progress = self .get_progress ()
@@ -191,17 +190,12 @@ def capture(
191
190
self ._capture_one ()
192
191
elif channels == 2 :
193
192
self ._capture_two ()
194
- elif channels == 4 :
193
+ else :
195
194
self ._capture_four (e2e_time )
196
195
197
196
if block :
198
- start = time .time ()
199
- self ._wait_for_progress (old_progress , timeout = timeout )
200
-
201
- while self .get_progress () < events :
202
- if timeout is not None :
203
- if time .time () - start >= timeout :
204
- raise RuntimeError ("Capture timed out." )
197
+ self ._wait_for_progress (old_progress , timeout )
198
+ self ._timeout (events , timeout )
205
199
else :
206
200
return
207
201
@@ -212,6 +206,21 @@ def capture(
212
206
213
207
return timestamps [:channels ] # Discard 4:th channel if user asked for 3.
214
208
209
+ @staticmethod
210
+ def _check_arguments (channels : int , events : int ):
211
+ max_events = CP .MAX_SAMPLES // 4 - 1
212
+ if events > max_events :
213
+ raise ValueError (f"Events must be fewer than { max_events } ." )
214
+ elif channels < 0 or channels > 4 :
215
+ raise ValueError ("Channels must be between 1-4." )
216
+
217
+ def _timeout (self , events : int , timeout : float ):
218
+ start = time .time ()
219
+ while self .get_progress () < events :
220
+ if timeout is not None :
221
+ if time .time () - start >= timeout :
222
+ raise RuntimeError ("Capture timed out." )
223
+
215
224
def _capture_one (self ):
216
225
self ._channels [self ._channel_one_map ].prescaler = 0
217
226
self ._device .send_byte (CP .TIMING )
@@ -246,6 +255,8 @@ def _capture_two(self):
246
255
247
256
def _capture_four (self , e2e_time : float ):
248
257
rollover_time = (2 ** 16 - 1 ) / CLOCK_RATE
258
+ e2e_time = 0 if e2e_time is None else e2e_time
259
+
249
260
if e2e_time > rollover_time * PRESCALERS [3 ]:
250
261
raise ValueError ("Timegap too big for four channel mode." )
251
262
elif e2e_time > rollover_time * PRESCALERS [2 ]:
@@ -555,6 +566,7 @@ def clear_buffer(self, starting_position, total_points):
555
566
self .H .__sendInt__ (starting_position )
556
567
self .H .__sendInt__ (total_points )
557
568
self .H .__get_ack__ ()
569
+ self ._invalidate_buffer ()
558
570
559
571
def _invalidate_buffer (self ):
560
572
for c in self ._channels .values ():
0 commit comments