2828from labscript_utils .ls_zprocess import Event
2929from blacs .plugins import PLUGINS_DIR , callback
3030from blacs .device_base_class import DeviceTab
31+ from blacs .output_classes import AO as AO_output_class
32+ from blacs .output_classes import DO as DO_output_class
33+ from blacs .output_classes import DDS as DDS_output_class
3134
3235from .virtual_device_tab import VirtualDeviceTab
3336
@@ -159,6 +162,35 @@ def _get_root_parent(item):
159162 item = item .parent ()
160163 return item
161164
165+ def _get_child_outputs (self , conn_table , root_devs , dev_name , tab ):
166+ AOs = []
167+ DOs = []
168+ DDSs = []
169+
170+ device_conn = conn_table .find_by_name (dev_name )
171+ for child in device_conn .child_list .keys ():
172+ if child in root_devs :
173+ # Don't cross between tabs here
174+ continue
175+
176+ child_dev = device_conn .find_by_name (child )
177+ channel = tab .get_channel (child_dev .parent_port )
178+ if channel is None :
179+ AOs_ , DOs_ , DDSs_ = self ._get_child_outputs (conn_table , root_devs , child , tab )
180+
181+ AOs += AOs_
182+ DOs += DOs_
183+ DDSs += DDSs_
184+ elif isinstance (channel , DO_output_class ):
185+ inv = child_dev .properties ['inverted' ] if 'inverted' in child_dev .properties else False
186+ DOs .append ((child , child_dev .parent_port , inv ))
187+ elif isinstance (channel , AO_output_class ):
188+ AOs .append ((child , child_dev .parent_port ))
189+ elif isinstance (channel , DDS_output_class ):
190+ DDSS .append ((child , child_dev .parent_port ))
191+
192+ return AOs , DOs , DDSs
193+
162194 def __init__ (self , BLACS ):
163195 self .BLACS = BLACS
164196
@@ -174,37 +206,41 @@ def __init__(self, BLACS):
174206 self .connection_table_model .appendRow ([device_item ])
175207
176208 analog_outputs = QStandardItem ('Analog Outputs' )
209+ digital_outputs = QStandardItem ('Digital Outputs' )
210+ dds_outputs = QStandardItem ('DDS Outputs' )
211+
177212 device_item .appendRow (analog_outputs )
178- for AO_name , AO_dev in tab ._AO .items ():
179- conn_table_dev = connection_table .find_by_name (AO_dev .name .split (' - ' ).pop (1 ))
180- if conn_table_dev is None :
181- # Don't list devices not in the connection table to reduce clutter
182- continue
183- AO_item = QStandardItem (AO_dev .name )
213+ device_item .appendRow (digital_outputs )
214+ device_item .appendRow (dds_outputs )
215+
216+ root_devs = self .BLACS ['ui' ].blacs .tablist .keys ()
217+ AOs , DOs , DDSs = self ._get_child_outputs (connection_table , root_devs , tab_name , tab )
218+
219+ for DO in DOs :
220+ DO_item = QStandardItem (DO [1 ] + ' - ' + DO [0 ])
221+ add_to_vd_item = QStandardItem ()
222+ add_to_vd_item .setIcon (QIcon (':qtutils/fugue/arrow' ))
223+ add_to_vd_item .setEditable (False )
224+ add_to_vd_item .setToolTip ('Add this output to selected virtual device' )
225+ add_to_vd_item .setData (DO [1 ], self .CT_TREE_ROLE_NAME )
226+ add_to_vd_item .setData (DO [2 ], self .CT_TREE_ROLE_DO_INVERTED )
227+ digital_outputs .appendRow ([DO_item , add_to_vd_item ])
228+ for AO in AOs :
229+ AO_item = QStandardItem (AO [1 ] + ' - ' + AO [0 ])
184230 add_to_vd_item = QStandardItem ()
185231 add_to_vd_item .setIcon (QIcon (':qtutils/fugue/arrow' ))
186232 add_to_vd_item .setEditable (False )
187233 add_to_vd_item .setToolTip ('Add this output to selected virtual device' )
188- add_to_vd_item .setData (AO_name , self .CT_TREE_ROLE_NAME )
234+ add_to_vd_item .setData (AO [ 1 ] , self .CT_TREE_ROLE_NAME )
189235 analog_outputs .appendRow ([AO_item , add_to_vd_item ])
190-
191- digital_outputs = QStandardItem ('Digital Outputs' )
192- device_item .appendRow (digital_outputs )
193- for DO_name , DO_dev in tab ._DO .items ():
194- conn_table_dev = connection_table .find_by_name (DO_dev .name .split (' - ' ).pop (1 ))
195- if conn_table_dev is None :
196- # Don't list devices not in the connection table to reduce clutter
197- continue
198- print (conn_table_dev .properties )
199- DO_item = QStandardItem (DO_dev .name )
236+ for DDS in DDSs :
237+ DDS_item = QStandardItem (DDS [1 ] + ' - ' + DDS [0 ])
200238 add_to_vd_item = QStandardItem ()
201239 add_to_vd_item .setIcon (QIcon (':qtutils/fugue/arrow' ))
202240 add_to_vd_item .setEditable (False )
203241 add_to_vd_item .setToolTip ('Add this output to selected virtual device' )
204- add_to_vd_item .setData (DO_name , self .CT_TREE_ROLE_NAME )
205- inverted = conn_table_dev .properties ['inverted' ] if 'inverted' in conn_table_dev .properties else False
206- add_to_vd_item .setData (inverted , self .CT_TREE_ROLE_DO_INVERTED )
207- digital_outputs .appendRow ([DO_item , add_to_vd_item ])
242+ add_to_vd_item .setData (DDS [1 ], self .CT_TREE_ROLE_NAME )
243+ dds_outputs .appendRow ([DDS_item , add_to_vd_item ])
208244
209245 self .virtual_device_model = QStandardItemModel ()
210246 self .virtual_device_model .setHorizontalHeaderLabels (['Virtual Devices' , 'Up' , 'Down' , 'Remove' ])
0 commit comments