RFG STM32 ADC Receiver GUI
PyQtGraph-приложение для чтения свипов из последовательного порта и отображения:
- текущего свипа
- водопада по свипам
- FFT текущего свипа
- B-scan по FFT
После рефакторинга проект разделен на пакет rfg_adc_plotter. Старый запуск через RFG_ADC_dataplotter.py сохранен как совместимый wrapper.
Структура
RFG_ADC_dataplotter.py— совместимый entrypointrfg_adc_plotter/cli.py— CLI-аргументыrfg_adc_plotter/io/— чтение порта и парсеры протоколовrfg_adc_plotter/processing/— FFT, нормировка, калибровка, поиск пиковrfg_adc_plotter/state/— runtime state и кольцевые буферыrfg_adc_plotter/gui/pyqtgraph_backend.py— GUI на PyQtGraphreplay_pty.py— воспроизведение захвата через виртуальный PTY
Зависимости
Минимально нужны:
python3 -m venv .venv
. .venv/bin/activate
pip install numpy pyqtgraph PyQt5
Если pyserial не установлен, приложение попробует открыть порт через raw TTY.
Быстрый старт
Запуск через старый entrypoint:
.venv/bin/python RFG_ADC_dataplotter.py /dev/ttyACM0
Запуск напрямую через пакет:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0
Показать справку:
.venv/bin/python RFG_ADC_dataplotter.py --help
Примеры запуска
Обычный запуск с живого порта:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --baud 115200
Больше истории в водопаде и ограничение FPS:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --max-sweeps 400 --max-fps 20
Фиксированный диапазон по оси Y:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --ylim -1000,1000
С включенной нормировкой simple:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --norm-type simple
Режим измерения ширины главного пика FFT:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --calibrate
Поиск топ-3 пиков относительно rolling median reference:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --peak_search --peak_ref_window 1.5
Вычитание среднего спектра по последним секундам:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --spec-mean-sec 3
Протоколы ввода
ASCII-протокол по умолчанию:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0
Legacy binary:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --bin
--bin также понимает tty-поток CH1/CH2 из kamil_adc (tty:/tmp/ttyADC_data) в 8-байтном формате 0x000A,step,ch1_i16,ch2_i16.
Logscale binary с парой int32:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --logscale
Complex binary 16-bit x2:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --parser_16_bit_x2
Тестовый парсер для экспериментального 16-bit x2 потока:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --parser_test
Комплексный ASCII-поток step real imag:
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --parser_complex_ascii
Локальная проверка через replay_pty
Если есть лог-файл захвата, его можно воспроизвести как виртуальный последовательный порт.
В первом терминале:
.venv/bin/python replay_pty.py my_picocom_logfile.txt --pty /tmp/ttyVIRT0 --speed 1.0
Во втором терминале:
.venv/bin/python -m rfg_adc_plotter.main /tmp/ttyVIRT0
Максимально быстрый replay:
.venv/bin/python replay_pty.py my_picocom_logfile.txt --pty /tmp/ttyVIRT0 --speed 0
Удаленный захват по SSH
В приложении SSH-источник не встроен. Для удаленной проверки нужно сначала получить поток или лог на локальную машину, а затем либо:
- запускать GUI напрямую на локальном PTY
- сохранять поток в файл и воспроизводить его через
replay_pty.py
Пример команды для ручной диагностики удаленного устройства:
ssh 192.148.0.148 'ls -l /dev/ttyACM0'
Если на удаленной машине есть доступ к потоку, удобнее сохранять его в файл и уже этот файл гонять локально через replay_pty.py.
Для локального tty-потока из kamil_adc используйте:
.venv/bin/python -m rfg_adc_plotter.main /tmp/ttyADC_data --bin
Проверка и тесты
Синтаксическая проверка:
python3 -m compileall RFG_ADC_dataplotter.py replay_pty.py rfg_adc_plotter tests
Запуск тестов:
.venv/bin/python -m unittest discover -s tests -v
Замечания
- Поддерживается только PyQtGraph backend.
--backend mplоставлен только для совместимости CLI и завершится ошибкой.- Каталоги
sample_data/и локальные логи добавлены в.gitignoreи не считаются частью обязательного tracked-состояния репозитория.