146 lines
6.1 KiB
Python
146 lines
6.1 KiB
Python
"""Command-line parser for the ADC plotter."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import argparse
|
||
|
||
|
||
def build_parser() -> argparse.ArgumentParser:
|
||
parser = argparse.ArgumentParser(
|
||
description=(
|
||
"Читает свипы из виртуального COM-порта и рисует: "
|
||
"последний свип и водопад (реалтайм)."
|
||
)
|
||
)
|
||
parser.add_argument(
|
||
"port",
|
||
help="Путь к порту, например /dev/ttyACM1 или COM3 (COM10+: \\\\.\\COM10)",
|
||
)
|
||
parser.add_argument("--baud", type=int, default=115200, help="Скорость (по умолчанию 115200)")
|
||
parser.add_argument("--max-sweeps", type=int, default=200, help="Количество видимых свипов в водопаде")
|
||
parser.add_argument("--max-fps", type=float, default=30.0, help="Лимит частоты отрисовки, кадров/с")
|
||
parser.add_argument("--cmap", default="viridis", help="Цветовая карта водопада")
|
||
parser.add_argument(
|
||
"--spec-clip",
|
||
default="2,98",
|
||
help=(
|
||
"Процентильная обрезка уровней водопада спектров, %% (min,max). "
|
||
"Напр. 2,98. 'off' — отключить"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--spec-mean-sec",
|
||
type=float,
|
||
default=0.0,
|
||
help=(
|
||
"Вычитание среднего по каждой частоте за последние N секунд "
|
||
"в водопаде спектров (0 — отключить)"
|
||
),
|
||
)
|
||
parser.add_argument("--title", default="ADC Sweeps", help="Заголовок окна")
|
||
parser.add_argument(
|
||
"--fancy",
|
||
action="store_true",
|
||
help="Заполнять выпавшие точки средними значениями между соседними",
|
||
)
|
||
parser.add_argument(
|
||
"--ylim",
|
||
type=str,
|
||
default=None,
|
||
help="Фиксированные Y-пределы для кривой формата min,max (например -1000,1000). По умолчанию авто",
|
||
)
|
||
parser.add_argument(
|
||
"--backend",
|
||
choices=["auto", "pg", "mpl"],
|
||
default="pg",
|
||
help="Совместимый флаг. Поддерживаются только auto и pg; mpl удален.",
|
||
)
|
||
parser.add_argument(
|
||
"--opengl",
|
||
action="store_true",
|
||
help="Включить OpenGL-ускорение для PyQtGraph. По умолчанию используется CPU-отрисовка.",
|
||
)
|
||
parser.add_argument(
|
||
"--norm-type",
|
||
choices=["projector", "simple"],
|
||
default="projector",
|
||
help="Тип нормировки: projector (по огибающим в [-1,+1]) или simple (raw/calib)",
|
||
)
|
||
parser.add_argument(
|
||
"--bin",
|
||
dest="bin_mode",
|
||
action="store_true",
|
||
help=(
|
||
"8-байтный бинарный протокол: либо legacy старт "
|
||
"0xFFFF,0xFFFF,0xFFFF,(CH<<8)|0x0A и точки step,uint32(hi16,lo16),0x000A, "
|
||
"либо mixed поток 0x000A,step,ch1_i16,ch2_i16 и 0x001A,step,data_i16,0x0000. "
|
||
"Для 0x000A: после парсинга int16 переводятся в В, "
|
||
"сырая кривая = ch1^2+ch2^2 (В^2), FFT вход = ch1+i*ch2 (В). "
|
||
"Для 0x001A: code_i16 переводится в В, raw = V, FFT вход = exp(V)"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--tty-range-v",
|
||
type=float,
|
||
default=5.0,
|
||
help=(
|
||
"Полный диапазон для пересчета tty int16 в напряжение ±V "
|
||
"(для --bin 0x000A CH1/CH2 и 0x001A log-detector, по умолчанию 5.0)"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--logscale",
|
||
action="store_true",
|
||
help=(
|
||
"Новый бинарный протокол: точка несет пару int32 (avg_1, avg_2), "
|
||
"а свип считается как |10**(avg_1*0.001) - 10**(avg_2*0.001)|"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--parser_16_bit_x2",
|
||
action="store_true",
|
||
help=(
|
||
"Бинарный complex-протокол c парой int16 (Re, Im): "
|
||
"старт 0xFFFF,0xFFFF,0xFFFF,(CH<<8)|0x0A; точка step,re_lo16,im_lo16,0xFFFF"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--parser_test",
|
||
action="store_true",
|
||
help=(
|
||
"Тестовый парсер для complex-формата 16-bit x2: "
|
||
"одиночный 0xFFFF завершает точку, серия 0xFFFF начинает новый свип"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--parser_complex_ascii",
|
||
action="store_true",
|
||
help=(
|
||
"ASCII-поток из трех чисел на строку: step real imag. "
|
||
"Новый свип определяется по сбросу/повтору step, FFT строится по комплексным данным"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--calibrate",
|
||
action="store_true",
|
||
help=(
|
||
"Режим измерения ширины главного пика FFT: рисует красные маркеры "
|
||
"границ и фона и выводит ширину пика в статус"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--peak_search",
|
||
action="store_true",
|
||
help=(
|
||
"Поиск топ-3 пиков на FFT относительно референса (скользящая медиана) "
|
||
"с отрисовкой bounding box и параметров пиков"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--peak_ref_window",
|
||
type=float,
|
||
default=1.0,
|
||
help="Ширина окна скользящей медианы для --peak_search, ГГц/м по оси FFT (по умолчанию 1.0)",
|
||
)
|
||
return parser
|