"""Builder for radar settings section.""" import json from PyQt6.QtWidgets import ( QCheckBox, QComboBox, QGroupBox, QLabel, QLineEdit, QPlainTextEdit, QVBoxLayout, QWidget, ) from python_app.gui.controllers.sections.layout_helpers import build_two_column_form_widget from python_app.gui.controllers.sections.views import RadarView, SectionView, write_setting from python_app.models.run_config_schema import RunConfigModel def build_radar_group(config: RunConfigModel) -> RadarView: """Create radar settings controls and labels.""" view = SectionView(QGroupBox("Radar")) group = view.group layout = QVBoxLayout(group) layout.setContentsMargins(10, 10, 10, 10) layout.setSpacing(8) defaults = config.radar vna_radar_settings_panel = QWidget(group) vna_layout = QVBoxLayout(vna_radar_settings_panel) vna_layout.setContentsMargins(0, 0, 0, 0) vna_layout.setSpacing(8) start_hz_input = view.add("_start_hz_input", QLineEdit(f"{defaults.sweep.start_hz:g}")) stop_hz_input = view.add("_stop_hz_input", QLineEdit(f"{defaults.sweep.stop_hz:g}")) points_input = view.add("_points_input", QLineEdit(str(defaults.sweep.points))) ifbw_input = view.add("_ifbw_input", QLineEdit(f"{defaults.sweep.if_bandwidth_hz:g}")) power_input = view.add("_power_input", QLineEdit(f"{defaults.sweep.power_dbm:g}")) power_input.setToolTip("Stimulus power configured in the active profile.") radar_labels = tuple(QLabel(text) for text in ( "Start (Hz)", "Stop (Hz)", "Points", "IF bandwidth (Hz)", "Stimulus power (dBm)", )) for label in radar_labels: label.setWordWrap(True) radar_limits_hint = QLabel("Device limits are not available.") radar_limits_hint.setObjectName("hintLabel") radar_limits_hint.setWordWrap(True) vna_layout.addWidget( build_two_column_form_widget( group, list(zip(radar_labels, (start_hz_input, stop_hz_input, points_input, ifbw_input, power_input))), ) ) vna_layout.addWidget(radar_limits_hint) (adc_radar_settings_panel, optical_enabled, optical_mode, optical_common, optical_manual, optical_variation, manual_panel, variation_panel) = _build_adc_settings_panel(view, config) layout.addWidget(vna_radar_settings_panel) layout.addWidget(adc_radar_settings_panel) vna_radar_settings_panel.setVisible(not config.is_kamil_adc) adc_radar_settings_panel.setVisible(config.is_kamil_adc) return RadarView(group=group, fields=view.fields, sweep_edits=(start_hz_input, stop_hz_input, points_input, ifbw_input, power_input), sweep_labels=radar_labels, limits_hint=radar_limits_hint, vna_panel=vna_radar_settings_panel, adc_panel=adc_radar_settings_panel, optical_enabled=optical_enabled, optical_mode=optical_mode, optical_common=optical_common, optical_manual=optical_manual, optical_variation=optical_variation, manual_panel=manual_panel, variation_panel=variation_panel) def _build_adc_settings_panel(view: SectionView, config: RunConfigModel): """Create controls for the external ADC collector and optical board.""" panel = QWidget(view.group) layout = QVBoxLayout(panel) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(8) adc = config.radar.kamil_adc optical = config.radar.laser_control manual = optical.manual variation = optical.variation adc_project_dir_input = view.add("_adc_project_dir_input", QLineEdit(adc.project_dir)) adc_executable_path_input = view.add("_adc_executable_path_input", QLineEdit(adc.executable_path)) adc_tty_path_input = view.add("_adc_tty_path_input", QLineEdit(adc.tty_path)) adc_args_input = view.add("_adc_args_input", _plain_text("\n".join(adc.args))) adc_env_input = view.add("_adc_env_input", _plain_text(json.dumps(adc.env, indent=2, sort_keys=True) if adc.env else "{}")) adc_startup_timeout_s_input = view.add("_adc_startup_timeout_s_input", QLineEdit(f"{adc.startup_timeout_s:g}")) adc_sweep_timeout_s_input = view.add("_adc_sweep_timeout_s_input", QLineEdit(f"{adc.sweep_timeout_s:g}")) adc_stop_timeout_s_input = view.add("_adc_stop_timeout_s_input", QLineEdit(f"{adc.stop_timeout_s:g}")) optical_enabled_checkbox = view.add("_optical_enabled_checkbox", QCheckBox()) optical_enabled_checkbox.setChecked(bool(optical.enabled)) optical_port_input = view.add("_optical_port_input", QLineEdit(optical.port)) optical_mode_combo = view.add("_optical_mode_combo", QComboBox()) optical_mode_combo.addItems(["manual", "variation"]) write_setting(optical_mode_combo, optical.mode) optical_pi_coeff1_p_input = view.add("_optical_pi_coeff1_p_input", QLineEdit(str(optical.pi_coeff1_p))) optical_pi_coeff1_i_input = view.add("_optical_pi_coeff1_i_input", QLineEdit(str(optical.pi_coeff1_i))) optical_pi_coeff2_p_input = view.add("_optical_pi_coeff2_p_input", QLineEdit(str(optical.pi_coeff2_p))) optical_pi_coeff2_i_input = view.add("_optical_pi_coeff2_i_input", QLineEdit(str(optical.pi_coeff2_i))) optical_manual_temp1_input = view.add("_optical_manual_temp1_input", QLineEdit(f"{manual.temp1:g}")) optical_manual_temp2_input = view.add("_optical_manual_temp2_input", QLineEdit(f"{manual.temp2:g}")) optical_manual_current1_input = view.add("_optical_manual_current1_input", QLineEdit(f"{manual.current1:g}")) optical_manual_current2_input = view.add("_optical_manual_current2_input", QLineEdit(f"{manual.current2:g}")) optical_variation_type_combo = view.add("_optical_variation_type_combo", QComboBox()) optical_variation_type_combo.addItems( [ "CHANGE_CURRENT_LD1", "CHANGE_CURRENT_LD2", "CHANGE_TEMPERATURE_LD1", "CHANGE_TEMPERATURE_LD2", ] ) write_setting(optical_variation_type_combo, variation.variation_type) optical_static_temp1_input = view.add("_optical_static_temp1_input", QLineEdit(f"{variation.static_temp1:g}")) optical_static_temp2_input = view.add("_optical_static_temp2_input", QLineEdit(f"{variation.static_temp2:g}")) optical_static_current1_input = view.add("_optical_static_current1_input", QLineEdit(f"{variation.static_current1:g}")) optical_static_current2_input = view.add("_optical_static_current2_input", QLineEdit(f"{variation.static_current2:g}")) optical_min_value_input = view.add("_optical_min_value_input", QLineEdit(f"{variation.min_value:g}")) optical_max_value_input = view.add("_optical_max_value_input", QLineEdit(f"{variation.max_value:g}")) optical_step_input = view.add("_optical_step_input", QLineEdit(f"{variation.step:g}")) optical_time_step_input = view.add("_optical_time_step_input", QLineEdit(str(variation.time_step))) optical_delay_time_input = view.add("_optical_delay_time_input", QLineEdit(str(variation.delay_time))) layout.addWidget( build_two_column_form_widget( panel, [ ("Project dir", adc_project_dir_input), ("Executable path", adc_executable_path_input), ("TTY path", adc_tty_path_input), ("Arguments", adc_args_input), ("Environment JSON", adc_env_input), ("Startup timeout (s)", adc_startup_timeout_s_input), ("Read timeout (s)", adc_sweep_timeout_s_input), ("Stop timeout (s)", adc_stop_timeout_s_input), ("Board enabled", optical_enabled_checkbox), ("Board port", optical_port_input), ("Board mode", optical_mode_combo), ("PI 1 P", optical_pi_coeff1_p_input), ("PI 1 I", optical_pi_coeff1_i_input), ("PI 2 P", optical_pi_coeff2_p_input), ("PI 2 I", optical_pi_coeff2_i_input), ], split_index=8, ) ) optical_manual_panel = build_two_column_form_widget( panel, [ ("Temperature 1", optical_manual_temp1_input), ("Temperature 2", optical_manual_temp2_input), ("Current 1", optical_manual_current1_input), ("Current 2", optical_manual_current2_input), ], ) optical_variation_panel = build_two_column_form_widget( panel, [ ("Variation type", optical_variation_type_combo), ("Static temp 1", optical_static_temp1_input), ("Static temp 2", optical_static_temp2_input), ("Static current 1", optical_static_current1_input), ("Static current 2", optical_static_current2_input), ("Min value", optical_min_value_input), ("Max value", optical_max_value_input), ("Step", optical_step_input), ("Time step", optical_time_step_input), ("Delay time", optical_delay_time_input), ], split_index=5, ) layout.addWidget(optical_manual_panel) layout.addWidget(optical_variation_panel) return (panel, optical_enabled_checkbox, optical_mode_combo, (optical_port_input, optical_mode_combo, optical_pi_coeff1_p_input, optical_pi_coeff1_i_input, optical_pi_coeff2_p_input, optical_pi_coeff2_i_input), (optical_manual_temp1_input, optical_manual_temp2_input, optical_manual_current1_input, optical_manual_current2_input), (optical_variation_type_combo, optical_static_temp1_input, optical_static_temp2_input, optical_static_current1_input, optical_static_current2_input, optical_min_value_input, optical_max_value_input, optical_step_input, optical_time_step_input, optical_delay_time_input), optical_manual_panel, optical_variation_panel) def _plain_text(text: str) -> QPlainTextEdit: widget = QPlainTextEdit(text) widget.setMaximumHeight(76) return widget