Files
RFG_stm32_ADC_receiver_GUI/README.md
2026-04-15 19:09:11 +03:00

6.6 KiB
Raw Permalink Blame History

RFG STM32 ADC Receiver GUI

PyQtGraph-приложение для чтения свипов из последовательного порта и отображения:

  • текущего свипа
  • водопада по свипам
  • FFT текущего свипа
  • B-scan по FFT

После рефакторинга проект разделен на пакет rfg_adc_plotter. Старый запуск через RFG_ADC_dataplotter.py сохранен как совместимый wrapper.

Структура

  • RFG_ADC_dataplotter.py — совместимый entrypoint
  • rfg_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 на PyQtGraph
  • replay_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 понимает mixed 8-байтный поток:

  • 0x000A,step,ch1_i16,ch2_i16 для CH1/CH2 из kamil_adc (tty:/tmp/ttyADC_data)
  • 0x001A,step,data_i16,0x0000 для логарифмического детектора

Для 0x000A сырая кривая строится как ch1^2 + ch2^2, а FFT рассчитывается от комплексного сигнала ch1 + i*ch2. Для 0x001A signed data_i16 сначала переводится в В, затем raw отображается как V, а FFT рассчитывается от exp(V). Параметр --tty-range-v применяется к обоим типам --bin-данных.

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-состояния репозитория.