sw: fix reference and some options

This commit is contained in:
Phil
2026-05-26 17:27:39 +03:00
parent 9b5e39f3df
commit 4ecb3f5ea5
2 changed files with 46 additions and 37 deletions

View File

@ -198,7 +198,7 @@ class ReflectometerWorker(QObject):
if self.config.pulse_num >= 2**16 - 1:
raise ValueError("pulse_num слишком большой")
if self.config.pulse_height >= 2**self.config.dac_bits - 1:
if self.config.pulse_height > 2**self.config.dac_bits - 1:
raise ValueError("pulse_height слишком большой")
@ -500,28 +500,14 @@ class MainWindow(QMainWindow):
def update_pulse_limits(self):
# re-calc limits
"""
Сюда потом можно дописать формулы для пересчета максимумов.
Например:
max_pulse_height = 2 ** self.dac_dw - 1
self.set_max_pulse_height(max_pulse_height)
max_pulse_period = self.nmax * self.window_size
self.set_max_pulse_period(max_pulse_period)
max_pulse_width = ...
self.set_max_pulse_width(max_pulse_width)
max_pulse_num = ...
self.set_max_pulse_num(max_pulse_num)
"""
# nmax -> pulse_period limit
self.set_max_pulse_period(self.nmax * self.window_size)
self.set_max_pulse_width(self.nmax * self.window_size)
# accum_width + adc_width -> max pulse num
self.set_max_pulse_num(2 ** (self.accum_width - self.adc_dw) - 1)
self.set_max_pulse_num(
2 ** (self.accum_width - self.adc_dw - math.ceil(math.log2(self.window_size))) - 1)
# dac_width -> max pulse height
self.set_max_pulse_height(2 ** self.dac_dw - 1)
@ -578,13 +564,13 @@ class MainWindow(QMainWindow):
self.reference_curve = self.graph_widget.plot(
[],
name="Reference",
color="b"
)
self.graph_layout.addWidget(self.graph_widget)
self.graph_curve = self.graph_widget.plot([], pen=pg.mkPen(width=2))
self.graph_curve = self.graph_widget.plot(
[], pen=pg.mkPen(width=2, color="b"))
self.reference_curve = self.graph_widget.plot(
[], pen=pg.mkPen(style=Qt.PenStyle.DashLine))
[], pen=pg.mkPen(style=Qt.PenStyle.DashLine, color="g"))
self.checkbox_draw_reference.stateChanged.connect(
self.update_reference_graph)
@ -603,7 +589,7 @@ class MainWindow(QMainWindow):
def run_measurement(self):
if self.measurement_thread is not None:
if self.measurement_thread.isRunning():
self.set_measurement_status("Измерение уже выполняется")
self.set_measurement_status("Измерение выполняется")
return
config = self.build_reflectometer_config()
@ -660,21 +646,20 @@ class MainWindow(QMainWindow):
def on_data_received(self, data: list[int]):
self.data = data
# normalize
for i in range(len(data)):
self.data[i] /= (self.window_size * self.pulse_num)
self.data[i] -= 2 ** (self.adc_dw - 1) + 1
self.draw_main_graph()
self.update_reference_graph()
if data:
self.set_measurement_status(
f"Готово. Samples: {len(data)}, min: {min(data)}, max: {max(data)}"
f"Готово. smp: {len(data)}, min: {min(data)}, max: {max(data)}"
)
else:
self.set_measurement_status("Готово, но данные пустые")
# normalize
for i in range(len(data)):
self.data[i] -= 2 ** (self.adc_dw - 1)
self.data[i] /= (self.window_size * self.pulse_num)
self.set_measurement_status("Данные пустые")
def on_measurement_error(self, message: str):
self.set_measurement_status(f"Ошибка: {message}")
@ -688,12 +673,7 @@ class MainWindow(QMainWindow):
self.measurement_worker.stop()
def set_measurement_status(self, text: str):
print(text)
# Если отдельного label под статус измерения пока нет,
# можно временно использовать label_ping_status.
if hasattr(self, "label_ping_status"):
self.label_ping_status.setText(text)
self.label_status.setText(text)
def draw_main_graph(self):
if not self.data:
@ -729,8 +709,11 @@ class MainWindow(QMainWindow):
def build_reference_data(self, length: int) -> list[int]:
reference = [0] * length
reference[0:(self.pulse_width // self.window_size + 1)
] = [self.pulse_height, ] * (self.pulse_width // self.window_size)
actual_pulse_width = round(
(self.pulse_width * self.adc_dac_ratio) / self.window_size)
reference[0:actual_pulse_width] = [
self.pulse_height - 2 ** (self.adc_dw - 1) + 1, ] * (actual_pulse_width - 1)
return reference