188 lines
9.3 KiB
Python
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
|