implemented dynamic waterfall scaling
This commit is contained in:
@ -237,13 +237,14 @@ class SerialChunkReader:
|
||||
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)
|
||||
self._port_path = port_path
|
||||
self._baud = baud
|
||||
self._q = out_queue
|
||||
self._stop = stop_event
|
||||
self._src: Optional[SerialLineSource] = None
|
||||
self._fancy = bool(fancy)
|
||||
|
||||
def _finalize_current(self, xs, ys):
|
||||
if not xs:
|
||||
@ -261,6 +262,20 @@ class SweepReader(threading.Thread):
|
||||
for x, y in zip(xs, ys):
|
||||
if 0 <= x < width:
|
||||
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:
|
||||
self._q.put_nowait(sweep)
|
||||
@ -366,6 +381,11 @@ def main():
|
||||
),
|
||||
)
|
||||
parser.add_argument("--title", default="ADC Sweeps", help="Заголовок окна")
|
||||
parser.add_argument(
|
||||
"--fancy",
|
||||
action="store_true",
|
||||
help="Заполнять выпавшие точки средними значениями между соседними",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--ylim",
|
||||
type=str,
|
||||
@ -402,7 +422,7 @@ def main():
|
||||
# Очередь завершённых свипов и поток чтения
|
||||
q: Queue[np.ndarray] = Queue(maxsize=1000)
|
||||
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()
|
||||
|
||||
# Графика
|
||||
@ -692,7 +712,7 @@ def run_pyqtgraph(args):
|
||||
# Очередь завершённых свипов и поток чтения
|
||||
q: Queue[np.ndarray] = Queue(maxsize=1000)
|
||||
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()
|
||||
|
||||
# Настройки скорости
|
||||
|
||||
Reference in New Issue
Block a user