# ADS-B Proximity Viewer

Портативный прототип интерфейса и алгоритма предупреждения о сближении с воздушными судами.

## Что уже есть

- Симуляция нескольких ADS-B целей.
- Расчет точки максимального сближения: TCPA/CPA.
- Два режима тревог:
  - `sphere`: вход в 3D-сферу радиусом 1 км за 3 минуты для `ALARM`, 3 км за 5 минут для `WATCH`.
  - `separation`: одновременное сближение по горизонтали и вертикали с отдельными порогами для `ALARM` и `WATCH`.
- Планировщик пересчета до 10 целей: 10 секунд для дальних/низкорисковых, 5 секунд ближе 100 км, 3 секунды ближе 20 км, 1 секунда для близких или угрожающих.
- Прогноз собственного движения: усредненная вертикальная скорость, снос в спирали, прямолинейный и моментный режимы.
- Экран из двух блоков:
  - слева графический модуль с собственной точкой, сферами 1/3 км, севером, курсом и несколькими самолетами;
  - справа числовой модуль с TCPA, вертикальным и горизонтальным расхождением.

Откройте `index.html` в браузере: это главная страница проекта со ссылками на рабочие интерфейсы, демо и документацию.

Старая proximity-демка сохранена как `proximity-viewer.html`.

Для компактного монохромного Memory LCD откройте `prototypes.html`: там три варианта интерфейса под 400 x 240 px, 2.7".

Для проверки поворота экрана по собственному курсу и пересчета CPA откройте `heading-demo.html`.

Для проверки математической логики, режимов тревоги, прогноза собственного движения и планировщика пересчета откройте `math-demo.html`. Там же есть режим `Live Airplanes.live`: укажите свою широту/долготу/высоту и радиус, затем нажмите `Обновить эфир`.

## Предлагаемая архитектура устройства

### Железо

- Вычислительный модуль: Raspberry Pi CM4/CM5, Pi Zero 2 W или ESP32-S3 + внешний ADS-B модуль.
- ADS-B прием: 1090 MHz SDR с LNA/SAW фильтром или готовый приемник на базе RTL-SDR.
- GNSS: u-blox M10/M9 с PPS, желательно с поддержкой высоты и курса по движению.
- Барометр: BMP390/MS5611 для сглаживания собственной высоты.
- IMU/компас: для ориентации экрана, когда GNSS-курс нестабилен на малой скорости.
- Экран: 3.5-5" IPS, 480x480 или 800x480, высокая яркость.
- Сигнал тревоги: пьезоизлучатель + вибромотор + яркий LED.
- Питание: Li-ion/LiPo, BMS, USB-C PD, аппаратная кнопка mute.

### Поток данных

1. ADS-B приемник декодирует `icao`, позицию, высоту, ground speed, vertical rate, track.
2. GNSS/барометр дают собственную позицию, высоту, скорость и курс.
3. Все координаты переводятся в локальную ENU-систему относительно текущей позиции устройства.
4. По истории собственной позиции оцениваются вертикальная скорость, снос и режим движения.
5. Для каждой цели считается относительный вектор положения `r` и скорости `v`.
6. `tcpa = clamp(-dot(r, v) / dot(v, v), 0, 300)`.
7. `cpa = r + v * tcpa`.
8. Срабатывание выбирается режимом:
   - `sphere`: `distance3d(t) <= radius && t <= lookahead`.
   - `separation`: `horizontal(t) <= horizontalLimit && abs(vertical(t)) <= verticalLimit && t <= lookahead`.

Подробная логика будущей прошивки описана в `docs/algorithm.md`.
Требования к экрану собраны в `docs/display-interface-requirements.md`, проверяемая карта экранов и навигации - в `docs/screen-navigation-spec.md`, графические прототипы зон и выравнивания - в `docs/screen-wireframes.html`.

## Важное ограничение

Такой прибор должен рассматриваться как дополнительное средство ситуационной осведомленности, а не как сертифицированная система предотвращения столкновений. Для реального применения нужны тесты с записанными ADS-B логами, fail-safe состояния, фильтрация устаревших данных и проверка законодательства по радиоприему/использованию в вашей стране.
