Open rpanderson opened 4 years ago
These changes can be tested in conjunction with #54 using the following experiment script, which is a slightly extended version of that in labscript-suite/labscript-utils#54. Load this into runmanager and submit it to blacs (check 'Run shot(s)') and/or runviewer (check 'View shot(s)').
from labscript import start, stop, add_time_marker, AnalogOut, DigitalOut
from labscript_devices.DummyPseudoclock.labscript_devices import DummyPseudoclock
from labscript_devices.DummyIntermediateDevice import DummyIntermediateDevice
# Use a virtual, or 'dummy', device for the psuedoclock
DummyPseudoclock(name='pseudoclock')
# An output of this DummyPseudoclock is its 'clockline' attribute, which we use
# to trigger children devices
DummyIntermediateDevice(name='intermediate_device', parent_device=pseudoclock.clockline)
# Create an AnalogOut child of the DummyIntermediateDevice
AnalogOut(name='analog_out', parent_device=intermediate_device, connection='ao0')
# Create a DigitalOut child of the DummyIntermediateDevice
DigitalOut(
name='digital_out', parent_device=intermediate_device, connection='port0/line0'
)
# Begin issuing labscript primitives
# A timing variable t is used for convenience
# start() elicits the commencement of the shot
t = 0
add_time_marker(t, "Start", verbose=True)
start()
# Wait for 1 second with all devices in their default state
t += 1
# Change the state of digital_out, and denote this using a time marker
add_time_marker(t, "Toggle digital_out (high)", verbose=True)
digital_out.go_high(t)
# Wait for 0.5 seconds
t += 0.5
# Ramp analog_out from 0.0 V to 1.0 V over 0.25 s with a 1 kS/s sample rate
t += analog_out.ramp(t=t, initial=0.0, final=1.0, duration=0.25, samplerate=1e3)
# Change the state of digital_out, and denote this using a time marker
add_time_marker(t, "Toggle digital_out (low)", verbose=True)
digital_out.go_low(t)
# Wait for 0.5 seconds
t += 0.5
# Stop the experiment shot with stop()
stop(t)
TODO:
- [ ] Find out why the front panel values don't reflect the final values programmed during the last shot. Is this related to labscript-suite/blacs#58, @philipstarkey?
No, it shouldn't be related to that. Most likely an issue with channel names not aligning with the output names in the returned dictionary?
In addition to that though, this PR currently breaks backwards compatibility by enforcing specific channel names for analog and digital outputs. People are using this device in their real experiments (see here for example). I thus think it would be better to introspect the attached outputs (and channel names) from the connection table dynamically. That might mean we can't do analog limits until labscript-suite/labscript#44 is resolved though. We should be able to detect static vs buffered Digital outputs based on the output class though.
Let's target this for 3.1.0
This PR sees the addition of some core functionality and common labscript precepts to make DummyIntermediateDevice more useful, and representative of real intermediate devices.
AnalogOutput
andDigitalOutput
children were allowed, but not included on the blacs tab.@set_passed_properties
decorator is used to save keyword arguments to the connection table.transition_to_buffered
method of theDummyIntermediateDeviceWorker
returns the final values from the instruction table, so that these can be used to update the front panel after each shot (not working; see below).DummyIntermediateDeviceParser
) is a simplified version of that fromlabscript_devices.NIDAQmx
.labscript_devices.NIDAQmx
code for creating widgets in theDummyIntermediateDeviceTab
. However, this could be omitted for a simpler fixed number of digital outputs.TODO: