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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy