示例#1
0
    def __init__(self, message_changed=None, progress_changed=None, **kwargs):
        super().__init__()
        # Properties
        self.collapsible = False
        # Callbacks
        self.message_changed = message_changed
        self.progress_changed = progress_changed
        # Layout
        self.sequence_tree = SequenceTree(
            selected=self.on_tree_selected,
            double_clicked=self.on_tree_double_clicked
        )
        self.sequence_tree.minimum_width = 360

        self.start_all_action = ui.Action(
            text="&All Samples",
            triggered=self.on_start_all
        )

        self.start_sample_action = ui.Action(
            text="&Sample",
            triggered=self.on_start
        )
        self.start_sample_action.qt.setEnabled(False)

        self.start_contact_action = ui.Action(
            text="&Contact",
            triggered=self.on_start
        )
        self.start_contact_action.qt.setEnabled(False)

        self.start_measurement_action = ui.Action(
            text="&Measurement",
            triggered=self.on_start
        )
        self.start_measurement_action.qt.setEnabled(False)

        self.start_menu = ui.Menu()
        self.start_menu.append(self.start_all_action)
        self.start_menu.append(self.start_sample_action)
        self.start_menu.append(self.start_contact_action)
        self.start_menu.append(self.start_measurement_action)

        self.start_button = ui.Button(
            text="Start",
            tool_tip="Start measurement sequence.",
            stylesheet="QPushButton:enabled{color:green;font-weight:bold;}"
        )
        self.start_button.qt.setMenu(self.start_menu.qt)

        self.stop_button = ui.Button(
            text="Stop",
            tool_tip="Stop measurement sequence.",
            enabled=False,
            clicked=self.on_stop,
            stylesheet="QPushButton:enabled{color:red;font-weight:bold;}"
        )

        self.reset_button = ui.Button(
            text="Reset",
            tool_tip="Reset measurement sequence state.",
            clicked=self.on_reset_sequence_state
        )

        self.reload_config_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'reload.svg'),
            tool_tip="Reload sequence configurations from file.",
            clicked=self.on_reload_config_clicked
        )

        self.add_sample_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'add.svg'),
            tool_tip="Add new sample sequence.",
            clicked=self.on_add_sample_clicked
        )
        self.remove_sample_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'delete.svg'),
            tool_tip="Remove current sample sequence.",
            clicked=self.on_remove_sample_clicked
        )

        self.sequence_groupbox = ui.GroupBox(
            title="Sequence",
            layout=ui.Column(
                self.sequence_tree,
                ui.Row(
                    self.start_button,
                    self.stop_button,
                    self.reset_button,
                    self.reload_config_button,
                    self.add_sample_button,
                    self.remove_sample_button
                )
            )
        )

        # Environment Controls

        self.environment_control_widget = EnvironmentControlWidget(
            toggled=self.on_environment_groupbox_toggled,
            laser_sensor_toggled=self.on_laser_sensor_toggled,
            box_light_toggled=self.on_box_light_toggled,
            microscope_light_toggled=self.on_microscope_light_toggled,
            microscope_camera_toggled=self.on_microscope_camera_toggled,
            microscope_control_toggled=self.on_microscope_control_toggled,
            probecard_light_toggled=self.on_probecard_light_toggled,
            probecard_camera_toggled=self.on_probecard_camera_toggled,
            pid_control_toggled=self.on_pid_control_toggled
        )

        # Table controls

        self.table_control_widget = TableControlWidget(
            toggled=self.on_table_groupbox_toggled,
            joystick_toggled=self.on_table_joystick_toggled,
            control_clicked=self.on_table_control_clicked
        )

        # Operator

        self.operator_widget = OperatorWidget()
        self.operator_widget.load_settings()
        self.operator_groupbox = ui.GroupBox(
            title="Operator",
            layout=self.operator_widget
        )

        # Working directory

        self.output_widget = WorkingDirectoryWidget()

        self.output_groupbox = ui.GroupBox(
            title="Working Directory",
            layout=self.output_widget
        )

        # Controls

        self.control_widget = ui.Column(
            self.sequence_groupbox,
            self.table_control_widget,
            self.environment_control_widget,
            ui.Row(
                self.operator_groupbox,
                self.output_groupbox,
                stretch=(3, 7)
            ),
            stretch=(1, 0, 0)
        )

        # Tabs

        self.measurement_tab = MeasurementTab(restore=self.on_measure_restore)
        self.environment_tab = EnvironmentTab()
        self.status_tab = StatusTab(reload=self.on_status_start)
        self.summary_tab = SummaryTab()

        self.panels = self.measurement_tab.panels
        self.panels.sample_changed = self.on_sample_changed

        self.log_widget = LogWidget()
        self.log_widget.add_logger(logging.getLogger())

        self.logging_tab = ui.Tab(
            title="Logs",
            layout=self.log_widget
        )

        # Tabs

        self.tab_widget = ui.Tabs(
            self.measurement_tab,
            self.environment_tab,
            self.status_tab,
            self.logging_tab,
            self.summary_tab
        )

        # Layout

        self.append(self.control_widget)
        self.append(self.tab_widget)
        self.stretch = 4, 9

        # Setup process callbacks

        self.environ_process = self.processes.get("environ")
        self.environ_process.pc_data_updated = self.on_pc_data_updated

        self.status_process = self.processes.get("status")
        self.status_process.finished = self.on_status_finished

        self.table_process = self.processes.get("table")
        self.table_process.joystick_changed = self.on_table_joystick_changed
        self.table_process.position_changed = self.on_table_position_changed

        self.measure_process = self.processes.get("measure")
        self.measure_process.finished = self.on_finished
        self.measure_process.measurement_state = self.on_measurement_state
        self.measure_process.save_to_image = self.on_save_to_image

        # Experimental

        # Install timer to update environment controls
        self.environment_timer = Timer(timeout=self.sync_environment_controls)
        self.environment_timer.start(self.environment_poll_interval)
示例#2
0
def main():

    args = parse_args()

    # Logging

    logging.getLogger().setLevel(logging.INFO)
    logging.info("PQC version %s", __version__)

    app = comet.Application("comet-pqc")
    app.version = __version__
    app.title = f"PQC {__version__}"
    app.about = f"COMET application for PQC measurements, version {__version__}."

    # Register devices

    app.resources.add("matrix", comet.Resource(
        resource_name="TCPIP::10.0.0.2::5025::SOCKET",
        encoding='latin1',
        read_termination="\n",
        write_termination="\n"
    ))
    app.resources.add("hvsrc", comet.Resource(
        resource_name="TCPIP::10.0.0.5::10002::SOCKET",
        read_termination="\r\n",
        write_termination="\r\n",
        timeout=4000
    ))
    app.resources.add("vsrc", comet.Resource(
        resource_name="TCPIP::10.0.0.3::5025::SOCKET",
        encoding='latin1',
        read_termination="\n",
        write_termination="\n"
    ))
    app.resources.add("lcr", comet.Resource(
        resource_name="TCPIP::10.0.0.4::5025::SOCKET",
        read_termination="\n",
        write_termination="\n",
        timeout=8000
    ))
    app.resources.add("elm", comet.Resource(
        resource_name="TCPIP::10.0.0.5::10001::SOCKET",
        read_termination="\r\n",
        write_termination="\r\n",
        timeout=8000
    ))
    app.resources.add("table", comet.Resource(
        resource_name="TCPIP::10.0.0.6::23::SOCKET",
        read_termination="\r\n",
        write_termination="\r\n",
        timeout=8000
    ))
    app.resources.add("environ", comet.Resource(
        resource_name="TCPIP::10.0.0.8::10001::SOCKET",
        read_termination="\r\n",
        write_termination="\r\n"
    ))
    app.resources.load_settings()

    # Callbacks

    def on_show_error(exc, tb):
        app.message = "Exception occured!"
        app.progress = None
        logging.error(tb)
        ui.show_exception(exc, tb)

    def on_message(message):
        ## logging.info(message)
        app.message = message

    def on_progress(value, maximum):
        if value == maximum:
            app.progress = None
        else:
            app.progress = value, maximum

    # Register processes

    app.processes.add("environ", EnvironmentProcess(
        name="environ",
        failed=on_show_error
    ))
    app.processes.add("status", StatusProcess(
        failed=on_show_error,
        message=on_message,
        progress=on_progress
    ))
    app.processes.add("table", AlternateTableProcess(
        failed=on_show_error
    ))
    app.processes.add("measure", MeasureProcess(
        failed=on_show_error,
        message=on_message,
        progress=on_progress,
    ))

    # Dashboard

    dashboard = Dashboard(
        message_changed=on_message,
        progress_changed=on_progress
    )

    # Layout

    app.layout = dashboard

    # Restore window size
    app.width, app.height = app.settings.get('window_size', (1420, 920))

    # Extend actions
    app.window.github_action = ui.Action(
        text="&GitHub",
        triggered=dashboard.on_github
    )

    # Extend menus
    app.window.file_menu.insert(-1, ui.Action(separator=True))
    app.window.help_menu.insert(1, app.window.github_action)

    # Extend preferences
    table_tab = TableTab()
    app.window.preferences_dialog.tab_widget.append(table_tab)
    app.window.preferences_dialog.table_tab = table_tab
    options_tab = OptionsTab()
    app.window.preferences_dialog.tab_widget.append(options_tab)
    app.window.preferences_dialog.options_tab = options_tab

    # Set URLs
    app.window.contents_url = CONTENTS_URL
    app.window.github_url = GITHUB_URL

    # Fix progress bar width
    app.window.progress_bar.width = 600

    # Load configurations
    dashboard.load_settings()

    # Sync environment controls
    if dashboard.use_environment():
        dashboard.environ_process.start()
        dashboard.sync_environment_controls()

    if dashboard.use_table():
        dashboard.table_process.start()
        dashboard.sync_table_controls()

    # HACK: resize preferences dialog for HiDPI
    dialog_size = app.settings.get('preferences_dialog_size', (640, 480))
    app.window.preferences_dialog.resize(*dialog_size)

    result = app.run()

    dashboard.store_settings()

    # Store window size
    app.settings['window_size'] = app.width, app.height
    dialog_size = app.window.preferences_dialog.size
    app.settings['preferences_dialog_size'] = dialog_size

    return result
示例#3
0
 def _setup_actions(self):
     self.app.window.github_action = ui.Action(
         text="&GitHub", triggered=self.dashboard.on_github)
示例#4
0
 def _setup_menus(self):
     self.app.window.file_menu.insert(-1, ui.Action(separator=True))
     self.app.window.help_menu.insert(1, self.app.window.github_action)
示例#5
0
    def __init__(self, *, tree_selected, tree_double_clicked, start_all, start,
                 stop, reset_sequence_state, edit_sequence):
        super().__init__()
        self.current_path = user_home()
        self.title = "Sequence"
        self.tree_double_clicked = tree_double_clicked

        self._sequence_tree = SequenceTree(
            selected=tree_selected, double_clicked=self.tree_double_clicked)
        self._sequence_tree.minimum_width = 360

        self._start_all_action = ui.Action(text="&All Samples",
                                           triggered=start_all)

        self._start_sample_action = ui.Action(text="&Sample", triggered=start)
        self._start_sample_action.qt.setEnabled(False)

        self._start_contact_action = ui.Action(text="&Contact",
                                               triggered=start)
        self._start_contact_action.qt.setEnabled(False)

        self._start_measurement_action = ui.Action(text="&Measurement",
                                                   triggered=start)
        self._start_measurement_action.qt.setEnabled(False)

        self._start_menu = ui.Menu()
        self._start_menu.append(self._start_all_action)
        self._start_menu.append(self._start_sample_action)
        self._start_menu.append(self._start_contact_action)
        self._start_menu.append(self._start_measurement_action)

        self._start_button = ui.Button(
            text="Start",
            tool_tip="Start measurement sequence.",
            stylesheet="QPushButton:enabled{color:green;font-weight:bold;}")
        self._start_button.qt.setMenu(self._start_menu.qt)

        self._stop_button = ui.Button(
            text="Stop",
            tool_tip="Stop measurement sequence.",
            enabled=False,
            clicked=stop,
            stylesheet="QPushButton:enabled{color:red;font-weight:bold;}")

        self._reset_button = ui.Button(
            text="Reset",
            tool_tip="Reset measurement sequence state.",
            clicked=reset_sequence_state)

        self._edit_button = ui.Button(
            text="Edit",
            tool_tip="Quick edit properties of sequence items.",
            clicked=edit_sequence)

        self._reload_config_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'reload.svg'),
            tool_tip="Reload sequence configurations from file.",
            clicked=self.on_reload_config_clicked)

        self._add_sample_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'add.svg'),
            tool_tip="Add new sample sequence.",
            clicked=self.on_add_sample_clicked)

        self._remove_sample_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'delete.svg'),
            tool_tip="Remove current sample sequence.",
            clicked=self.on_remove_sample_clicked)

        self._open_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'document_open.svg'),
            tool_tip="Open sequence tree from file.",
            clicked=self.on_open_clicked)

        self._save_button = ui.ToolButton(
            icon=make_path('assets', 'icons', 'document_save.svg'),
            tool_tip="Save sequence tree to file.",
            clicked=self.on_save_clicked)

        self.layout = ui.Column(
            self._sequence_tree,
            ui.Row(self._start_button, self._stop_button, self._reset_button,
                   self._edit_button, self._reload_config_button,
                   self._add_sample_button, self._remove_sample_button,
                   self._open_button, self._save_button))