Пример #1
0
    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')
Пример #2
0
 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()
Пример #3
0
 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')
Пример #4
0
 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
Пример #5
0
 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()
Пример #6
0
 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()
Пример #7
0
 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
Пример #8
0
 def lcr_update_interval(self):
     """LCR update interval in seconds."""
     return (self._lcr_update_interval_number.value *
             comet.ureg('ms')).to('s').m
Пример #9
0
def from_table_unit(value):
    """Convert table unit (micron) to millimeters."""
    return round((value * ureg("um")).to("mm").m, 3)
Пример #10
0
 def register_elm(self):
     self.register_parameter('elm_read_timeout', comet.ureg('60 s'), unit='s')
Пример #11
0
    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)
Пример #12
0
    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')
Пример #13
0
 def lcr_update_interval(self, value):
     self._lcr_update_interval_number.value = (value *
                                               comet.ureg('s')).to('ms').m
Пример #14
0
 def to_quantity(cls, value):
     """Auto convert to quantity for Pint units."""
     try:
         return comet.ureg(value)
     except pint.errors.UndefinedUnitError:
         return value
Пример #15
0
    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')
Пример #16
0
 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()
Пример #17
0
 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()
Пример #18
0
def to_table_unit(value):
    """Convert millimeters to table unit (micron)."""
    return round((value * ureg("mm")).to("um").m, 0)
Пример #19
0
 def dodge_height(self):
     return (self._dodge_height_number.value * comet.ureg('um')).to('mm').m
Пример #20
0
 def step_up_delay(self, value):
     self._step_up_delay_number.value = (value * comet.ureg('s')).to('ms').m
Пример #21
0
 def step_up_delay(self):
     """Return step up delay in seconds."""
     return (self._step_up_delay_number.value * comet.ureg('ms')).to('s').m
Пример #22
0
 def dodge_height(self, value):
     self._dodge_height_number.value = (value * comet.ureg('mm')).to('um').m