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)
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
def _setup_actions(self): self.app.window.github_action = ui.Action( text="&GitHub", triggered=self.dashboard.on_github)
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)
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))