Files
radar_system/python_app/gui/controllers/sections/radar_section.py
T

188 lines
9.3 KiB
Python

"""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_rph_radar)
adc_radar_settings_panel.setVisible(config.is_rph_radar)
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.rph_radar
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_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,
[
("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_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