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: if self.config.pulse_num >= 2**16 - 1:
raise ValueError("pulse_num слишком большой") 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 слишком большой") raise ValueError("pulse_height слишком большой")
@ -500,28 +500,14 @@ class MainWindow(QMainWindow):
def update_pulse_limits(self): def update_pulse_limits(self):
# re-calc limits # 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 # nmax -> pulse_period limit
self.set_max_pulse_period(self.nmax * self.window_size) self.set_max_pulse_period(self.nmax * self.window_size)
self.set_max_pulse_width(self.nmax * self.window_size) self.set_max_pulse_width(self.nmax * self.window_size)
# accum_width + adc_width -> max pulse num # 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 # dac_width -> max pulse height
self.set_max_pulse_height(2 ** self.dac_dw - 1) self.set_max_pulse_height(2 ** self.dac_dw - 1)
@ -578,13 +564,13 @@ class MainWindow(QMainWindow):
self.reference_curve = self.graph_widget.plot( self.reference_curve = self.graph_widget.plot(
[], [],
name="Reference", name="Reference",
color="b"
) )
self.graph_layout.addWidget(self.graph_widget) 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( 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.checkbox_draw_reference.stateChanged.connect(
self.update_reference_graph) self.update_reference_graph)
@ -603,7 +589,7 @@ class MainWindow(QMainWindow):
def run_measurement(self): def run_measurement(self):
if self.measurement_thread is not None: if self.measurement_thread is not None:
if self.measurement_thread.isRunning(): if self.measurement_thread.isRunning():
self.set_measurement_status("Измерение уже выполняется") self.set_measurement_status("Измерение выполняется")
return return
config = self.build_reflectometer_config() config = self.build_reflectometer_config()
@ -660,21 +646,20 @@ class MainWindow(QMainWindow):
def on_data_received(self, data: list[int]): def on_data_received(self, data: list[int]):
self.data = data 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.draw_main_graph()
self.update_reference_graph() self.update_reference_graph()
if data: if data:
self.set_measurement_status( 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: else:
self.set_measurement_status("Готово, но данные пустые") 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)
def on_measurement_error(self, message: str): def on_measurement_error(self, message: str):
self.set_measurement_status(f"Ошибка: {message}") self.set_measurement_status(f"Ошибка: {message}")
@ -688,12 +673,7 @@ class MainWindow(QMainWindow):
self.measurement_worker.stop() self.measurement_worker.stop()
def set_measurement_status(self, text: str): def set_measurement_status(self, text: str):
print(text) self.label_status.setText(text)
# Если отдельного label под статус измерения пока нет,
# можно временно использовать label_ping_status.
if hasattr(self, "label_ping_status"):
self.label_ping_status.setText(text)
def draw_main_graph(self): def draw_main_graph(self):
if not self.data: if not self.data:
@ -729,8 +709,11 @@ class MainWindow(QMainWindow):
def build_reference_data(self, length: int) -> list[int]: def build_reference_data(self, length: int) -> list[int]:
reference = [0] * length reference = [0] * length
reference[0:(self.pulse_width // self.window_size + 1) actual_pulse_width = round(
] = [self.pulse_height, ] * (self.pulse_width // self.window_size) (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 return reference

View File

@ -23,7 +23,7 @@
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="tab"> <widget class="QWidget" name="tab">
<attribute name="title"> <attribute name="title">
@ -413,6 +413,9 @@
</item> </item>
<item> <item>
<widget class="QSlider" name="slider_pulse_num"> <widget class="QSlider" name="slider_pulse_num">
<property name="minimum">
<number>1</number>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
@ -427,6 +430,29 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6" stretch="1,3">
<item>
<widget class="QLabel" name="label_13">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Статус:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_status">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<widget class="QCheckBox" name="checkbox_draw_reference"> <widget class="QCheckBox" name="checkbox_draw_reference">
<property name="text"> <property name="text">