def __init__(self, *args, **kwargs): self.kind = "spectrometer" mirror_list = ["front", "side"] self.entrance_mirror = pc.Combo( allowed_values=mirror_list, display=True, ) self.exit_mirror = pc.Combo( allowed_values=mirror_list, display=True, ) self.slit_limits = pc.NumberLimits(min_value=0, max_value=7, units="mm") self.front_entrance_slit = pc.Number(limits=self.slit_limits, units="mm", display=True) self.front_exit_slit = pc.Number(limits=self.slit_limits, units="mm", display=True) self.side_entrance_slit = pc.Number(limits=self.slit_limits, units="mm", display=True) self.side_exit_slit = pc.Number(limits=self.slit_limits, units="mm", display=True) hw.Hardware.__init__(self, *args, **kwargs)
def __init__(self, *arks, **kwargs): self.kind = "delay" self.factor = pc.Number(1, decimals=0, display=True) self.motor_limits = pc.NumberLimits(min_value=0, max_value=50, units="mm") self.motor_position = pc.Number(units="mm", display=True, limits=self.motor_limits) self.zero_position = pc.Number(display=True, units="mm", limits=self.motor_limits) hw.Hardware.__init__(self, *arks, **kwargs) self.label = pc.String(self.name, display=True)
def __init__(self, hardware, **kwargs): pc.Driver.__init__(self) # basic attributes self.hardware = hardware self.enqueued = self.hardware.enqueued self.busy = self.hardware.busy self.name = self.hardware.name self.model = self.hardware.model self.serial = self.hardware.serial self.label = pc.String(kwargs["label"], display=True) self.native_units = kwargs["native_units"] self.state_filepath = ( pathlib.Path(appdirs.user_data_dir("yaqc-cmds", "yaqc-cmds")) / "hardware" / f"{self.name}-state.toml") self.state_filepath.parent.mkdir(parents=True, exist_ok=True) # mutex attributes self.limits = pc.NumberLimits(units=self.native_units) if self.state_filepath.exists(): state = toml.load(self.state_filepath) else: state = {} self.offset = pc.Number(initial_value=0, units=self.native_units, name="Offset", display=True) self.load_state(state) # attributes for 'exposure' self.exposed = [self.position] self.recorded = collections.OrderedDict() print(self.name, type(self.name)) self.recorded[self.name] = [ self.position, self.native_units, 1.0, self.label.read(), False, ]
def initialize(self): arr = self.driver.get_arrangement() # self.hardware.driver.initialize() # container widget display_container_widget = QtWidgets.QWidget() display_container_widget.setLayout(QtWidgets.QVBoxLayout()) display_layout = display_container_widget.layout() display_layout.setMargin(0) self.layout.addWidget(display_container_widget) # plot self.plot_widget = pw.Plot1D() self.plot_widget.plot_object.setMouseEnabled(False, False) self.plot_curve = self.plot_widget.add_scatter() self.plot_h_line = self.plot_widget.add_infinite_line(angle=0, hide=False) self.plot_v_line = self.plot_widget.add_infinite_line(angle=90, hide=False) display_layout.addWidget(self.plot_widget) # vertical line line = pw.line("V") self.layout.addWidget(line) # container widget / scroll area settings_container_widget = QtWidgets.QWidget() settings_scroll_area = pw.scroll_area() settings_scroll_area.setWidget(settings_container_widget) settings_scroll_area.setMinimumWidth(300) settings_scroll_area.setMaximumWidth(300) settings_container_widget.setLayout(QtWidgets.QVBoxLayout()) settings_layout = settings_container_widget.layout() settings_layout.setMargin(5) self.layout.addWidget(settings_scroll_area) # opa properties input_table = pw.InputTable() settings_layout.addWidget(input_table) # plot control input_table = pw.InputTable() input_table.add("Display", None) self.plot_motor = pc.Combo(allowed_values=self.driver.curve.arrangements[arr].keys()) self.plot_motor.updated.connect(self.update_plot) input_table.add("Motor", self.plot_motor) allowed_values = list(wt.units.energy.keys()) self.plot_units = pc.Combo( initial_value=self.driver.native_units, allowed_values=allowed_values ) self.plot_units.updated.connect(self.update_plot) input_table.add("Units", self.plot_units) settings_layout.addWidget(input_table) # curves input_table = pw.InputTable() # input_table.add("Curves", None) self.arrangement_combo = pc.Combo(allowed_values=self.driver.curve.arrangements.keys()) self.arrangement_combo.write(arr) self.arrangement_combo.updated.connect(self.on_arrangement_updated) input_table.add("Arrangement", self.arrangement_combo) # limits limits = pc.NumberLimits() # units None self.low_energy_limit_display = pc.Number( units=self.driver.native_units, display=True, limits=limits ) input_table.add("Low Energy Limit", self.low_energy_limit_display) self.high_energy_limit_display = pc.Number( units=self.driver.native_units, display=True, limits=limits ) input_table.add("High Energy Limit", self.high_energy_limit_display) settings_layout.addWidget(input_table) self.driver.limits.updated.connect(self.on_limits_updated) # motors input_table = pw.InputTable() input_table.add("Setable", None) settings_layout.addWidget(input_table) for motor_name, motor_mutex in self.driver.motor_positions.items(): settings_layout.addWidget(MotorControlGUI(motor_name, motor_mutex, self.driver)) self.home_all_button = pw.SetButton("HOME ALL", "advanced") settings_layout.addWidget(self.home_all_button) self.home_all_button.clicked.connect(self.on_home_all) g.queue_control.disable_when_true(self.home_all_button) # stretch settings_layout.addStretch(1) # signals and slots self.arrangement_combo.updated.connect(self.update_plot) self.driver.update_ui.connect(self.update) # finish self.update() self.update_plot() self.on_limits_updated()