Skip to content

Commit 5cbdf4d

Browse files
committed
Oscilloscope: Promote trigger attributes to public
1 parent d55b14d commit 5cbdf4d

File tree

6 files changed

+32
-24
lines changed

6 files changed

+32
-24
lines changed

pslab/instrument/oscilloscope.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ class Oscilloscope(ADCBufferMixin):
2525
device : :class:`SerialHandler`, optional
2626
Serial interface for communicating with the PSLab device. If not
2727
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.
2837
"""
2938

3039
_CH234 = ["CH2", "CH3", "MIC"]
@@ -33,9 +42,9 @@ def __init__(self, device: SerialHandler = None):
3342
self._device = SerialHandler() if device is None else device
3443
self._channels = {a: AnalogInput(a) for a in ANALOG_CHANNELS}
3544
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"
3948
self._set_gain("CH1", 1)
4049
self._set_gain("CH2", 1)
4150

@@ -120,12 +129,12 @@ def capture(
120129
channels = 1
121130

122131
if trigger is False:
123-
self._trigger_enabled = False
132+
self.trigger_enabled = False
124133
elif trigger is not None:
125134
if trigger_channel is None:
126-
self._trigger_channel = self._channel_one_map
135+
self.trigger_channel = self._channel_one_map
127136
else:
128-
self._trigger_channel = trigger_channel
137+
self.trigger_channel = trigger_channel
129138
self.configure_trigger(voltage=trigger)
130139

131140
self._check_args(channels, samples, timegap)
@@ -173,7 +182,7 @@ def _lookup_mininum_timegap(self, channels: int) -> float:
173182
}
174183
min_timegaps = [[0.5, 0.75], [0.875, 0.875], [1.75, 1.75]]
175184

176-
return min_timegaps[channels_idx[channels]][self._trigger_enabled]
185+
return min_timegaps[channels_idx[channels]][self.trigger_enabled]
177186

178187
def _capture(self, channels: int, samples: int, timegap: float):
179188
self._invalidate_buffer()
@@ -186,7 +195,7 @@ def _capture(self, channels: int, samples: int, timegap: float):
186195
self._channels[self._channel_one_map].samples_in_buffer = samples
187196
self._channels[self._channel_one_map].buffer_idx = 0
188197
if channels == 1:
189-
if self._trigger_enabled:
198+
if self.trigger_enabled:
190199
self._device.send_byte(CP.CAPTURE_ONE)
191200
self._device.send_byte(chosa | 0x80) # Trigger
192201
elif timegap >= 1:
@@ -201,15 +210,15 @@ def _capture(self, channels: int, samples: int, timegap: float):
201210
self._channels["CH2"].samples_in_buffer = samples
202211
self._channels["CH2"].buffer_idx = 1 * samples
203212
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))
205214
else:
206215
for e, c in enumerate(self._CH234):
207216
self._channels[c].resolution = 10
208217
self._channels[c].samples_in_buffer = samples
209218
self._channels[c].buffer_idx = (e + 1) * samples
210219
self._device.send_byte(CP.CAPTURE_FOUR)
211220
self._device.send_byte(
212-
chosa | (CH123SA << 4) | (0x80 * self._trigger_enabled)
221+
chosa | (CH123SA << 4) | (0x80 * self.trigger_enabled)
213222
)
214223

215224
self._device.send_int(samples)
@@ -304,28 +313,27 @@ def configure_trigger(
304313
If the trigger channel is set to a channel which cannot be sampled.
305314
"""
306315
if enable is False:
307-
self._trigger_enabled = False
316+
self.trigger_enabled = False
308317
return
309318

310319
if channel is not None:
311-
self._trigger_channel = channel
320+
self.trigger_channel = channel
312321

313-
if self._trigger_channel == self._channel_one_map:
322+
if self.trigger_channel == self._channel_one_map:
314323
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
317326
else:
318-
raise TypeError(f"Cannot trigger on {self._trigger_channel}.")
327+
raise TypeError(f"Cannot trigger on {self.trigger_channel}.")
319328

320329
self._device.send_byte(CP.ADC)
321330
self._device.send_byte(CP.CONFIGURE_TRIGGER)
322331
# Trigger channel (4lsb) , trigger timeout prescaler (4msb)
323332
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)
325334
self._device.send_int(level)
326335
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
329337

330338
def select_range(self, channel: str, voltage_range: Union[int, float]):
331339
"""Set appropriate gain automatically.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[[[2], [8], [1], [0], [2], [8], [2], [0], [2], [5], [1], [0, 2], [2], [1], [131], [1, 0], [8, 0], [2], [1], [131], [1, 0], [8, 0], [2], [6], [11], [8], [0, 0], [1, 0]], [[], [], [], [1], [], [], [], [1], [], [], [], [1], [], [], [], [], [1], [], [], [], [], [1], [], [1, 1, 0, 1], [], [], [], [255, 1, 1]]]
1+
[[[2], [8], [1], [0], [2], [8], [2], [0], [2], [5], [1], [0, 2], [2], [1], [131], [1, 0], [8, 0], [2], [6], [11], [8], [0, 0], [1, 0]], [[], [], [], [1], [], [], [], [1], [], [], [], [1], [], [], [], [], [1], [], [1, 1, 0, 1], [], [], [], [255, 1, 1]]]

tests/recordings/waveform_generator/test_sine_phase.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/recordings/waveform_generator/test_sine_wave.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/recordings/waveform_generator/test_superposition.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/recordings/waveform_generator/test_triangle_wave.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)