186 lines
5.6 KiB
Markdown
186 lines
5.6 KiB
Markdown
# 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
|
||
|
||
## Зависимости
|
||
|
||
Минимально нужны:
|
||
|
||
```bash
|
||
python3 -m venv .venv
|
||
. .venv/bin/activate
|
||
pip install numpy pyqtgraph PyQt5
|
||
```
|
||
|
||
Если `pyserial` не установлен, приложение попробует открыть порт через raw TTY.
|
||
|
||
## Быстрый старт
|
||
|
||
Запуск через старый entrypoint:
|
||
|
||
```bash
|
||
.venv/bin/python RFG_ADC_dataplotter.py /dev/ttyACM0
|
||
```
|
||
|
||
Запуск напрямую через пакет:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0
|
||
```
|
||
|
||
Показать справку:
|
||
|
||
```bash
|
||
.venv/bin/python RFG_ADC_dataplotter.py --help
|
||
```
|
||
|
||
## Примеры запуска
|
||
|
||
Обычный запуск с живого порта:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --baud 115200
|
||
```
|
||
|
||
Больше истории в водопаде и ограничение FPS:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --max-sweeps 400 --max-fps 20
|
||
```
|
||
|
||
Фиксированный диапазон по оси Y:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --ylim -1000,1000
|
||
```
|
||
|
||
С включенной нормировкой `simple`:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --norm-type simple
|
||
```
|
||
|
||
Режим измерения ширины главного пика FFT:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --calibrate
|
||
```
|
||
|
||
Поиск топ-3 пиков относительно rolling median reference:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --peak_search --peak_ref_window 1.5
|
||
```
|
||
|
||
Вычитание среднего спектра по последним секундам:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --spec-mean-sec 3
|
||
```
|
||
|
||
## Протоколы ввода
|
||
|
||
ASCII-протокол по умолчанию:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0
|
||
```
|
||
|
||
Legacy binary:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --bin
|
||
```
|
||
|
||
Logscale binary с парой `int32`:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --logscale
|
||
```
|
||
|
||
Logscale binary `16-bit x2`:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --parser_16_bit_x2
|
||
```
|
||
|
||
Тестовый парсер для экспериментального `16-bit x2` потока:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /dev/ttyACM0 --parser_test
|
||
```
|
||
|
||
## Локальная проверка через replay_pty
|
||
|
||
Если есть лог-файл захвата, его можно воспроизвести как виртуальный последовательный порт.
|
||
|
||
В первом терминале:
|
||
|
||
```bash
|
||
.venv/bin/python replay_pty.py my_picocom_logfile.txt --pty /tmp/ttyVIRT0 --speed 1.0
|
||
```
|
||
|
||
Во втором терминале:
|
||
|
||
```bash
|
||
.venv/bin/python -m rfg_adc_plotter.main /tmp/ttyVIRT0
|
||
```
|
||
|
||
Максимально быстрый replay:
|
||
|
||
```bash
|
||
.venv/bin/python replay_pty.py my_picocom_logfile.txt --pty /tmp/ttyVIRT0 --speed 0
|
||
```
|
||
|
||
## Удаленный захват по SSH
|
||
|
||
В приложении SSH-источник не встроен. Для удаленной проверки нужно сначала получить поток или лог на локальную машину, а затем либо:
|
||
|
||
- запускать GUI напрямую на локальном PTY
|
||
- сохранять поток в файл и воспроизводить его через `replay_pty.py`
|
||
|
||
Пример команды для ручной диагностики удаленного устройства:
|
||
|
||
```bash
|
||
ssh 192.148.0.148 'ls -l /dev/ttyACM0'
|
||
```
|
||
|
||
Если на удаленной машине есть доступ к потоку, удобнее сохранять его в файл и уже этот файл гонять локально через `replay_pty.py`.
|
||
|
||
## Проверка и тесты
|
||
|
||
Синтаксическая проверка:
|
||
|
||
```bash
|
||
python3 -m compileall RFG_ADC_dataplotter.py replay_pty.py rfg_adc_plotter tests
|
||
```
|
||
|
||
Запуск тестов:
|
||
|
||
```bash
|
||
.venv/bin/python -m unittest discover -s tests -v
|
||
```
|
||
|
||
## Замечания
|
||
|
||
- Поддерживается только PyQtGraph backend.
|
||
- `--backend mpl` оставлен только для совместимости CLI и завершится ошибкой.
|
||
- Каталоги `sample_data/` и локальные логи добавлены в `.gitignore` и не считаются частью обязательного tracked-состояния репозитория.
|