238 lines
10 KiB
Python
238 lines
10 KiB
Python
"""Builder for radar settings section."""
|
|
|
|
from __future__ import annotations
|
|
|
|
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
|
|
|
|
|
|
def build_radar_group(owner) -> QGroupBox:
|
|
"""Create radar settings controls and labels."""
|
|
group = QGroupBox("Radar")
|
|
layout = QVBoxLayout(group)
|
|
layout.setContentsMargins(10, 10, 10, 10)
|
|
layout.setSpacing(8)
|
|
defaults = owner._defaults_config.radar
|
|
|
|
owner._vna_radar_settings_panel = QWidget(group)
|
|
vna_layout = QVBoxLayout(owner._vna_radar_settings_panel)
|
|
vna_layout.setContentsMargins(0, 0, 0, 0)
|
|
vna_layout.setSpacing(8)
|
|
|
|
owner._start_hz_input = QLineEdit(f"{defaults.sweep.start_hz:g}")
|
|
owner._stop_hz_input = QLineEdit(f"{defaults.sweep.stop_hz:g}")
|
|
owner._points_input = QLineEdit(str(defaults.sweep.points))
|
|
owner._ifbw_input = QLineEdit(f"{defaults.sweep.if_bandwidth_hz:g}")
|
|
owner._power_input = QLineEdit(f"{defaults.sweep.power_dbm:g}")
|
|
owner._power_input.setToolTip("Stimulus power configured in the active profile.")
|
|
owner._start_hz_input.editingFinished.connect(owner._on_radar_sweep_limits_changed)
|
|
owner._stop_hz_input.editingFinished.connect(owner._on_radar_sweep_limits_changed)
|
|
owner._points_input.editingFinished.connect(owner._on_radar_sweep_limits_changed)
|
|
owner._ifbw_input.editingFinished.connect(owner._on_radar_sweep_limits_changed)
|
|
owner._power_input.editingFinished.connect(owner._on_radar_sweep_limits_changed)
|
|
|
|
owner._radar_start_label = QLabel("Start Hz")
|
|
owner._radar_stop_label = QLabel("Stop Hz")
|
|
owner._radar_points_label = QLabel("Points")
|
|
owner._radar_ifbw_label = QLabel("IF BW Hz")
|
|
owner._radar_power_label = QLabel("Stimulus Power dBm")
|
|
|
|
owner._radar_limits_hint = QLabel("Device limits are not available.")
|
|
owner._radar_limits_hint.setObjectName("hintLabel")
|
|
|
|
vna_layout.addWidget(
|
|
build_two_column_form_widget(
|
|
group,
|
|
[
|
|
(owner._radar_start_label, owner._start_hz_input),
|
|
(owner._radar_stop_label, owner._stop_hz_input),
|
|
(owner._radar_points_label, owner._points_input),
|
|
(owner._radar_ifbw_label, owner._ifbw_input),
|
|
(owner._radar_power_label, owner._power_input),
|
|
],
|
|
)
|
|
)
|
|
vna_layout.addWidget(owner._radar_limits_hint)
|
|
|
|
owner._adc_radar_settings_panel = _build_adc_settings_panel(owner, group)
|
|
|
|
layout.addWidget(owner._vna_radar_settings_panel)
|
|
layout.addWidget(owner._adc_radar_settings_panel)
|
|
owner._set_radar_settings_mode(owner._defaults_config.is_kamil_adc)
|
|
return group
|
|
|
|
|
|
def _build_adc_settings_panel(owner, parent: QWidget) -> QWidget:
|
|
"""Create controls for the external ADC collector and optical board."""
|
|
panel = QWidget(parent)
|
|
layout = QVBoxLayout(panel)
|
|
layout.setContentsMargins(0, 0, 0, 0)
|
|
layout.setSpacing(8)
|
|
|
|
adc = owner._defaults_config.radar.kamil_adc
|
|
optical = owner._defaults_config.radar.laser_control
|
|
manual = optical.manual
|
|
variation = optical.variation
|
|
|
|
owner._adc_project_dir_input = QLineEdit(adc.project_dir)
|
|
owner._adc_executable_path_input = QLineEdit(adc.executable_path)
|
|
owner._adc_tty_path_input = QLineEdit(adc.tty_path)
|
|
owner._adc_args_input = _plain_text("\n".join(adc.args))
|
|
owner._adc_env_input = _plain_text(json.dumps(adc.env, indent=2, sort_keys=True) if adc.env else "{}")
|
|
owner._adc_startup_timeout_s_input = QLineEdit(f"{adc.startup_timeout_s:g}")
|
|
owner._adc_sweep_timeout_s_input = QLineEdit(f"{adc.sweep_timeout_s:g}")
|
|
owner._adc_stop_timeout_s_input = QLineEdit(f"{adc.stop_timeout_s:g}")
|
|
|
|
owner._optical_enabled_checkbox = QCheckBox()
|
|
owner._optical_enabled_checkbox.setChecked(bool(optical.enabled))
|
|
owner._optical_port_input = QLineEdit(optical.port)
|
|
owner._optical_mode_combo = QComboBox()
|
|
owner._optical_mode_combo.addItems(["manual", "variation"])
|
|
owner._set_combo_current_text(owner._optical_mode_combo, optical.mode)
|
|
owner._optical_pi_coeff1_p_input = QLineEdit(str(optical.pi_coeff1_p))
|
|
owner._optical_pi_coeff1_i_input = QLineEdit(str(optical.pi_coeff1_i))
|
|
owner._optical_pi_coeff2_p_input = QLineEdit(str(optical.pi_coeff2_p))
|
|
owner._optical_pi_coeff2_i_input = QLineEdit(str(optical.pi_coeff2_i))
|
|
|
|
owner._optical_manual_temp1_input = QLineEdit(f"{manual.temp1:g}")
|
|
owner._optical_manual_temp2_input = QLineEdit(f"{manual.temp2:g}")
|
|
owner._optical_manual_current1_input = QLineEdit(f"{manual.current1:g}")
|
|
owner._optical_manual_current2_input = QLineEdit(f"{manual.current2:g}")
|
|
|
|
owner._optical_variation_type_combo = QComboBox()
|
|
owner._optical_variation_type_combo.addItems(
|
|
[
|
|
"CHANGE_CURRENT_LD1",
|
|
"CHANGE_CURRENT_LD2",
|
|
"CHANGE_TEMPERATURE_LD1",
|
|
"CHANGE_TEMPERATURE_LD2",
|
|
]
|
|
)
|
|
owner._set_combo_current_text(owner._optical_variation_type_combo, variation.variation_type)
|
|
owner._optical_static_temp1_input = QLineEdit(f"{variation.static_temp1:g}")
|
|
owner._optical_static_temp2_input = QLineEdit(f"{variation.static_temp2:g}")
|
|
owner._optical_static_current1_input = QLineEdit(f"{variation.static_current1:g}")
|
|
owner._optical_static_current2_input = QLineEdit(f"{variation.static_current2:g}")
|
|
owner._optical_min_value_input = QLineEdit(f"{variation.min_value:g}")
|
|
owner._optical_max_value_input = QLineEdit(f"{variation.max_value:g}")
|
|
owner._optical_step_input = QLineEdit(f"{variation.step:g}")
|
|
owner._optical_time_step_input = QLineEdit(str(variation.time_step))
|
|
owner._optical_delay_time_input = QLineEdit(str(variation.delay_time))
|
|
|
|
layout.addWidget(
|
|
build_two_column_form_widget(
|
|
panel,
|
|
[
|
|
("Project dir", owner._adc_project_dir_input),
|
|
("Executable path", owner._adc_executable_path_input),
|
|
("TTY path", owner._adc_tty_path_input),
|
|
("Arguments", owner._adc_args_input),
|
|
("Environment JSON", owner._adc_env_input),
|
|
("Startup timeout s", owner._adc_startup_timeout_s_input),
|
|
("Read timeout s", owner._adc_sweep_timeout_s_input),
|
|
("Stop timeout s", owner._adc_stop_timeout_s_input),
|
|
("Board enabled", owner._optical_enabled_checkbox),
|
|
("Board port", owner._optical_port_input),
|
|
("Board mode", owner._optical_mode_combo),
|
|
("PI 1 P", owner._optical_pi_coeff1_p_input),
|
|
("PI 1 I", owner._optical_pi_coeff1_i_input),
|
|
("PI 2 P", owner._optical_pi_coeff2_p_input),
|
|
("PI 2 I", owner._optical_pi_coeff2_i_input),
|
|
],
|
|
split_index=8,
|
|
)
|
|
)
|
|
|
|
owner._optical_manual_panel = build_two_column_form_widget(
|
|
panel,
|
|
[
|
|
("Temperature 1", owner._optical_manual_temp1_input),
|
|
("Temperature 2", owner._optical_manual_temp2_input),
|
|
("Current 1", owner._optical_manual_current1_input),
|
|
("Current 2", owner._optical_manual_current2_input),
|
|
],
|
|
)
|
|
owner._optical_variation_panel = build_two_column_form_widget(
|
|
panel,
|
|
[
|
|
("Variation type", owner._optical_variation_type_combo),
|
|
("Static temp 1", owner._optical_static_temp1_input),
|
|
("Static temp 2", owner._optical_static_temp2_input),
|
|
("Static current 1", owner._optical_static_current1_input),
|
|
("Static current 2", owner._optical_static_current2_input),
|
|
("Min value", owner._optical_min_value_input),
|
|
("Max value", owner._optical_max_value_input),
|
|
("Step", owner._optical_step_input),
|
|
("Time step", owner._optical_time_step_input),
|
|
("Delay time", owner._optical_delay_time_input),
|
|
],
|
|
split_index=5,
|
|
)
|
|
layout.addWidget(owner._optical_manual_panel)
|
|
layout.addWidget(owner._optical_variation_panel)
|
|
|
|
_connect_adc_settings(owner)
|
|
owner._sync_adc_settings_controls()
|
|
return panel
|
|
|
|
|
|
def _plain_text(text: str) -> QPlainTextEdit:
|
|
widget = QPlainTextEdit(text)
|
|
widget.setMaximumHeight(76)
|
|
return widget
|
|
|
|
|
|
def _connect_adc_settings(owner) -> None:
|
|
text_widgets = [
|
|
owner._adc_project_dir_input,
|
|
owner._adc_executable_path_input,
|
|
owner._adc_tty_path_input,
|
|
owner._adc_startup_timeout_s_input,
|
|
owner._adc_sweep_timeout_s_input,
|
|
owner._adc_stop_timeout_s_input,
|
|
owner._optical_port_input,
|
|
owner._optical_pi_coeff1_p_input,
|
|
owner._optical_pi_coeff1_i_input,
|
|
owner._optical_pi_coeff2_p_input,
|
|
owner._optical_pi_coeff2_i_input,
|
|
owner._optical_manual_temp1_input,
|
|
owner._optical_manual_temp2_input,
|
|
owner._optical_manual_current1_input,
|
|
owner._optical_manual_current2_input,
|
|
owner._optical_static_temp1_input,
|
|
owner._optical_static_temp2_input,
|
|
owner._optical_static_current1_input,
|
|
owner._optical_static_current2_input,
|
|
owner._optical_min_value_input,
|
|
owner._optical_max_value_input,
|
|
owner._optical_step_input,
|
|
owner._optical_time_step_input,
|
|
owner._optical_delay_time_input,
|
|
]
|
|
for widget in text_widgets:
|
|
widget.editingFinished.connect(owner._reset_preprocess_selection_after_radar_key_change)
|
|
owner._adc_args_input.textChanged.connect(owner._reset_preprocess_selection_after_radar_key_change)
|
|
owner._adc_env_input.textChanged.connect(owner._reset_preprocess_selection_after_radar_key_change)
|
|
owner._optical_variation_type_combo.currentTextChanged.connect(
|
|
owner._reset_preprocess_selection_after_radar_key_change
|
|
)
|
|
|
|
def sync_and_reset() -> None:
|
|
owner._sync_adc_settings_controls()
|
|
owner._reset_preprocess_selection_after_radar_key_change()
|
|
|
|
owner._optical_enabled_checkbox.toggled.connect(sync_and_reset)
|
|
owner._optical_mode_combo.currentTextChanged.connect(sync_and_reset)
|