implemented dynamic waterfall scaling

This commit is contained in:
2025-12-21 14:28:19 +03:00
parent 476c601b95
commit e9c506173d

View File

@ -237,13 +237,14 @@ class SerialChunkReader:
class SweepReader(threading.Thread): class SweepReader(threading.Thread):
"""Фоновый поток: читает строки, формирует завершённые свипы и кладёт в очередь.""" """Фоновый поток: читает строки, формирует завершённые свипы и кладёт в очередь."""
def __init__(self, port_path: str, baud: int, out_queue: Queue, stop_event: threading.Event): def __init__(self, port_path: str, baud: int, out_queue: Queue, stop_event: threading.Event, fancy: bool = False):
super().__init__(daemon=True) super().__init__(daemon=True)
self._port_path = port_path self._port_path = port_path
self._baud = baud self._baud = baud
self._q = out_queue self._q = out_queue
self._stop = stop_event self._stop = stop_event
self._src: Optional[SerialLineSource] = None self._src: Optional[SerialLineSource] = None
self._fancy = bool(fancy)
def _finalize_current(self, xs, ys): def _finalize_current(self, xs, ys):
if not xs: if not xs:
@ -261,6 +262,20 @@ class SweepReader(threading.Thread):
for x, y in zip(xs, ys): for x, y in zip(xs, ys):
if 0 <= x < width: if 0 <= x < width:
sweep[x] = float(y) sweep[x] = float(y)
# Дополнительная обработка пропусков: при --fancy заполняем внутренние разрывы
if self._fancy:
try:
known = ~np.isnan(sweep)
if np.any(known):
known_idx = np.nonzero(known)[0]
# Для каждой пары соседних известных индексов заполним промежуток средним значением
for i0, i1 in zip(known_idx[:-1], known_idx[1:]):
if i1 - i0 > 1:
avg = (sweep[i0] + sweep[i1]) * 0.5
sweep[i0 + 1 : i1] = avg
except Exception:
# В случае ошибки просто оставляем как есть
pass
# Кладём готовый свип (если очередь полна — выбрасываем самый старый) # Кладём готовый свип (если очередь полна — выбрасываем самый старый)
try: try:
self._q.put_nowait(sweep) self._q.put_nowait(sweep)
@ -366,6 +381,11 @@ def main():
), ),
) )
parser.add_argument("--title", default="ADC Sweeps", help="Заголовок окна") parser.add_argument("--title", default="ADC Sweeps", help="Заголовок окна")
parser.add_argument(
"--fancy",
action="store_true",
help="Заполнять выпавшие точки средними значениями между соседними",
)
parser.add_argument( parser.add_argument(
"--ylim", "--ylim",
type=str, type=str,
@ -402,7 +422,7 @@ def main():
# Очередь завершённых свипов и поток чтения # Очередь завершённых свипов и поток чтения
q: Queue[np.ndarray] = Queue(maxsize=1000) q: Queue[np.ndarray] = Queue(maxsize=1000)
stop_event = threading.Event() stop_event = threading.Event()
reader = SweepReader(args.port, args.baud, q, stop_event) reader = SweepReader(args.port, args.baud, q, stop_event, fancy=bool(args.fancy))
reader.start() reader.start()
# Графика # Графика
@ -692,7 +712,7 @@ def run_pyqtgraph(args):
# Очередь завершённых свипов и поток чтения # Очередь завершённых свипов и поток чтения
q: Queue[np.ndarray] = Queue(maxsize=1000) q: Queue[np.ndarray] = Queue(maxsize=1000)
stop_event = threading.Event() stop_event = threading.Event()
reader = SweepReader(args.port, args.baud, q, stop_event) reader = SweepReader(args.port, args.baud, q, stop_event, fancy=bool(args.fancy))
reader.start() reader.start()
# Настройки скорости # Настройки скорости