def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title = "IV Ramp" self.register_vsource() self.register_environment() self.plot = ui.Plot(height=300, legend="right") self.plot.add_axis("x", align="bottom", text="Voltage [V] (abs)") self.plot.add_axis("y", align="right", text="Current [uA]") self.plot.add_series("hvsrc", "x", "y", text="HV Source", color="red") self.plot.add_series("xfit", "x", "y", text="Fit", color="magenta") self.data_tabs.insert(0, ui.Tab(title="IV Curve", layout=self.plot)) self.voltage_start = ui.Number(decimals=3, suffix="V") self.voltage_stop = ui.Number(decimals=3, suffix="V") self.voltage_step = ui.Number(minimum=0, maximum=200, decimals=3, suffix="V") self.waiting_time = ui.Number(minimum=0, decimals=2, suffix="s") self.hvsrc_current_compliance = ui.Metric(minimum=0, decimals=3, prefixes='mun', unit="A") self.bind("voltage_start", self.voltage_start, 0, unit="V") self.bind("voltage_stop", self.voltage_stop, 100, unit="V") self.bind("voltage_step", self.voltage_step, 1, unit="V") self.bind("waiting_time", self.waiting_time, 1, unit="s") self.bind("hvsrc_current_compliance", self.hvsrc_current_compliance, 0, unit="A") self.general_tab.layout = ui.Row( ui.GroupBox( title="Ramp", layout=ui.Column( ui.Label(text="Start"), self.voltage_start, ui.Label(text="Stop"), self.voltage_stop, ui.Label(text="Step"), self.voltage_step, ui.Label(text="Waiting Time"), self.waiting_time, ui.Spacer() ) ), ui.GroupBox( title="HV Source", layout=ui.Column( ui.Label(text="Compliance"), self.hvsrc_current_compliance, ui.Spacer() ) ), ui.Spacer(), stretch=(1, 1, 1) ) ampere = comet.ureg('A') volt = comet.ureg('V') self.series_transform['hvsrc'] = lambda x, y: ((x * volt).to('V').m, (y * ampere).to('uA').m) self.series_transform['xfit'] = self.series_transform.get('hvsrc')
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.register_parameter('voltage_start', unit='V', required=True) self.register_parameter('voltage_stop', unit='V', required=True) self.register_parameter('voltage_step', unit='V', required=True) self.register_parameter('waiting_time', 1.0, unit='s') self.register_parameter('hvsrc_current_compliance', unit='A', required=True) self.register_parameter('elm_filter_enable', False, type=bool) self.register_parameter('elm_filter_count', 10, type=int) self.register_parameter('elm_filter_type', 'repeat') self.register_parameter('elm_zero_correction', False, type=bool) self.register_parameter('elm_integration_rate', 50, type=int) self.register_parameter('elm_current_range', comet.ureg('20 pA'), unit='A') self.register_parameter('elm_current_autorange_enable', False, type=bool) self.register_parameter('elm_current_autorange_minimum', comet.ureg('20 pA'), unit='A') self.register_parameter('elm_current_autorange_maximum', comet.ureg('20 mA'), unit='A') self.register_hvsource() self.register_elm() self.register_environment() self.register_analysis()
def register_hvsource(self): ##self.register_parameter('hvsrc_current_compliance', unit='A', required=True) self.register_parameter('hvsrc_sense_mode', 'local', values=('local', 'remote')) self.register_parameter('hvsrc_route_terminal', 'rear', values=('front', 'rear')) self.register_parameter('hvsrc_filter_enable', False, type=bool) self.register_parameter('hvsrc_filter_count', 10, type=int) self.register_parameter('hvsrc_filter_type', 'repeat', values=('repeat', 'moving')) self.register_parameter('hvsrc_source_voltage_autorange_enable', True, type=bool) self.register_parameter('hvsrc_source_voltage_range', comet.ureg('20 V'), unit='V')
def update_z_buttons(self, z): # Disable move up button for large step sizes z_enabled = False if not math.isnan(z): if (z + self.step_width) <= self.z_limit: z_enabled = True else: z_enabled = self.step_width <= self.maximum_z_step_size self.add_z_button.enabled = z_enabled step_up_limit = comet.ureg('10.0 um').to('mm').m self.step_up_button.enabled = z_enabled and ( self.step_width <= step_up_limit) # TODO
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.register_parameter('bias_voltage_start', unit='V', required=True) self.register_parameter('bias_voltage_stop', unit='V', required=True) self.register_parameter('bias_voltage_step', unit='V', required=True) self.register_parameter('waiting_time', 1.0, unit='s') self.register_parameter('bias_voltage_step_before', comet.ureg('0 V'), unit='V') self.register_parameter('waiting_time_before', comet.ureg('100 ms'), unit='s') self.register_parameter('bias_voltage_step_after', comet.ureg('0 V'), unit='V') self.register_parameter('waiting_time_after', comet.ureg('100 ms'), unit='s') self.register_parameter('waiting_time_start', comet.ureg('0 s'), unit='s') self.register_parameter('waiting_time_end', comet.ureg('0 s'), unit='s') self.register_parameter('hvsrc_current_compliance', unit='A', required=True) self.register_parameter('hvsrc_accept_compliance', False, type=bool) self.register_hvsource() self.register_lcr() self.register_environment() self.register_analysis()
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.register_parameter('bias_voltage_start', unit='V', required=True) self.register_parameter('bias_voltage_stop', unit='V', required=True) self.register_parameter('bias_voltage_step', unit='V', required=True) self.register_parameter('waiting_time', 1.0, unit='s') self.register_parameter('bias_voltage_step_before', comet.ureg('0 V'), unit='V') self.register_parameter('waiting_time_before', comet.ureg('100 ms'), unit='s') self.register_parameter('bias_voltage_step_after', comet.ureg('0 V'), unit='V') self.register_parameter('waiting_time_after', comet.ureg('100 ms'), unit='s') self.register_parameter('waiting_time_start', comet.ureg('0 s'), unit='s') self.register_parameter('waiting_time_end', comet.ureg('0 s'), unit='s') self.register_lcr() self.register_environment() self.register_analysis()
def store(self): """Store UI element values to measurement parameters.""" if self.measurement: parameters = self.measurement.parameters for key, item in self._bindings.items(): element, default, unit = item if isinstance(element, ui.List): value = getattr(element, "values") elif isinstance(element, ui.ComboBox): value = getattr(element, "current") elif isinstance(element, ui.CheckBox): value = getattr(element, "checked") elif isinstance(element, ui.Text): value = getattr(element, "value") elif isinstance(element, ui.Label): value = getattr(element, "text") elif isinstance(element, ui.Metric): value = getattr(element, "value") else: value = getattr(element, "value") if unit is not None: value = value * comet.ureg(unit) parameters[key] = value
def lcr_update_interval(self): """LCR update interval in seconds.""" return (self._lcr_update_interval_number.value * comet.ureg('ms')).to('s').m
def from_table_unit(value): """Convert table unit (micron) to millimeters.""" return round((value * ureg("um")).to("mm").m, 3)
def register_elm(self): self.register_parameter('elm_read_timeout', comet.ureg('60 s'), unit='s')
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title = "CV Ramp (V Source)" self.register_hvsource() self.register_lcr() self.register_environment() self.plot = ui.Plot(height=300, legend="right") self.plot.add_axis("x", align="bottom", text="Voltage [V] (abs)") self.plot.add_axis("y", align="right", text="Capacitance [pF]") self.plot.add_series("lcr", "x", "y", text="LCR Cp", color="blue") self.data_tabs.insert(0, ui.Tab(title="CV Curve", layout=self.plot)) self.plot2 = ui.Plot(height=300, legend="right") self.plot2.add_axis("x", align="bottom", text="Voltage [V] (abs)") self.plot2.add_axis("y", align="right", text="1/Capacitance² [1/F²]") self.plot2.axes.get("y").qt.setLabelFormat("%G") self.plot2.add_series("lcr2", "x", "y", text="LCR Cp", color="blue") self.data_tabs.insert(1, ui.Tab(title="1/C² Curve", layout=self.plot2)) self.voltage_start = ui.Number(decimals=3, suffix="V") self.voltage_stop = ui.Number(decimals=3, suffix="V") self.voltage_step = ui.Number(minimum=0, maximum=200, decimals=3, suffix="V") self.waiting_time = ui.Number(minimum=0, decimals=2, suffix="s") self.vsrc_current_compliance = ui.Number(decimals=3, suffix="uA") self.lcr_frequency = ui.Number(value=1, minimum=0.020, maximum=20e3, decimals=3, suffix="kHz") self.lcr_amplitude = ui.Number(minimum=0, decimals=3, suffix="mV") self.bind("bias_voltage_start", self.voltage_start, 0, unit="V") self.bind("bias_voltage_stop", self.voltage_stop, 100, unit="V") self.bind("bias_voltage_step", self.voltage_step, 1, unit="V") self.bind("waiting_time", self.waiting_time, 1, unit="s") self.bind("vsrc_current_compliance", self.vsrc_current_compliance, 0, unit="uA") self.bind("lcr_frequency", self.lcr_frequency, 1.0, unit="kHz") self.bind("lcr_amplitude", self.lcr_amplitude, 250, unit="mV") self.general_tab.layout = ui.Row( ui.GroupBox(title="V Source Ramp", layout=ui.Column(ui.Label(text="Start"), self.voltage_start, ui.Label(text="Stop"), self.voltage_stop, ui.Label(text="Step"), self.voltage_step, ui.Label(text="Waiting Time"), self.waiting_time, ui.Spacer())), ui.GroupBox(title="V Source", layout=ui.Column(ui.Label(text="Compliance"), self.vsrc_current_compliance, ui.Spacer())), ui.GroupBox(title="LCR", layout=ui.Column(ui.Label(text="AC Frequency"), self.lcr_frequency, ui.Label(text="AC Amplitude"), self.lcr_amplitude, ui.Spacer())), stretch=(1, 1, 1)) fahrad = comet.ureg('F') volt = comet.ureg('V') self.series_transform['lcr'] = lambda x, y: ((x * volt).to('V').m, (y * fahrad).to('pF').m)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title = "IV Ramp Bias Elm" self.register_vsource() self.register_hvsource() self.register_electrometer() self.register_environment() self.plot = ui.Plot(height=300, legend="right") self.plot.add_axis("x", align="bottom", text="Voltage [V]") self.plot.add_axis("y", align="right", text="Current [uA]") self.plot.add_series("elm", "x", "y", text="Electrometer", color="blue") self.plot.add_series("xfit", "x", "y", text="Fit", color="magenta") self.data_tabs.insert(0, ui.Tab(title="IV Curve", layout=self.plot)) self.voltage_start = ui.Number(decimals=3, suffix="V") self.voltage_stop = ui.Number(decimals=3, suffix="V") self.voltage_step = ui.Number(minimum=0, maximum=200, decimals=3, suffix="V") self.waiting_time = ui.Number(minimum=0, decimals=2, suffix="s") self.bias_voltage = ui.Number(decimals=3, suffix="V") self.bias_mode = ui.ComboBox(["constant", "offset"]) self.hvsrc_current_compliance = ui.Number(decimals=3, suffix="uA") self.hvsrc_accept_compliance = ui.CheckBox("Accept Compliance") self.vsrc_current_compliance = ui.Number(decimals=3, suffix="uA") self.vsrc_accept_compliance = ui.CheckBox("Accept Compliance") self.bind("voltage_start", self.voltage_start, 0, unit="V") self.bind("voltage_stop", self.voltage_stop, 0, unit="V") self.bind("voltage_step", self.voltage_step, 0, unit="V") self.bind("waiting_time", self.waiting_time, 1, unit="s") self.bind("bias_voltage", self.bias_voltage, 0, unit="V") self.bind("bias_mode", self.bias_mode, "constant") self.bind("hvsrc_current_compliance", self.hvsrc_current_compliance, 0, unit="uA") self.bind("hvsrc_accept_compliance", self.hvsrc_accept_compliance, False) self.bind("vsrc_current_compliance", self.vsrc_current_compliance, 0, unit="uA") self.bind("vsrc_accept_compliance", self.vsrc_accept_compliance, False) self.general_tab.layout = ui.Row( ui.GroupBox(title="HV Source Ramp", layout=ui.Column(ui.Label(text="Start"), self.voltage_start, ui.Label(text="Stop"), self.voltage_stop, ui.Label(text="Step"), self.voltage_step, ui.Label(text="Waiting Time"), self.waiting_time, ui.Spacer())), ui.GroupBox(title="V Source Bias", layout=ui.Column(ui.Label(text="Bias Voltage"), self.bias_voltage, ui.Label(text="Bias Compliance"), self.vsrc_current_compliance, self.vsrc_accept_compliance, ui.Label(text="Bias Mode"), self.bias_mode, ui.Spacer())), ui.GroupBox(title="HV Source", layout=ui.Column(ui.Label(text="Compliance"), self.hvsrc_current_compliance, self.hvsrc_accept_compliance, ui.Spacer())), stretch=(1, 1, 1)) ampere = comet.ureg('A') volt = comet.ureg('V') self.series_transform['elm'] = lambda x, y: ((x * volt).to('V').m, (y * ampere).to('uA').m) self.series_transform['xfit'] = self.series_transform.get('elm')
def lcr_update_interval(self, value): self._lcr_update_interval_number.value = (value * comet.ureg('s')).to('ms').m
def to_quantity(cls, value): """Auto convert to quantity for Pint units.""" try: return comet.ureg(value) except pint.errors.UndefinedUnitError: return value
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title = "Frequency Scan" self.register_vsource() self.register_lcr() self.register_environment() self.plot = ui.Plot(height=300, legend="right") self.plot.add_axis("x", align="bottom", text="Voltage [V] (abs)") self.plot.add_axis("y", align="right", text="Capacitance [pF]") self.plot.add_series("lcr", "x", "y", text="LCR", color="blue") self.data_tabs.insert(0, ui.Tab(title="CV Curve", layout=self.plot)) self.bias_voltage = ui.Number(decimals=3, suffix="V") self.hvsrc_current_compliance = ui.Number(decimals=3, suffix="uA") self.lcr_frequency_start = ui.Number(minimum=0, decimals=3, suffix="Hz") self.lcr_frequency_stop = ui.Number(minimum=0, decimals=3, suffix="MHz") self.lcr_frequency_steps = ui.Number(minimum=1, maximum=1000, decimals=0) self.lcr_amplitude = ui.Number(minimum=0, decimals=3, suffix="mV") self.bind("bias_voltage", self.bias_voltage, 0, unit="V") self.bind("hvsrc_current_compliance", self.hvsrc_current_compliance, 0, unit="uA") self.bind("lcr_frequency_start", self.lcr_frequency_start, 0, unit="Hz") self.bind("lcr_frequency_stop", self.lcr_frequency_stop, 0, unit="MHz") self.bind("lcr_frequency_steps", self.lcr_frequency_steps, 1) self.bind("lcr_amplitude", self.lcr_amplitude, 0, unit="mV") self.general_tab.layout = ui.Row( ui.GroupBox(title="HV Source", layout=ui.Column(ui.Label(text="Bias Voltage"), self.bias_voltage, ui.Label(text="Current Compliance"), self.hvsrc_current_compliance, ui.Spacer())), ui.GroupBox(title="LCR", layout=ui.Column( ui.Label(text="AC Frequency Start"), self.lcr_frequency_start, ui.Label(text="AC Frequency Stop"), self.lcr_frequency_stop, ui.Label(text="AC Frequency Steps (log10)"), self.lcr_frequency_steps, ui.Label(text="AC Amplitude"), self.lcr_amplitude, ui.Spacer())), ui.Spacer(), stretch=(1, 1, 1)) fahrad = comet.ureg('F') volt = comet.ureg('V') self.series_transform['lcr'] = lambda x, y: ((x * volt).to('V').m, (y * fahrad).to('pF').m) self.series_transform['xfit'] = self.series_transform.get('lcr')
def __init__(self, process): super().__init__() self.mount(process) self.resize(640, 480) self.title = "Table Control" self.add_x_button = KeypadButton(text="+X", clicked=self.on_add_x) self.sub_x_button = KeypadButton(text="-X", clicked=self.on_sub_x) self.add_y_button = KeypadButton(text="+Y", clicked=self.on_add_y) self.sub_y_button = KeypadButton(text="-Y", clicked=self.on_sub_y) self.add_z_button = KeypadButton(text="+Z", clicked=self.on_add_z) self.sub_z_button = KeypadButton(text="-Z", clicked=self.on_sub_z) self.control_buttons = (self.add_x_button, self.sub_x_button, self.add_y_button, self.sub_y_button, self.add_z_button, self.sub_z_button) self.probecard_light_button = ToggleButton( text="PC Light", tool_tip="Toggle probe card light", checkable=True, checked=False, enabled=False, toggled=self.on_probecard_light_clicked) self.microscope_light_button = ToggleButton( text="Mic Light", tool_tip="Toggle microscope light", checkable=True, checked=False, enabled=False, toggled=self.on_microscope_light_clicked) self.box_light_button = ToggleButton(text="Box Light", tool_tip="Toggle box light", checkable=True, checked=False, enabled=False, toggled=self.on_box_light_clicked) # Create movement radio buttons self.step_width_buttons = ui.Column() for item in self.load_table_step_sizes(): step_size = item.get('step_size') * comet.ureg('um') step_color = item.get('step_color') step_size_label = format_metric(step_size.to('m').m, 'm', decimals=1) button = ui.RadioButton( text=step_size_label, tool_tip=f"Move in {step_size_label} steps.", stylesheet=f"QRadioButton:enabled{{color:{step_color};}}", checked=len(self.step_width_buttons) == 0, toggled=self.on_step_toggled) button.movement_width = step_size.to('mm').m button.movement_color = step_color self.step_width_buttons.append(button) self.control_layout = ui.Column(ui.Row(ui.Row( ui.Column(KeypadSpacer(), self.sub_y_button, KeypadSpacer()), ui.Column( self.sub_x_button, KeypadSpacer(), self.add_x_button, ), ui.Column( KeypadSpacer(), self.add_y_button, KeypadSpacer(), ), KeypadSpacer(), ui.Column(self.add_z_button, KeypadSpacer(), self.sub_z_button)), ui.Spacer(), stretch=(0, 1)), ui.Spacer(), stretch=(0, 1)) self.positions_widget = TablePositionsWidget( position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.contacts_widget = TableContactsWidget( position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.pos_x_label = PositionLabel() self.pos_y_label = PositionLabel() self.pos_z_label = PositionLabel() self.cal_x_label = CalibrationLabel("cal") self.cal_y_label = CalibrationLabel("cal") self.cal_z_label = CalibrationLabel("cal") self.rm_x_label = CalibrationLabel("rm") self.rm_y_label = CalibrationLabel("rm") self.rm_z_label = CalibrationLabel("rm") self.z_limit_label = PositionLabel() self.laser_label = SwitchLabel() self.calibrate_button = ui.Button(text="Calibrate", clicked=self.on_calibrate) self.update_interval_number = ui.Number( value=self.settings.get("table_control_update_interval") or 1.0, minimum=.5, maximum=10.0, decimals=2, step=0.25, suffix="s", changed=self.on_update_interval_changed) self.progress_bar = ui.ProgressBar(visible=False) self.message_label = ui.Label() self.stop_button = ui.Button(text="&Stop", default=False, auto_default=False, enabled=False, clicked=self.on_stop) self.close_button = ui.Button(text="&Close", default=False, auto_default=False, clicked=self.on_close) self.layout = ui.Column( ui.Row( ui.Column( ui.Row( ui.GroupBox( title="Control", layout=ui.Column( ui.Spacer(horizontal=False), self.control_layout, ui.Spacer(horizontal=False) ) ), ui.GroupBox( title="Step Width", layout=self.step_width_buttons ), ui.GroupBox( title="Lights", layout=ui.Column( self.probecard_light_button, self.microscope_light_button, self.box_light_button, ui.Spacer() ) ), stretch=(0, 1) ), ui.Tabs( ui.Tab( title="Move", layout=self.positions_widget ), ui.Tab( title="Contacts", layout=self.contacts_widget ), ui.Tab( title="Calibrate", layout=ui.Column( ui.GroupBox( title="Table Calibration", layout=ui.Column( ui.Row( self.calibrate_button, ui.Label("Calibrate table by moving into cal/rm switches\nof every axis in" \ " a safe manner to protect the probe card."), stretch=(0, 1) ) ) ), ui.Spacer(), stretch=(0, 1) ) ), ui.Tab( title="Options", layout=ui.Column( ui.GroupBox( title="Update Interval", layout=ui.Row( self.update_interval_number, ui.Spacer(), stretch=(0, 1) ) ), ui.Spacer(), stretch=(0, 1) ) ) ), stretch=(0, 1) ), ui.Column( ui.GroupBox( title="Position", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.pos_x_label, self.pos_y_label, self.pos_z_label ) ) ), ui.GroupBox( title="Calibration", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.cal_x_label, self.cal_y_label, self.cal_z_label ), ui.Column( self.rm_x_label, self.rm_y_label, self.rm_z_label ), stretch=(1, 1) ) ), ui.GroupBox( title="Limits", layout=ui.Row( ui.Column( ui.Label("Z") ), ui.Column( self.z_limit_label ) ) ), ui.GroupBox( title="Safety", layout=ui.Row( ui.Label( text="Laser Sensor" ), self.laser_label ) ), ui.Spacer() ), stretch=(1, 0) ), ui.Row( self.progress_bar, self.message_label, ui.Spacer(), self.stop_button, self.close_button ), stretch=(1, 0) ) self.close_event = self.on_close_event self.reset_position() self.reset_caldone() self.update_limits() self.reset_safety() self.update_control_buttons()
def __init__(self, process, lcr_process): super().__init__() self.lcr_process = lcr_process self.lcr_process.finished = self.on_lcr_finished self.lcr_process.failed = self.on_lcr_failed self.lcr_process.reading = self.on_lcr_reading self.mount(process) self.resize(640, 480) self.title = "Table Control" self.add_x_button = KeypadButton(text="+X", clicked=self.on_add_x) self.sub_x_button = KeypadButton(text="-X", clicked=self.on_sub_x) self.add_y_button = KeypadButton(text="+Y", clicked=self.on_add_y) self.sub_y_button = KeypadButton(text="-Y", clicked=self.on_sub_y) self.add_z_button = KeypadButton(text="+Z", clicked=self.on_add_z) self.sub_z_button = KeypadButton(text="-Z", clicked=self.on_sub_z) self.step_up_button = KeypadButton( text="↑⇵", tool_tip= "Step up, move single step up then double step down and double step up (experimental).", clicked=self.on_step_up) self.control_buttons = (self.add_x_button, self.sub_x_button, self.add_y_button, self.sub_y_button, self.add_z_button, self.sub_z_button, self.step_up_button) self._lcr_prim_text = ui.Text(readonly=True) self._lcr_sec_text = ui.Text(readonly=True) self._lcr_chart = LCRChart() self._lcr_groupbox = ui.GroupBox( title="Contact Quality (LCR)", checkable=True, checked=False, toggled=self.on_lcr_toggled, layout=ui.Column(ui.Row(ui.Label("Cp"), self._lcr_prim_text), ui.Row(ui.Label("Rp"), self._lcr_sec_text), self._lcr_chart)) self.probecard_light_button = ToggleButton( text="PC Light", tool_tip="Toggle probe card light", checkable=True, checked=False, enabled=False, toggled=self.on_probecard_light_clicked) self.microscope_light_button = ToggleButton( text="Mic Light", tool_tip="Toggle microscope light", checkable=True, checked=False, enabled=False, toggled=self.on_microscope_light_clicked) self.box_light_button = ToggleButton(text="Box Light", tool_tip="Toggle box light", checkable=True, checked=False, enabled=False, toggled=self.on_box_light_clicked) # Create movement radio buttons self.step_width_buttons = ui.Column() for item in self.load_table_step_sizes(): step_size = item.get('step_size') * comet.ureg('um') step_color = item.get('step_color') step_size_label = format_metric(step_size.to('m').m, 'm', decimals=1) button = ui.RadioButton( text=step_size_label, tool_tip=f"Move in {step_size_label} steps.", stylesheet=f"QRadioButton:enabled{{color:{step_color};}}", checked=len(self.step_width_buttons) == 0, toggled=self.on_step_toggled) button.movement_width = step_size.to('mm').m button.movement_color = step_color self.step_width_buttons.append(button) self.control_layout = ui.Column(ui.Row(ui.Row( ui.Column(KeypadSpacer(), self.sub_y_button, KeypadSpacer()), ui.Column( self.sub_x_button, KeypadSpacer(), self.add_x_button, ), ui.Column( KeypadSpacer(), self.add_y_button, KeypadSpacer(), ), KeypadSpacer(), ui.Column(ui.Row(self.add_z_button, self.step_up_button), KeypadSpacer(), self.sub_z_button)), ui.Spacer(), stretch=(0, 1)), ui.Spacer(), stretch=(0, 1)) self.positions_widget = TablePositionsWidget( enabled=False, position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self.contacts_widget = TableContactsWidget( enabled=False, position_picked=self.on_position_picked, absolute_move=self.on_absolute_move) self._position_widget = PositionWidget() self._calibration_widget = CalibrationWidget() self.z_limit_label = PositionLabel() self.x_hard_limit_label = PositionLabel() self.y_hard_limit_label = PositionLabel() self.z_hard_limit_label = PositionLabel() self.laser_label = SwitchLabel() self._calibrate_button = ui.Button(text="Calibrate", clicked=self.on_calibrate) self._update_interval_number = ui.Number( value=settings.table_control_update_interval, minimum=.5, maximum=10.0, decimals=2, step=0.25, suffix="s", changed=self.on_update_interval_changed) self._interval_groupbox = ui.GroupBox(title="Update Interval", layout=ui.Row( self._update_interval_number, ui.Spacer(), stretch=(0, 1))) self._dodge_height_number = ui.Number( tool_tip="Doge height in microns.", minimum=0, maximum=10000, decimals=0, step=1, suffix="um") self._dodge_groupbox = ui.GroupBox( title="X/Y Dodge", tool_tip="Enables -/+ Z dodge for XY movements.", checkable=True, layout=ui.Row(ui.Label("Height"), self._dodge_height_number, ui.Spacer(), stretch=(0, 0, 1))) self._lcr_reset_on_move_checkbox = ui.CheckBox( text="Reset graph on X/Y move") self._contact_quality_groupbox = ui.GroupBox( title="Contact Quality (LCR)", layout=ui.Row(self._lcr_reset_on_move_checkbox, ui.Spacer(), stretch=(0, 1))) self._step_up_delay_number = ui.Number(minimum=0, maximum=1000, decimals=0, step=25, suffix="ms") self._step_up_multiply_number = ui.Number(minimum=1, maximum=10, decimals=0, suffix="x") self._step_up_groubox = ui.GroupBox( title="Step Up (↑⇵)", layout=ui.Row( ui.Column(ui.Label("Delay"), ui.Label("Multiplicator (⇵)")), ui.Column(self._step_up_delay_number, self._step_up_multiply_number), ui.Spacer())) self._lcr_update_interval_number = ui.Number(minimum=0, maximum=1000, decimals=0, step=25, suffix="ms") self._lcr_matrix_channels_text = ui.Text() self._lcr_options_groupbox = ui.GroupBox( title="Contact Quality (LCR)", layout=ui.Row( ui.Column( ui.Label("Reading Interval"), ui.Label("Matrix Channels"), ), ui.Column( ui.Row(self._lcr_update_interval_number, ui.Spacer()), self._lcr_matrix_channels_text))) self.progress_bar = ui.ProgressBar(visible=False) self.message_label = ui.Label() self.stop_button = ui.Button(text="&Stop", default=False, auto_default=False, enabled=False, clicked=self.on_stop) self.close_button = ui.Button(text="&Close", default=False, auto_default=False, clicked=self.on_close) self.layout = ui.Column( ui.Row( ui.Column( ui.Row( ui.GroupBox( title="Control", layout=ui.Column( ui.Spacer(horizontal=False), self.control_layout, ui.Spacer(horizontal=False) ) ), ui.GroupBox( title="Step Width", layout=self.step_width_buttons ), self._lcr_groupbox, ui.Column( ui.GroupBox( title="Lights", layout=ui.Column( self.probecard_light_button, self.microscope_light_button, self.box_light_button, ui.Spacer() ) ) ), stretch=(0, 0, 1, 0) ), ui.Tabs( ui.Tab( title="Move", layout=self.positions_widget ), ui.Tab( title="Contacts", layout=self.contacts_widget ), ui.Tab( title="Calibrate", layout=ui.Column( ui.GroupBox( title="Table Calibration", layout=ui.Column( ui.Row( self._calibrate_button, ui.Label("Calibrate table by moving into cal/rm switches\nof every axis in" \ " a safe manner to protect the probe card."), stretch=(0, 1) ) ) ), ui.Spacer(), stretch=(0, 1) ) ), ui.Tab( title="Options", layout=ui.Column( ui.Row( self._interval_groupbox, self._dodge_groupbox, self._contact_quality_groupbox, stretch=(0, 0, 1) ), self._step_up_groubox, self._lcr_options_groupbox, ui.Spacer(), stretch=(0, 0, 0, 1) ) ) ), stretch=(0, 1) ), ui.Column( self._position_widget, self._calibration_widget, ui.GroupBox( title="Soft Limits", layout=ui.Row( ui.Column( ui.Label("Z") ), ui.Column( self.z_limit_label ) ) ), ui.GroupBox( title="Hard Limits", layout=ui.Row( ui.Column( ui.Label("X"), ui.Label("Y"), ui.Label("Z") ), ui.Column( self.x_hard_limit_label, self.y_hard_limit_label, self.z_hard_limit_label ) ) ), ui.GroupBox( title="Safety", layout=ui.Row( ui.Label( text="Laser Sensor" ), self.laser_label ) ), ui.Spacer() ), stretch=(1, 0) ), ui.Row( self.progress_bar, self.message_label, ui.Spacer(), self.stop_button, self.close_button ), stretch=(1, 0) ) self.close_event = self.on_close_event self.reset_position() self.reset_caldone() self.update_limits() self.reset_safety() self.update_control_buttons()
def to_table_unit(value): """Convert millimeters to table unit (micron).""" return round((value * ureg("mm")).to("um").m, 0)
def dodge_height(self): return (self._dodge_height_number.value * comet.ureg('um')).to('mm').m
def step_up_delay(self, value): self._step_up_delay_number.value = (value * comet.ureg('s')).to('ms').m
def step_up_delay(self): """Return step up delay in seconds.""" return (self._step_up_delay_number.value * comet.ureg('ms')).to('s').m
def dodge_height(self, value): self._dodge_height_number.value = (value * comet.ureg('mm')).to('um').m