labscript-suite / labscript-devices

A modular and extensible plugin architecture to control experiment hardware using the 𝘭𝘒𝘣𝘴𝘀𝘳π˜ͺ𝘱𝘡 𝘴𝘢π˜ͺ𝘡𝘦.
http://labscriptsuite.org
Other
5 stars 58 forks source link

Widgets and runviewer parser for DummyIntermediateDevice #53

Open rpanderson opened 4 years ago

rpanderson commented 4 years ago

This PR sees the addition of some core functionality and common labscript precepts to make DummyIntermediateDevice more useful, and representative of real intermediate devices.

TODO:

rpanderson commented 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)
philipstarkey commented 4 years ago

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.

philipstarkey commented 4 years ago

Let's target this for 3.1.0