"""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, " "либо tty CH1/CH2 поток из kamil_adc в формате 0x000A,step,ch1_i16,ch2_i16" ), ) 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