@@ -25,6 +25,15 @@ class Oscilloscope(ADCBufferMixin):
25
25
device : :class:`SerialHandler`, optional
26
26
Serial interface for communicating with the PSLab device. If not
27
27
provided, a new one will be created.
28
+
29
+ Attributes
30
+ ----------
31
+ trigger_voltage : float
32
+ Trigger capture when voltage crosses this value.
33
+ trigger_enabled : bool
34
+ Whether or not to wait for trigger condition before capture start.
35
+ trigger_channel : str
36
+ Name of channel to trigger on.
28
37
"""
29
38
30
39
_CH234 = ["CH2" , "CH3" , "MIC" ]
@@ -33,9 +42,9 @@ def __init__(self, device: SerialHandler = None):
33
42
self ._device = SerialHandler () if device is None else device
34
43
self ._channels = {a : AnalogInput (a ) for a in ANALOG_CHANNELS }
35
44
self ._channel_one_map = "CH1"
36
- self ._trigger_voltage = 0
37
- self ._trigger_enabled = False
38
- self ._trigger_channel = "CH1"
45
+ self .trigger_voltage = 0
46
+ self .trigger_enabled = False
47
+ self .trigger_channel = "CH1"
39
48
self ._set_gain ("CH1" , 1 )
40
49
self ._set_gain ("CH2" , 1 )
41
50
@@ -120,12 +129,12 @@ def capture(
120
129
channels = 1
121
130
122
131
if trigger is False :
123
- self ._trigger_enabled = False
132
+ self .trigger_enabled = False
124
133
elif trigger is not None :
125
134
if trigger_channel is None :
126
- self ._trigger_channel = self ._channel_one_map
135
+ self .trigger_channel = self ._channel_one_map
127
136
else :
128
- self ._trigger_channel = trigger_channel
137
+ self .trigger_channel = trigger_channel
129
138
self .configure_trigger (voltage = trigger )
130
139
131
140
self ._check_args (channels , samples , timegap )
@@ -173,7 +182,7 @@ def _lookup_mininum_timegap(self, channels: int) -> float:
173
182
}
174
183
min_timegaps = [[0.5 , 0.75 ], [0.875 , 0.875 ], [1.75 , 1.75 ]]
175
184
176
- return min_timegaps [channels_idx [channels ]][self ._trigger_enabled ]
185
+ return min_timegaps [channels_idx [channels ]][self .trigger_enabled ]
177
186
178
187
def _capture (self , channels : int , samples : int , timegap : float ):
179
188
self ._invalidate_buffer ()
@@ -186,7 +195,7 @@ def _capture(self, channels: int, samples: int, timegap: float):
186
195
self ._channels [self ._channel_one_map ].samples_in_buffer = samples
187
196
self ._channels [self ._channel_one_map ].buffer_idx = 0
188
197
if channels == 1 :
189
- if self ._trigger_enabled :
198
+ if self .trigger_enabled :
190
199
self ._device .send_byte (CP .CAPTURE_ONE )
191
200
self ._device .send_byte (chosa | 0x80 ) # Trigger
192
201
elif timegap >= 1 :
@@ -201,15 +210,15 @@ def _capture(self, channels: int, samples: int, timegap: float):
201
210
self ._channels ["CH2" ].samples_in_buffer = samples
202
211
self ._channels ["CH2" ].buffer_idx = 1 * samples
203
212
self ._device .send_byte (CP .CAPTURE_TWO )
204
- self ._device .send_byte (chosa | (0x80 * self ._trigger_enabled ))
213
+ self ._device .send_byte (chosa | (0x80 * self .trigger_enabled ))
205
214
else :
206
215
for e , c in enumerate (self ._CH234 ):
207
216
self ._channels [c ].resolution = 10
208
217
self ._channels [c ].samples_in_buffer = samples
209
218
self ._channels [c ].buffer_idx = (e + 1 ) * samples
210
219
self ._device .send_byte (CP .CAPTURE_FOUR )
211
220
self ._device .send_byte (
212
- chosa | (CH123SA << 4 ) | (0x80 * self ._trigger_enabled )
221
+ chosa | (CH123SA << 4 ) | (0x80 * self .trigger_enabled )
213
222
)
214
223
215
224
self ._device .send_int (samples )
@@ -304,28 +313,27 @@ def configure_trigger(
304
313
If the trigger channel is set to a channel which cannot be sampled.
305
314
"""
306
315
if enable is False :
307
- self ._trigger_enabled = False
316
+ self .trigger_enabled = False
308
317
return
309
318
310
319
if channel is not None :
311
- self ._trigger_channel = channel
320
+ self .trigger_channel = channel
312
321
313
- if self ._trigger_channel == self ._channel_one_map :
322
+ if self .trigger_channel == self ._channel_one_map :
314
323
channel = 0
315
- elif self ._trigger_channel in self ._CH234 :
316
- channel = self ._CH234 .index (self ._trigger_channel ) + 1
324
+ elif self .trigger_channel in self ._CH234 :
325
+ channel = self ._CH234 .index (self .trigger_channel ) + 1
317
326
else :
318
- raise TypeError (f"Cannot trigger on { self ._trigger_channel } ." )
327
+ raise TypeError (f"Cannot trigger on { self .trigger_channel } ." )
319
328
320
329
self ._device .send_byte (CP .ADC )
321
330
self ._device .send_byte (CP .CONFIGURE_TRIGGER )
322
331
# Trigger channel (4lsb) , trigger timeout prescaler (4msb)
323
332
self ._device .send_byte ((prescaler << 4 ) | (1 << channel )) # TODO prescaler?
324
- level = self ._channels [self ._trigger_channel ].unscale (voltage )
333
+ level = self ._channels [self .trigger_channel ].unscale (voltage )
325
334
self ._device .send_int (level )
326
335
self ._device .get_ack ()
327
- self ._trigger_enabled = True
328
- self ._capture (1 , 1 , 1 ) # Trigger not applied until next capture call.
336
+ self .trigger_enabled = True
329
337
330
338
def select_range (self , channel : str , voltage_range : Union [int , float ]):
331
339
"""Set appropriate gain automatically.
0 commit comments