From 8d8b409807511c6fb2d11e02e2fafa42ae7e1dca Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 7 Sep 2026 17:41:23 +0300 Subject: [PATCH] sw: add load/save options, re-work adc/dac ratio setting --- software/gui.py | 74 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/software/gui.py b/software/gui.py index 1226f34..d7fe26e 100644 --- a/software/gui.py +++ b/software/gui.py @@ -2,6 +2,7 @@ import sys import math +import json import socket import platform @@ -14,6 +15,19 @@ from PyQt6.QtCore import Qt import pyqtgraph as pg from PyQt6.QtWidgets import QApplication, QMainWindow +SETTINGS_LIST = [ + "dac_dw", + "adc_dw", + "nmax", + "window_size", + "packet_size", + "adc_clk", + "dac_clk", + "accum_width", + "recv_port", + "send_port", +] + @dataclass class ReflectometerConfig: @@ -31,7 +45,9 @@ class ReflectometerConfig: pulse_height: int pulse_num: int - adc_dac_ratio: float = 0.52 + # adc_dac_ratio: float = 0.52 + adc_clk: float = 65 + dac_clk: float = 125 socket_timeout_sec: float = 2.0 @@ -108,7 +124,8 @@ class ReflectometerWorker(QObject): output += 0b10001000.to_bytes(1, "little") pulse_period_adc = ( - int(self.config.pulse_period * self.config.adc_dac_ratio) + int(self.config.pulse_period * + (self.config.adc_clk / self.config.dac_clk)) // self.config.window_size ) * self.config.window_size @@ -126,7 +143,7 @@ class ReflectometerWorker(QObject): def _recv_data(self) -> list[int]: packet_count = math.ceil( ( - self.config.adc_dac_ratio + (self.config.adc_clk / self.config.dac_clk) * self.config.pulse_period / self.config.window_size * self.config.data_width @@ -135,7 +152,7 @@ class ReflectometerWorker(QObject): ) expected_length = math.ceil( - self.config.adc_dac_ratio + (self.config.adc_clk / self.config.dac_clk) * self.config.pulse_period / self.config.window_size ) @@ -227,7 +244,6 @@ class MainWindow(QMainWindow): self.nmax = 4096 self.packet_size = 1024 self.window_size = 65 - self.adc_dac_ration = 0.52 self.accum_width = 32 # setup @@ -239,8 +255,6 @@ class MainWindow(QMainWindow): self.data = [] - self.adc_dac_ratio = 0.52 - self.measurement_thread = None self.measurement_worker = None @@ -250,8 +264,32 @@ class MainWindow(QMainWindow): self.button_start.clicked.connect(self.run_measurement) self.button_graph_autoscale.clicked.connect(self.reset_graph_autoscale) - # ping utils + self.button_save.clicked.connect(self.save_config) + self.button_load.clicked.connect(self.load_config) + # load/save + + def save_config(self): + + conf = {} + for setting in SETTINGS_LIST: + conf[setting] = self.__getattribute__(setting) + with open(".settings.json", "w") as f: + f.write(json.dumps(conf)) + self.label_save_status.setText("Настройки сохранены") + + def load_config(self): + try: + with open(".settings.json", 'r') as f: + conf = json.loads(f.read()) + except FileNotFoundError: + self.label_save_status.setText("Нет сохранненого .setting.json") + return + for setting in conf: + self.__getattribute__(f"box_{setting}").setValue(conf[setting]) + self.label_save_status.setText("Настройки загружены") + + # ping utils def check_ping(self): ip = self.line_ip.text().strip() @@ -280,14 +318,14 @@ class MainWindow(QMainWindow): if system_name == "windows": program = "ping" - arguments = ["-n", "1", "-w", "2000", ip] + arguments = ["-n", "1", "-w", "1000", ip] else: program = "ping" - arguments = ["-c", "1", "-W", "2", ip] + arguments = ["-c", "1", "-W", "1", ip] self.ping_process.start(program, arguments) # fallback - self.ping_timeout_timer.start(2000) + self.ping_timeout_timer.start(1000) def on_ping_finished(self, exit_code, exit_status): self.ping_timeout_timer.stop() @@ -456,8 +494,13 @@ class MainWindow(QMainWindow): ) self._bind_spinbox_setting( - name="adc_dac_ratio", - box=self.box_adc_dac_ratio, + name="adc_clk", + box=self.box_adc_clk, + ) + + self._bind_spinbox_setting( + name="dac_clk", + box=self.box_dac_clk, ) self._bind_spinbox_setting( @@ -642,7 +685,8 @@ class MainWindow(QMainWindow): pulse_height=self.pulse_height, pulse_num=self.pulse_num, - adc_dac_ratio=self.adc_dac_ratio, + adc_clk=self.adc_clk, + dac_clk=self.dac_clk ) def on_data_received(self, data: list[int]): @@ -711,7 +755,7 @@ class MainWindow(QMainWindow): reference = [0] * length actual_pulse_width = round( - (self.pulse_width * self.adc_dac_ratio) / self.window_size) + (self.pulse_width * self.adc_clk / self.dac_clk) / self.window_size) reference[0:actual_pulse_width] = [ (self.pulse_height / 2 ** (self.dac_dw - self.adc_dw)) - 2 ** (self.adc_dw - 1), ] * (actual_pulse_width - 1)