implemented dynamic waterfall scaling
This commit is contained in:
@ -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()
|
||||||
|
|
||||||
# Настройки скорости
|
# Настройки скорости
|
||||||
|
|||||||
Reference in New Issue
Block a user