121 lines
4.8 KiB
Python
121 lines
4.8 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(
|
||
"--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=(
|
||
"Бинарный протокол: старт свипа 0xFFFF,0xFFFF,0xFFFF,(CH<<8)|0x0A; "
|
||
"точки step,uint32(hi16,lo16),0x000A"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--logscale",
|
||
action="store_true",
|
||
default=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=(
|
||
"Бинарный logscale-протокол c парой int16 (avg_1, avg_2): "
|
||
"старт 0xFFFF,0xFFFF,0xFFFF,(CH<<8)|0x0A; точка step,avg1_lo16,avg2_lo16,0xFFFF"
|
||
),
|
||
)
|
||
parser.add_argument(
|
||
"--parser_test",
|
||
action="store_true",
|
||
help=(
|
||
"Тестовый парсер для формата 16-bit x2: "
|
||
"одиночный 0xFFFF завершает точку, серия 0xFFFF начинает новый свип"
|
||
),
|
||
)
|
||
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
|