# Horizon: руководство пользователя

Версия документа: 0.5, 19 сентября 2026 года.

Рабочая версия: Horizon 0.2.3 Beta. Украинский — основной язык; русский, английский,
немецкий и французский выбираются в настройках. Названия английских инструментов
ниже сохранены для сопоставления с прежними сборками.

Документ описывает функции текущей сборки Horizon. Раздел «Распределённая РЭР»
помечен «В разработке»: окно и входы в него скрыты до приёмки.

## Содержание

1. [Назначение и ограничения](#1-назначение-и-ограничения)
2. [Быстрый запуск](#2-быстрый-запуск)
3. [Верхняя панель](#3-верхняя-панель)
4. [Spectrum](#4-spectrum)
5. [Waterfall](#5-waterfall)
6. [Signal analyzer](#6-signal-analyzer)
7. [Подтверждённые события](#7-подтверждённые-события)
8. [Профили детекторов и поиск FPV](#8-профили-детекторов-и-поиск-fpv)
9. [Analog video](#9-analog-video)
10. [Event log](#10-event-log)
11. [3D panorama](#11-3d-panorama)
12. [Карта; GPS, устройства и пеленгация — в разработке](#12-карта-gps-устройства-и-пеленгация--в-разработке)
13. [Automation](#13-automation)
14. [Level alarm](#14-level-alarm)
15. [Channel planner](#15-channel-planner)
16. [Запись и воспроизведение IQ](#16-запись-и-воспроизведение-iq)
17. [Performance, Sweep и Monitors](#17-performance-sweep-и-monitors)
18. [Меню и рабочий профиль](#18-меню-и-рабочий-профиль)
19. [Встроенный симулятор](#19-встроенный-симулятор)
20. [Распределённая РЭР](#20-распределённая-рэр--в-разработке)
21. [Файлы и каталоги](#21-файлы-и-каталоги)
22. [Термины](#22-термины)
23. [Устранение проблем](#23-устранение-проблем)

## 1. Назначение и ограничения

Horizon предназначен для работы с SDR-приёмниками, просмотра спектра и waterfall,
записи IQ, анализа FHSS/LoRa-подобных сигналов, поиска аналогового FPV, ведения
журнала событий и ручной работы с картой. Поддержка GPS, внешних устройств и
пеленгации находится в разработке и скрыта в текущей Beta.

Результат автоматической классификации является оценкой, а не гарантированной
идентификацией передатчика. Для ответственных решений подтверждайте событие по
IQ-записи, waterfall, измерениям других постов и известным эталонным сигналам.

По умолчанию Horizon работает только на приём. Одноразовая передача IQ реализована
как закрытая Beta-функция и требует отдельного права `sdr.tx` сверх обычного
`iq.replay`. Pro и Maximum включают entitlement `sdr.tx`, но физическая передача
дополнительно зависит от TX-возможностей драйвера, build safety gate и явного
подтверждения оператора. Не подключайте передающий тракт без подходящей антенны
или эквивалента нагрузки.

## 2. Быстрый запуск

Бесплатная тестовая portable Beta работает без оплаты и серверной активации:
распакуйте архив, запустите `Horizon.exe` и выберите **«Бесплатная Beta»** на экране
входа (в старых сборках — `Use demo account`). Запись/воспроизведение IQ, анализ
и видео доступны в этом локальном режиме. Публичная Beta не включает IQ TX;
передача включена отдельно только в личной рабочей сборке разработчика.

Тестовый архив явно помечен как неподписанный. Его SHA-256 можно сверить с
прилагаемым `SHA256SUMS.txt`; это проверка целостности, а не подпись издателя.
Он распространяется отдельно от подписанных Stable/Beta-обновлений. Проверки
подписи в updater не отключаются ради бесплатного режима.


1. Подключите SDR до запуска Horizon.
2. Запустите `Horizon.exe`.
3. Войдите в аккаунт. Для текущей тестовой сборки можно нажать `Use demo account`
   и затем `Sign in`.
4. Выберите SDR. Для проверки без оборудования используйте
   `RF scenario simulator [SIM-RF-0001]`.
5. Укажите `Start` и `End` в МГц.
6. Установите `RATE` с учётом возможностей устройства.
7. Выберите `WATERFALL FFT`; для первого запуска подойдёт 4096 или 8192.
8. Нажмите `Start RX`.
9. Откройте необходимые инструменты через `Tools`.
10. Для экономии ресурсов отключите ненужные `Spectrum`, `Waterfall` и плавающие
    инструменты.

Главное окно не создаётся до успешного входа. Сейчас аккаунты являются локальной
заглушкой: demo использует `demo@horizon.local` / `horizon-demo`, а созданные
пользователем аккаунты хранятся только на этом ПК. В настройках сохраняются salt и
PBKDF2-хеш, но не пароль. Локальный аккаунт не является купленной лицензией.

Desktop-контур онлайн-входа уже формирует OAuth Authorization Code + PKCE S256 по
правилам native app, открывает системный браузер, поднимает временный listener только
на `127.0.0.1` и обменивает проверенный code на короткую access-сессию. Затем Horizon
строго проверяет профиль `/v1/me`, получает одноразовый activation challenge,
доказывает владение installation key и принимает только подписанный Ed25519 lease,
совпадающий с аккаунтом, организацией, тарифом и этой установкой. Rotating refresh
token сохраняется в Windows DPAPI только после успешной активации; plaintext в
`QSettings` не записывается.

Кнопка `Sign in with Horizon account` появляется только в production-сборке со
встроенной доверенной конфигурацией. Для неё при конфигурации CMake задаются
`HORIZON_ACCOUNT_API_URL`, `HORIZON_OIDC_AUTHORIZATION_URL`,
`HORIZON_OIDC_TOKEN_URL`, `HORIZON_OIDC_CLIENT_ID`, а также ID, public key и период
действия ключа подписи lease через `HORIZON_LICENSE_SIGNING_KEY_ID`,
`HORIZON_LICENSE_SIGNING_PUBLIC_KEY`, `HORIZON_LICENSE_SIGNING_VALID_FROM` и
`HORIZON_LICENSE_SIGNING_VALID_UNTIL`. Все production URL должны использовать HTTPS.
На Account API тот же период задаётся через
`HORIZON_ACTIVATION_SIGNING_VALID_FROM` и
`HORIZON_ACTIVATION_SIGNING_VALID_UNTIL`. Отсутствующий, неканонический, будущий
или истёкший период закрыто блокирует выдачу lease с no-store `503`, чтобы сервер
не создал лицензию, которую desktop обязан отвергнуть.
Текущая локальная сборка не содержит production endpoints и поэтому продолжает
показывать только локальный вход.

Account API проверяет desktop access token по закреплённому JWKS, точным issuer,
audience и scope. Вход разрешается только после явной связи пары OIDC provider +
subject с существующим аккаунтом Horizon. Совпадение email никогда не связывает
аккаунты автоматически. При первом online-входе Horizon может показать код вида
`XXXX-XXXX-XXXX` и открыть страницу `/account/link` в системном браузере.
Войдите в нужный кабинет, убедитесь, что код совпадает, и нажмите
`Подтвердить desktop-вход`. Приложение само дождётся подтверждения и продолжит
активацию; повторно нажимать вход не нужно. Код действует десять минут. Если он
истёк, отмените вход и запустите его заново. Ошибка 503 означает, что production
desktop authentication на сервере не настроена или закрыто отключена.

Для автоматического стенда доступен `Horizon.exe --headless`. Он не показывает
login и главное окно, не забирает фокус и запускается только с действующим ранее
сохранённым подписанным lease. Без такого кэша процесс сразу завершается с кодом `2`;
локальный demo не используется как обход лицензии. В этом режиме Horizon блокирует
вывод любого верхнеуровневого окна Qt, включая сообщения, которые могут создать
фоновые компоненты после запуска: приложение не появляется поверх других окон.

### Аккаунт и лицензия

Откройте `Аккаунт -> Лицензия и установки...`, чтобы увидеть текущий аккаунт,
режим доступа, список разрешённых функций и идентификатор этой установки Horizon.
Кнопка `Copy ID` копирует installation ID для поддержки или будущей привязки в
личном кабинете. Идентификатор создаётся один раз и сохраняется после перезапуска
программы; он не является серийным номером SDR.

В веб-кабинете раздел `Подписка` показывает серверный тариф, состояние, текущий
период и историю счетов. В разделе `Установки` можно переименовать свой компьютер
и деактивировать его, чтобы освободить лицензионный слот. Переименование не меняет
installation ID; деактивированная установка должна пройти активацию заново.
Тариф и entitlements кабинет только отображает и не может выдать самостоятельно.
В закрытой Beta отсутствие платёжной подписки является нормальным состоянием.
В блоке `Подписка и платежи` выберите Pro или Maximum и период, затем нажмите
`Запросить доступ`. Кабинет хранит одну ожидающую заявку: выбор можно изменить
без создания дубля или отменить. Заявка фиксируется в аудите, но сама не включает
платные функции. Операторское одобрение подписывается отдельно; его статус и причина
появятся в истории заявок. Даже статус `Одобрена` не активирует тариф сам по себе:
права появляются только после отдельного защищённого billing-события или выдачи.

Maximum включает несколько SDR и карту. Локальная РЭР — В разработке и скрыта. Облачная синхронизация
постов и объединение наблюдений относятся к отдельному RER Pilot (В разработке): права
`rer.cloud_sync` и `rer.fusion` не выдаются обычной подпиской Maximum.

При успешном входе кабинет также сверяет базовые Free-права с текущим тарифным
контрактом. Это не удаляет Beta, Pro, Maximum или административные права: сервер
обновляет только записи, которые были выданы именно редакцией Free.

В блоке `Возможности лицензии` рядом с каждым правом показано его происхождение:
`Free`, `Closed Beta`, `Подписка`, `Выдано оператором` или `Совместимость`. Несколько
меток означают, что функция разрешена несколькими независимыми источниками. Кабинет
и `/v1/entitlements` не раскрывают provider, subscription ID, grant ID и внутренние
строки `source`; эти значения нужны только серверу.

В разделе `Безопасность и аудит` кабинет показывает связанные способы входа без
OIDC subject, email desktop-провайдера и токенов. Основной браузерный вход Horizon
защищён от удаления. Внешний `Horizon Desktop` можно отозвать: следующие Account API
запросы этого desktop-входа сразу получат `identity_not_linked`, а повторная связь
потребует нового одноразового кода и подтверждения в браузере. Уже подписанный
offline lease продолжает действовать до своего срока, поэтому при потере компьютера
дополнительно деактивируйте соответствующую установку.

Одноразовый код привязки действует 10 минут; сервер сохраняет только его
domain-separated SHA-256-хеш. Завершённые, заменённые и просроченные служебные записи
удаляются после семи дней при следующей инициализации Worker или выдаче нового кода.
Это не удаляет постоянный связанный вход и append-only событие аудита: у них отдельный
жизненный цикл до отзыва входа или закрытия аккаунта.

Сайт запрещает встраивать кабинет и `/account/link` в сторонние iframe. Общая CSP,
`X-Frame-Options: DENY` и `Referrer-Policy: no-referrer` уменьшают риск подмены
кнопки подтверждения и утечки одноразового desktop-кода через referrer. Настраивать
это пользователю не требуется: заголовки добавляются сервером ко всем ответам.

Кнопка `Полный журнал` открывает всю серверную историю текущей организации, а не
только последние события из карточки кабинета. На странице выводится по 50 записей;
`Следующая страница` загружает более старую часть, `В начало` возвращает к свежим
событиям, а обычная кнопка браузера `Назад` — к предыдущей порции. Курсор не содержит
прав доступа и не позволяет перейти в журнал другой организации. Account API
предоставляет тот же журнал через `GET /v1/audit-events` с `limit` от 1 до 100 и
непрозрачным `cursor`; ответы всегда имеют `Cache-Control: no-store`.

Все защищённые ответы Account API, включая ошибки, содержат UUID `X-Request-ID`
и не кешируются. При обращении в поддержку приложите request ID из ответа или
диагностики Horizon. Публичный подписанный Stable manifest кешируется отдельно и
не содержит данных аккаунта.

`Скачать CSV` сохраняет UTC-время, тип, описание, ID объекта и ID события для
текущей организации. UTF-8 BOM и формат RFC 4180 подходят для Excel и обычных
CSV-инструментов; значения, похожие на формулы, нейтрализуются апострофом. Email,
OIDC subject, токены и ID организации в файл не попадают. Экспорт ограничен 10 000
новейшими строками. Если старые строки были опущены, имя содержит
`-latest-10000`, а HTTP-заголовок `X-Horizon-Export-Truncated` равен `true`.

Команды кабинета зависят от роли участника организации. `owner` и `admin` могут
управлять установками, заявками на тариф, полным JSON-экспортом и системной
диагностикой. `operator` может переименовывать и деактивировать установки, но не
видит команды тарифной заявки, полного экспорта и диагностики. `viewer` работает
только на чтение. Недоступные команды скрываются в интерфейсе и дополнительно
запрещаются Account API, поэтому прямой запрос не расширяет права.

Кнопка `Экспорт данных` скачивает JSON-снимок текущего аккаунта: профиль,
организацию, права, заявки, безопасные сведения о подписках и счетах, установки,
связанные способы входа и аудит. OIDC subject, токены, ключевой материал установок
и внешние платёжные идентификаторы намеренно исключены. Если коллекция превышает
защитный лимит, её имя перечисляется в `truncatedCollections`; ответ всегда имеет
`Cache-Control: no-store` и собственный `X-Request-ID`.

Владелец или администратор организации видит кнопку `Состояние` в разделе
`Безопасность и аудит`. Страница `/account/system` проверяет Account D1, desktop
OIDC, подпись лицензий, billing webhook и отдельные Stable/Beta-каналы. Статус
`Выключено` нормален для намеренно не подключённой интеграции Closed Beta;
`Нужна настройка` означает частично заполненную или неверную конфигурацию, а
`Недоступно` — сбой runtime-проверки. Те же обезличенные данные доступны через
`GET /v1/service-readiness` только браузерной Cloudflare Access-сессии владельца/администратора.
Ни страница, ни JSON не показывают значения bindings, issuer, provider, key ID,
токены, хеши или исходный текст исключения.

Страница сайта `/privacy` отдельно перечисляет локальные IQ/GPS/RER-данные и
сведения Account API. Самостоятельное закрытие личного аккаунта доступно владельцу
в нижней части кабинета:

1. Скачайте `Экспорт данных`.
2. Завершите действующую, просроченную или приостановленную платную подписку.
3. В разделе `Аккаунт` введите текущую почту и точную фразу `DELETE HORIZON`.
4. Подтвердите необратимое удаление.

Сервер одной транзакцией удаляет личную организацию, установки, installation keys,
offline lease, права, биллинг, связанные входы и персональный аудит. После закрытия
обычный вход не создаёт аккаунт автоматически. Страница показывает отдельное действие
`Создать новый аккаунт`: оно открывает чистое пространство Horizon Free, не
восстанавливая старые установки и права. В обезличенной отметке закрытия остаются
только account UUID, organization UUID, случайный request UUID и время закрытия;
email, OIDC provider и subject в неё не входят. Командные пространства и аккаунты с
другими membership закрываются через оператора. Окончательные юридические сроки
резервных копий должны быть закреплены до публичной оплаты.

`LOCAL DEMO` означает локальный тестовый режим без облачной лицензии. Для будущего
подписанного допуска окно также различает `ACTIVE`, `REFRESH DUE`, `OFFLINE GRACE`,
`EXPIRED`, `CLOCK CHECK FAILED` и `INVALID LEASE`. Horizon не принимает
неподписанный серверный lease. При первом запуске Horizon создаёт отдельную
ключевую пару ECDSA P-256. Закрытая часть хранится только в Windows DPAPI для
текущего пользователя, а окно показывает алгоритм и SHA-256 fingerprint публичного
ключа. Копирование файла настроек на другой компьютер не переносит закрытый ключ.

Desktop-контур уже умеет сохранять выданный сервером подписанный lease в отдельном
DPAPI-кэше, привязанном к installation ID и текущему пользователю Windows. При
каждом чтении Horizon заново проверяет Ed25519-подпись, аккаунт, установку, сроки и
доверенное серверное время; повреждённая запись или откат времени не дают прав.
Строки `Offline lease cache` и `Cache protection` показывают наличие записи и способ
защиты. Кнопка `Remove cached lease` удаляет только этот кэш, не удаляя ключ
установки. Online-контур продлевает lease тем же challenge и proof-of-possession,
который применялся при первой активации. Подтверждённый сервером revoke удаляет
локальные lease и refresh token и сразу снимает права. Обычная потеря сети сохраняет
offline lease до подписанного срока. Публичный production Account API ещё не развёрнут,
поэтому локальный demo серверную лицензию не создаёт.

При изменении частот, sample rate или FFT во время приёма Horizon кратко
перезапускает поток автоматически. Отдельно нажимать `Stop RX` не требуется.

## 3. Верхняя панель

### Устройство

Верхний список показывает найденные SDR и их серийные номера. Доступность зависит
от SoapySDR и установленных драйверов производителя. При выборе отображаются
драйвер, серийный номер и возможности: `RX only`, `RX + TX`, а также `AMP`, если
SDR предоставляет отдельный RF-усилитель. Список остаётся доступным во время RX:
при выборе другого SDR Horizon сам останавливает текущий поток, переключает
серийный номер и возобновляет приём. Во время IQ Replay список заблокирован.

HackRF One подключается напрямую, без SoapyHackRF. В готовый пакет Horizon для
Windows уже входят 64-битные `hackrf.dll`, `libusb-1.0.dll` и `pthreadVC3.dll`.
Подключите HackRF, запустите Horizon и нажмите `Rescan devices`. Для собственной
сборки можно поместить совместимый runtime рядом с `Horizon.exe` либо задать
абсолютный путь к `hackrf.dll` в `HORIZON_HACKRF_LIBRARY`. Horizon выбирает устройство
по заводскому serial, показывает диапазон 1 МГц-6 ГГц и sample rate до
20 MS/s (допустимый диапазон 2-20 MS/s). Общий gain распределяется между ступенями LNA 0-40 dB и VGA 0-62 dB,
а флажок `AMP` управляет отдельным RF-усилителем. Закрытый TX-путь использует
отдельный VGA gain 0-47 dB и при конфигурации передачи принудительно выключает AMP.

Если рядом есть `hackrf.dll`, нативный backend имеет приоритет над устройством
с тем же serial, найденным через SoapySDR, поэтому один приемник не дублируется
в списке.

bladeRF также может работать напрямую без SoapyBladeRF. Поместите 64-битную
`bladeRF.dll`, `libbladeRF.dll` или `libbladerf.dll` рядом с `Horizon.exe` и
нажмите `Rescan devices`. Альтернативный абсолютный путь задается через
`HORIZON_BLADERF_LIBRARY`. Horizon открывает выбранный приемник по заводскому
serial и получает у конкретной модели допустимые диапазоны частоты и sample
rate. Прием использует нативный формат SC16 Q11, bandwidth применяется к
аналоговому фильтру, а общий gain переводит RX в ручной режим и распределяется
библиотекой по внутренним каскадам. Закрытый TX-путь получает допустимые
частоты модели и переводит interleaved CF32 в нативный SC16 Q11.

Нативный bladeRF имеет приоритет над Soapy-устройством с тем же serial. Если
vendor DLL отсутствует, Horizon продолжает искать Soapy factory `bladerf` и не
мешает работе остальных приемников.

RigExpert Fobos SDR подключается через отдельный нативный backend, а не через
SoapySDR. Поместите 64-битную библиотеку производителя `fobos.dll` или
`libfobos.dll` рядом с `Horizon.exe` и нажмите `Rescan devices`. Для
нестандартного расположения задайте абсолютный путь в переменной среды
`HORIZON_FOBOS_LIBRARY`. После обнаружения Horizon показывает заводской serial,
диапазон 100 кГц-6 ГГц, доступные sample rate и флаг `AMP`. Флажок `AMP`
управляет LNA Fobos, а общий gain - его VGA.

Если библиотека отсутствует или имеет другую архитектуру, Fobos просто не
появляется в списке; запуск симулятора и других SDR не нарушается. Сама
`libfobos` в дистрибутив Horizon не включена.

Откройте `Справка -> SDR runtime...`, чтобы проверить аппаратный runtime
запущенной копии Horizon. В верхней части отдельно указаны нативные библиотеки
HackRF/bladeRF/Fobos и Soapy factories `hackrf`, `bladerf`. Кнопка `Show Details...`
показывает найденные файлы модулей, пути поиска и ошибки загрузчика.

Наличие строки `SoapySDR core: BUILT IN` само по себе не означает поддержку
конкретного SDR. Для bladeRF достаточно `Native bladeRF library: READY` либо
`bladeRF Soapy factory: READY`. Для HackRF достаточно `Native HackRF library: READY` либо
`HackRF Soapy factory: READY`. Состояние `NOT FOUND` означает, что runtime-файлы
повреждены, имеют другую архитектуру либо отсутствуют рядом с запущенным EXE.

Если драйвер не сообщает заводской serial, Horizon показывает идентификатор
`NOSERIAL-...`, детерминированный из аргументов SoapySDR. Он различает устройства
в текущей конфигурации, но не является серийным номером производителя.

Sample rate и центральная частота обязательны. Bandwidth и общий gain применяются
best-effort: отсутствие этих API у конкретного драйвера больше не блокирует RX.

### AMP

Флажок `AMP` включает отдельный встроенный RF-усилитель, только если драйвер SDR
сообщил о такой возможности. Используйте AMP при слабом сигнале и достаточном
динамическом диапазоне. Если поднимается весь шумовой фон, появляются зеркальные
сигналы или вершины упираются в верх шкалы, выключите AMP.

### Start и End

`Start` и `End` задают полный диапазон Spectrum и Waterfall. Например, `2400` и
`2500` означают карту 2,4–2,5 ГГц. Если диапазон шире мгновенной полосы SDR,
Horizon делит его на сегменты и перестраивает приёмник. Это режим sweep.

### RATE / Sample rate

`RATE` задаётся в MS/s и определяет количество комплексных IQ-отсчётов в секунду,
а следовательно, мгновенную полосу одного захвата.

- При `40 MS/s` один захват покрывает примерно 40 МГц.
- Диапазон 100 МГц при `40 MS/s` собирается из нескольких перестроек.
- Больший sample rate может ускорить широкий sweep и сохранить короткие детали.
- Он также увеличивает USB-поток, нагрузку DSP, скорость IQ-записи и риск пропусков.
- Sample rate сам по себе не увеличивает FFT-разрешение. Частотный шаг примерно
  равен `sample rate / FFT size`.

Выбирайте максимальный стабильный rate, который поддерживают SDR, USB и компьютер.
Для точного узкополосного анализа часто выгоднее сузить диапазон и уменьшить rate.

### WATERFALL FFT

Доступны 1024, 2048, 4096, 8192, 16384 и 32768.

- Меньший FFT быстрее и лучше сохраняет временную плотность строк.
- Больший FFT лучше разделяет близкие несущие.
- Слишком большой FFT увеличивает нагрузку и временное окно анализа.

Рекомендуемый старт: 4096–8192. Для близких узкополосных несущих используйте
16384–32768. При падении FPS сначала уменьшите FFT.

### Управление приёмом

- `Start RX` / `Stop RX` запускает или останавливает получение IQ.
- `Pause display` останавливает только изображение. SDR или IQ-файл продолжают
  работу, поэтому `Resume display` показывает уже текущее место.
- Кнопка сброса рядом с диапазоном возвращает полный масштаб Spectrum/Waterfall.
- `CPU`, `GPU`, `RAM`, `SWEEP`, скорость sweep и `FPS` выводятся в верхней полосе под меню.
  Длинная диагностика переносится на следующую строку, сохраняя все показатели.

## 4. Spectrum

Индикатор FPS измеряет отрисовки АЧХ с изменившимися спектральными данными.
Обновление надписей и несколько кадров, объединённых перед одной отрисовкой,
не увеличивают этот счётчик. Показатель sweeps/s отдельно измеряет полные
проходы выбранного диапазона. Живая АЧХ показывает последнее измерение
независимо от прокрутки или задержки истории Waterfall.

Для быстрого широкого обзора HackRF выберите «Профиль детектора → Обычный»:
этот режим использует аппаратный sweep. «Поиск ELRS» получает длинные
непрерывные IQ-блоки для анализа сигнала. При одном SDR широкий диапазон
в этом режиме обновляется заметно медленнее; статус отдельно показывает
частоту полной АЧХ и FPS отрисовки.

Spectrum показывает текущий уровень мощности по частоте. Зелёная линия `Live`
соответствует последнему кадру.

### Управление мышью

- Колесо над графиком: частотный zoom относительно курсора.
- Колесо над левой шкалой dB: сжать или растянуть вертикальный диапазон.
- Средняя кнопка по горизонтали: сдвиг частотного окна.
- Средняя кнопка по вертикали: сдвиг шкалы уровня.
- Перетаскивание левой кнопкой: измерительная рамка с начальной и конечной
  частотой, `ΔF`, `Δ dB` и пиковым уровнем.
- Правая кнопка: убрать рамку.

Масштаб Spectrum синхронизируется с Waterfall текущего монитора.

### Live, Peak Hold и Max Hold

- `Live` — текущий спектр, зелёный цвет.
- `Peak Hold` — затухающий след недавних максимумов, жёлтый цвет.
- `Max Hold` — максимумы за всё время после включения режима, розовый цвет.

Режимы выбираются по одному. Переключение очищает предыдущий hold-буфер.

### Метки сигналов

Над спектром есть два разных вида плашек. Справочные полосы `LTE`, `GSM`, `UMTS`,
`GNSS`, `Wi-Fi` и `Analog FPV 5.8` показывают известное распределение частот и
растягиваются на весь диапазон стандарта. Они не означают, что Horizon обнаружил
сигнал, и остаются стабильными при изменении шума.

Динамические плашки появляются только после работы детектора. Их ширина соответствует
измеренной мгновенной полосе пакета, а не всему диапазону ППРЧ. `ELRS SF7` означает
подтверждённый LoRa-подобный чирп с оценкой SF7 и признаками перестройки. Неизвестный
широкополосный сигнал не получает название Wi-Fi/LTE только из-за совпадения частот.

## 5. Waterfall

Waterfall показывает историю спектра: частота расположена по горизонтали, возраст
строки — по вертикали. `0` сверху означает самые новые данные. При увеличении шкала
переходит от секунд к миллисекундам и микросекундам.

### Управление мышью

- Колесо над изображением: частотный zoom.
- Колесо над левой шкалой: видимая глубина времени.
- Средняя кнопка по горизонтали: сдвиг по частоте.
- Средняя кнопка по вертикали: просмотр истории; прокрутка ограничена накопленными
  данными.
- Левая кнопка: рамка с частотами, `ΔF`, возрастом, `Δt` и пиковым уровнем.
- Правая кнопка: убрать рамку.

### Цвет и теплота

Справа находится цветовая шкала и кривая преобразования dB в цвет.

- `Auto` оценивает шумовой фон и контраст автоматически.
- `Manual` сохраняет установленную оператором кривую.
- Перетаскивайте три точки левой кнопкой: вертикаль меняет dB-порог, горизонталь
  меняет положение цвета.
- Колесо над шкалой сдвигает весь диапазон dB.
- `Shift + колесо` сжимает или расширяет диапазон цветов.
- Двойной щелчок по шкале возвращает Auto.

При сильной ряби сначала включите Auto. Затем при необходимости перейдите в Manual
и поднимите нижнюю точку чуть выше шума.

## 6. Signal analyzer

Откройте `Tools > Signal analyzer`. Инструмент ведёт отдельные сигнальные треки.

1. Запустите RX и подождите несколько циклов sweep.
2. Сначала работайте с выключенным `Raw candidates`.
3. Для отладки включите Raw candidates, чтобы увидеть неподтверждённые пики.
4. Выберите подтверждённый трек и нажмите `Locate`, чтобы передать его параметры в
   Direction Finder.

### Столбцы

- `ID` — локальный идентификатор трека.
- `State` — `CANDIDATE`, `PROBABLE` или `CONFIRMED`.
- `Type`, `Type %` — тип и уверенность классификатора.
- `Hop %` — уверенность в перестройке частоты.
- `SF` — spreading factor; `...` означает недостаточно доказательств.
- `Rate` — вероятный LoRa air-rate профиль ExpressLRS 4.0.1.
- `Sym kBd` — символьная скорость `BW / 2^SF`.
- `Pkt MHz` — мгновенная полоса пакета/чирпа.
- `Range MHz`, `Min MHz`, `Max MHz` — занятый диапазон ППРЧ.
- `Freq MHz` — последняя наблюдаемая частота.
- `SNR` — превышение над шумом.
- `Hops`, `Hops/s`, `Dwell` — переходы, скорость и время на канале.
- `Activity` — доля наблюдений с активным треком.

В sweep-режиме трекер использует время исходных сегментов, а не время готовой
панорамы. Если частота наблюдений недостаточна, `>=` перед `Hops/s` означает
измеренную нижнюю границу скорости, а `<=` перед `Dwell` — верхнюю границу времени
на канале. Значения без этих знаков прошли проверку временного разрешения.

Оценка SF выполняется в фоне и последовательно распределяется между сегментами и
кандидатами. На широком диапазоне подтверждение всех одновременных источников может
занять несколько полных циклов sweep. Готовая оценка удерживается четыре секунды,
чтобы асинхронный результат встретился со следующим наблюдением той же частоты;
кэш ограничен 64 записями и не растёт со временем.

Для ELRS используйте комбинацию `CONFIRMED`, устойчивого SF, высокого `Hop %`,
повторяемого `Hops/s` и правдоподобного Range, а не одно поле Type.

В `Rate` суффикс `F` означает Full Resolution, `D` — DVDA, `est.` — выбор между
несколькими профилями с помощью измеренного `Hops/s`. Например, `100F/150 Hz`
означает, что SF и BW совпадают с обоими режимами и данных пока недостаточно для
честного разделения. Это классификация радиопрофиля, а не декодирование содержимого
пакета. `custom LoRa` означает LoRa/FHSS с измеренным SF, который не совпал со
стандартной таблицей ELRS 4.0.1; он не получает официальную метку ELRS автоматически.

## 7. Подтверждённые события

Horizon оценивает доказательства управления и видео независимо. Близость частот
сама по себе не связывает их с одним источником. Результаты доступны в Spectrum,
Signal analyzer и Event log.

В `Tools > Event log` находятся настройки High-оповещений:

- `Arm direct High alerts` включает реакцию на новые подтверждённые High-события.
- `Sound` включает звук.
- `Snapshot` сохраняет снимок спектра и отчёт об инциденте.

`Auto DF ELRS` находится в `Devices / Map > Direction finding` и запускает один
пеленгационный проход для нового подтверждённого ELRS. Требуется rotator.
После запуска оповещения и автоматическая пеленгация разоружены.

## 8. Профили детекторов и поиск FPV

`Tools > Detector profile` выбирает полевые пороги без остановки приёма:

- `Sensitive` — слабые сигналы и чистый эфир; ниже порог SNR/fill и line sync.
- `Field` — рекомендуемый баланс чувствительности и ложных срабатываний.
- `Dense RF` — загруженный городской эфир; повышенные пороги Wi-Fi/LTE окружения.

Профиль применяется к Signal analyzer, ELRS/FHSS-кандидатам и FPV-анализ,
включая все активные SDR, и сохраняется в workspace. Он управляет появлением
кандидатов, но не отменяет независимые требования SF, hopping и PAL/NTSC evidence.

`Custom...` открывает редактор порогов. Значения dB вводятся непосредственно, а
fill и confidence — в процентах. `Import profile...` и `Export Custom...` работают
с переносимым файлом `*.hdet.json` схемы `horizon.detector-profile/v1`. При импорте
проверяются все обязательные поля, конечность чисел и безопасные пределы значений.

В заголовке `Signal analyzer` отображаются активный профиль,
фактические пороги и счетчики последнего цикла. Цепочка `regions -> accepted`
показывает число найденных спектральных областей и прошедших кандидатов. Поля
`reject SNR`, `narrow`, `BW` и `fill` объясняют, на каком фильтре были отклонены
остальные области. Для сохранения снимка выберите
`Tools > Detector profile > Export diagnostics snapshot...`: CSV содержит отдельную
строку для каждого монитора, число обработанных циклов, средний noise floor и
накопленные счетчики всей текущей сессии. Если диапазон монитора собирают несколько
SDR, в поле receiver перечисляются все их серийные номера. Экспорт после Stop RX
сохраняет итог сессии и подходит для сравнения профилей на одной IQ-записи.

`Tools > Detector profile > Compare profiles on IQ...` прогоняет одну запись через
`Sensitive`, `Field`, `Dense RF` и текущий `Custom`. FFT каждого IQ-кадра вычисляется
один раз и повторно используется всеми профилями, поэтому сравнение получает
одинаковые входные данные. Поддерживаются `.hmiq`, `.hiq` и raw CF32. Контейнеры
используют записанные метаданные; для `.cf32`, `.iq` и `.bin` применяются текущие
Center и Rate. Работа выполняется в одном фоновом потоке. Повторное нажатие команды
отменяет анализ. Итоговый CSV содержит абсолютные счетчики и число Signal/FPV
кандидатов на FFT-кадр для каждого профиля.

### Эталонная разметка IQ

`Tools > Detector profile > Edit IQ ground truth...` создаёт рядом с записью файл
`<имя IQ>.labels.json` схемы `horizon.iq-ground-truth/v1`. Для каждого события
задайте ID, тип сигнала, Start/End времени, Start/End частоты и при необходимости SF.
SF доступен только для `ELRS/FHSS`; допустимы значения SF5–SF12.

Флаг `Entire recording reviewed` означает, что пользователь просмотрел всю запись,
а не только отметил несколько известных сигналов. Без него benchmark считает recall
по известным событиям, но оставляет precision пустым. При полном просмотре CSV также
содержит false positives и precision. Совпадение требует пересечения кандидата с
меткой одновременно по времени и частоте. Для `Analog FPV` используется FPV-анализ,
для остальных типов — Signal detector. Если имя или размер IQ изменились, Horizon
не применяет старую разметку к другому содержимому.

После сравнения Horizon открывает таблицу результатов прямо в приложении. В ней
показаны Signal/FPV candidates per frame, TP, FP, FN, precision и recall для каждого
профиля. Кнопка `Open CSV` открывает полный машинно-читаемый отчёт.


### Пакетная проверка размеченных IQ

`Tools > Detector profile > Run labeled IQ regression suite...` рекурсивно находит в
выбранной папке IQ-записи с файлами `<имя IQ>.labels.json` и сравнивает все профили
на одинаковых FFT-кадрах. Неразмеченные записи пропускаются. Повторное нажатие команды
останавливает текущий прогон.

CSV содержит строки `FILE` для каждой записи, `TOTAL` со сводными TP, FP, FN,
precision и recall по каждому профилю, а также `ERROR` для файлов, которые не удалось
прочитать или проверить. Сводная precision вычисляется только тогда, когда все вошедшие
в неё записи отмечены `Entire recording reviewed`; это не позволяет принять неполную
разметку за отсутствие ложных срабатываний.

`Save baseline...` сохраняет проверенный результат в переносимый JSON-файл.
`Compare baseline...` сравнивает новый прогон с ним и показывает изменение precision
и recall в процентных пунктах: `STABLE`, `IMPROVED` или `REGRESSION`. Сравнение
разрешено только для того же набора IQ-файлов с теми же путями и размерами.
Кнопка `Export CSV...` сохраняет машинно-читаемый quality gate. Первая строка
содержит `PASS` или `REGRESSION`, далее идут дельты каждого профиля.

FPV-анализ ищет устойчивые широкополосные сигналы и отдельно отмечает кандидатов
аналогового FPV-видео. Сам факт большой полосы не считается доказательством видео.

Широкий накопленный след подтверждённого ELRS/FHSS не считается аналоговым видео:
Horizon учитывает hopping-доказательства даже тогда, когда sweep-карта визуально
заполнила весь рабочий диапазон. Wi-Fi/LTE-подобный канал также исключается из FPV,
включая совпадение его центра с частотой стандартного видеоканала.

Для метки `Analog FPV candidate` дополнительно требуются пять последовательных
наблюдений, высокая непрерывность и устойчивые центр и ширина полосы. До накопления
временных доказательств сигнал имеет класс `Wideband carrier` в анализаторе
и журнале. Неподтверждённая широкополосная несущая не показывает отдельную плашку
на спектре; метка `Analog FPV` появляется после подтверждения аналогового кандидата.

После спектральной проверки Horizon анализирует IQ кандидата и ищет периодичность
строк PAL (`64 µs`) или NTSC (`63.56 µs`) вместе с кратными периодами. `Line sync`
показывает доверие к этому признаку, а `Standard` — наиболее вероятный стандарт.
Без подтверждённой строчной структуры высокий уровень аналогового FPV не выдаётся.

`FPV confidence` — итоговая объяснимая оценка. Она складывается из `Spectral`
(форма и SNR полосы), `Channel score` (близость к стандартной частоте), `Morphology`
(fill, persistence, continuity и стабильность) и `Line sync` (IQ-периодичность).
Журнал использует итоговую оценку аналогового видео отдельно от оценки неизвестной
широкой несущей. FPV-анализ работает при показе Spectrum, Signal analyzer,
Event log или при включённых обработчиках подтверждённых событий.

Для проверки и открытия видео используйте единый инструмент:

1. Откройте `Tools > Video scanner`.
2. Выберите `Сканировать каналы` и отметьте диапазоны `3,3 ГГц` и/или `5,8 ГГц`.
3. Нажмите `Start scan` и дождитесь подтверждённого `VIDEO LOCK`.
4. Выберите строку и нажмите `Open selected`.

Оценки спектра не заменяют проверку PAL/NTSC. Класс `Wideband carrier` означает
устойчивую широкополосную несущую без подтверждённого типа.

Редкие чирпы ELRS не должны считаться видео только потому, что за время пересекли
широкий диапазон: детектор дополнительно использует fill и persistence. Класс
`Wideband carrier` не переводится в уровень High как аналоговое видео.

## 9. Analog video

Инструмент декодирует аналоговое PAL/NTSC-видео из непрерывного IQ-потока и умеет
последовательно проверять каналы выбранных диапазонов 3,3 и 5,8 ГГц.
Частоты сканера независимы от диапазона SDR на главном экране: список строится
из таблиц каналов отмеченных диапазонов. По умолчанию выбран диапазон 5,8 ГГц;
выбор диапазонов сохраняется между запусками.

1. Оставьте стандарт `Auto` либо принудительно выберите `PAL`/`NTSC`.
2. Выберите `Сканировать каналы` (`Scan channel plans`) и отметьте один или оба
   диапазона в списке. Для одной частоты доступны `Manual` и `5.8 GHz channel`.
   Режим `Свой диапазон` (`Custom scan range`) использует отдельно заданные
   Start/End/Step; открытие окна и переключение режимов не копируют частоты
   с главного экрана.
3. Для одного канала нажмите `Start video`, для полного плана — `Start scan`.
4. Horizon временно остановит широкий sweep, настроит непрерывный RX и будет проверять
   только частоты из выбранных таблиц: 35 уникальных частот для 3,3 ГГц,
   39 для 5,8 ГГц или 74 для обоих диапазонов. Одинаковые частоты проверяются один раз;
   между диапазонами сканер не добавляет промежуточных частот.
5. Строка получает `VIDEO LOCK` только после трёх последовательных подтверждений
   PAL/NTSC timing. Высокий уровень или ELRS-чирп сам по себе видео не подтверждает.
6. После остановки/закрытия инструмента предыдущие диапазон, rate, zoom и RX
   восстанавливаются.

Таблица 3,3 ГГц соответствует [Foxeer Reaper 40CH](https://flymod.net/download/foxeer_reaper_33g_manual),
каналы A/B/E/F/R, 3170–3630 МГц. Для других моделей передатчиков таблица каналов
может отличаться. В результатах рядом с каналом указан диапазон, например
`3.3 GHz A1` и `5.8 GHz A1`.

Raceband 5,8 ГГц: R1 5658, R2 5695, R3 5732, R4 5769, R5 5806, R6 5843,
R7 5880, R8 5917 МГц. Таблица полного scan показывает канал, частоту, стандарт и
текущее состояние; одинаковые частоты сканируются один раз.

Карта частот над таблицей показывает весь план без создания сотен UI-кнопок:
голубой означает текущую частоту, зелёный — тихую, жёлтый — несущую без video lock,
розовый — подтверждённое видео. Клик выбирает ту же строку таблицы, двойной клик
останавливает scan и открывает канал. Для длинного пользовательского диапазона карта
автоматически превращается в компактную heatmap; точная частота и уровень остаются
в tooltip и таблице. Во время scan большой live-preview скрыт, а подтверждённые кадры
остаются в столбце `Preview`; при открытии канала live-preview занимает его место.

- `Snapshot` сохраняет PNG.
- `Record` начинает MJPEG/AVI; повторное нажатие останавливает запись.
- `Open folder` открывает каталог видео.
- Статус показывает timing confidence, стандарт, размер и отброшенные кадры.

При циклическом поиске таблица дополнительно помогает выбрать свободный канал:

- `Busy` показывает долю проходов с несущей или подтверждённым видео и число
  валидных наблюдений.
- `Activity history` хранит последние 96 проходов: зелёный — тихо, жёлтый —
  несущая без video lock, красный — подтверждённое PAL/NTSC, серый — нет данных.
- `Open best free` становится доступна после минимум трёх валидных проходов
  с достаточным покрытием. Horizon проверяет не только центр, но и все соседние
  точки, которые перекрываются 20-МГц видеополосой; неизмеренный или занятый
  сосед не может быть выдан как свободная частота.
- `Follow` возвращает автоматическую прокрутку за текущей частотой. По умолчанию
  он выключен, поэтому scan не отбирает у пользователя выбранную строку.
- После первого полного прохода `CYCLE` и `CH/s` показывают измеренную, а не
  расчётную скорость сканирования.
- До накопления истории сводка помечает самый тихий канал как `PROVISIONAL`;
  кнопка `Clear` сбрасывает уровни, кадры и историю рекомендаций.

Поиск выполняется в два этапа. Уровень IQ измеряется для каждой частоты дешёвым
проходом; PAL/NTSC timing запускается только во время начального обучения noise floor,
для несущих выше адаптивного порога и при наличии timing evidence. На тихой частоте
остаётся контрольная проба через каждые десять блоков, поэтому слабое видео не
исключается навсегда. Полный декодер включается только после первых признаков
строчной структуры. `DSP GATED` в сводке показывает долю запланированных timing-проб,
которые не потребовали тяжёлого анализа, а `DECODE` — число реально обработанных
декодером блоков.

Декодирование и запись используют ограниченные фоновые очереди, поэтому медленный
диск не должен останавливать Spectrum/Waterfall. Без подтверждённого line timing
кадр остаётся `UNCONFIRMED VIDEO TIMING`.

## 10. Event log

Event log показывает переходы `START`/`END` и события детекторов.

- `Clear` очищает только таблицу.
- `Export CSV` экспортирует дневной журнал.
- `Open logs` открывает постоянные JSONL-журналы.

Столбцы включают время, событие, состояние, тип, частоту, полосу, уровень, SNR и
длительность. Очистка таблицы не удаляет файлы.

## 11. 3D panorama

`Tools > 3D panorama` строит временной стек: частота идёт по X, уровень вверх,
старые трассы уходят в глубину.

- `Pause` замораживает panorama, не останавливая RX.
- Корзина очищает историю.
- Кнопка сброса возвращает стандартную перспективу.
- `History` задаёт 48, 96, 160 или 256 трасс.
- Колесо меняет вертикальное усиление.
- `Shift + колесо` меняет глубину перспективы.
- Средняя кнопка перемещает сцену.
- Двойной щелчок левой/средней кнопкой сбрасывает вид.

Последняя трасса выделена ярко. Инструмент удобен для ППРЧ и кратких импульсов.
История ограничена; когда окно скрыто, кадры ему не передаются.

## 12. Карта; GPS, устройства и пеленгация — в разработке

В текущей Beta доступна карта с ручным вводом координат. GPS/NMEA, внешние
устройства и Direction Finder скрыты: для них пока нет готового поддерживаемого
комплекта оборудования. Описание ниже сохранено как справка по прототипу и не
означает доступность этих элементов интерфейса. Старые настройки остаются в профиле,
но подключение устройств автоматически не запускается.

### GPS / NMEA — прототип, скрыт

Быстрое подключение с карты:

1. Откройте `Tools -> Devices / Map -> Map`.
2. Подключите USB GPS и нажмите `Find GPS`.
3. Horizon в фоновом режиме проверит свободные COM-порты на скоростях 4800,
   9600 и 38400 бод. Уже занятые Horizon порты поворотки, компаса и других
   устройств не проверяются.
4. Найденный NMEA-приёмник добавляется в профиль с автоматическим
   переподключением. Карта переходит к координатам GPS.

Ручное подключение и нестандартная скорость:

1. Выберите драйвер `GPS / NMEA serial`.
2. Выберите COM-порт или введите, например, `COM3@4800`.
3. Оставьте `Reconnect` для автоматического восстановления.
4. Нажмите `Add device`.

Поддерживаются NMEA GGA/RMC: координаты, высота, спутники, fix, HDOP/точность,
скорость и курс при наличии полей.

Валидный RMC также даёт UTC reference. В таблице `UTC Δ` показывает отличие
времени GPS от системных часов, а `+/-` — консервативную погрешность с учётом
разрешения поля времени и передачи предложения по UART. Horizon не изменяет часы
Windows. Слишком старое сообщение или смещение более 5 секунд не используется
автоматически для нового наблюдения распределённого РЭР (В разработке).

Каждый принятый GGA/RMC fix получает локальную отметку времени. Если новые валидные
координаты не поступали более 3 секунд, таблица показывает `GPS stale`, сохранённая
метка остаётся видимой для диагностики, но исключается из новых DF-наблюдений; распределённый РЭР — В разработке.
Статическая позиция, которую оператор установил на карте вручную, не имеет такого
тайм-аута.

Строка GPS над картой показывает поиск, ожидание fix, число спутников, точность или
возраст устаревшей координаты. Живая метка подписана `HORIZON | GPS FIX`, вокруг
неё рисуется круг заявленной горизонтальной точности. Если данные старше трёх
секунд, метка становится жёлтой и получает статус `GPS STALE`. Ручная координата
рисуется голубым цветом; рядом показываются только координаты и высота.

### Одноразовая координата через SDR

`Fix via SDR` позволяет временно использовать выбранную SDR как GPS L1-приёмник,
получить координату поста и сразу вернуть приёмник к прежней работе:

1. Подключите к SDR GPS L1-антенну на 1575,42 МГц и установите её с открытым
   обзором неба. Активной антенне требуется совместимое внешнее питание или bias-tee;
   не включайте питание, если оно не допускается антенной и SDR.
2. Откройте `Tools -> Devices / Map -> Map` и нажмите `Fix via SDR`.
3. При первом запуске укажите `gnss-sdr.exe`. Horizon также ищет его рядом с
   приложением, в `runtime/gnss-sdr` и по переменной `HORIZON_GNSS_SDR`.
4. Horizon остановит текущий RX, настроит выбранную SDR на GPS L1, запишет 45 секунд
   IQ с частотой 2 MS/s и затем автоматически восстановит прежнее устройство,
   диапазон, выбранные приёмники, sweep и состояние паузы экрана.
5. После восстановления RX файл декодируется в фоне. При успешном fix координата
   появится на карте, а временный IQ-файл будет удалён.

Кнопка превращается в `Cancel GPS` на время операции. Отмена захвата немедленно
возвращает прежний RX; отмена декодирования не затрагивает уже восстановленный RX.
Декодер проверяется до остановки эфира, поэтому отсутствие GNSS-SDR не прерывает
текущий приём.

Полученная точка подписана как сохранённый `GPS SDR FIX` с возрастом. Она подходит
для привязки неподвижного поста, но не считается живой телеметрией и не должна
использоваться при перемещении поста или вместо свежего GPS/UTC в автоматическом РЭР (В разработке).
Для непрерывных координат и синхронизации времени используйте NMEA GPS.

### Compass / NMEA HDT-HDM

1. Выберите драйвер `Compass / NMEA HDT-HDM`.
2. Выберите COM-порт или введите endpoint с baud rate, например `COM4@4800`.
3. Нажмите `Add device`.

`HDT` отображается как `TRUE`, `HDM` как `MAG`. Валидный курс ориентирует метку
поста на карте. Если подключён rotator с телеметрией, его фактический азимут имеет
приоритет на карте; показание компаса продолжает отображаться в таблице устройств.
Компас не получает команды вращения и не считается поворотным механизмом.

### Rotator / GS-232

1. Выберите `Rotator / GS-232 serial`, порт и нажмите `Add device`.
2. Для теста выберите отдельный драйвер `Virtual rotator`; endpoint
   `SIM-ROTATOR` появится автоматически.
3. Введите `Az`, `El` и нажмите `Set heading`.


В строке `Rotator limits` задаются программные пределы истинного азимута и угла
места. Азимут `Az CW Start -> Stop` всегда описывает сектор по часовой стрелке.
Например, `300 -> 60` означает сектор шириной 120 градусов через север:
`300...359.9`, затем `0...60`. Значения `0 -> 359.9` оставляют почти полный круг.
Ручные команды за пределами сектора ограничиваются ближайшей границей и
помечаются `ROTATOR LIMITED`.

Direction Finder начинает с `Start`, проходит сектор по часовой стрелке с заданным
шагом, корректно переходит через `359 -> 0` и не выходит за границу `Stop`.
Полнота диаграммы оценивается относительно заданного сектора: проход `300 -> 60`
должен покрыть свои 120 градусов, тогда как проход полного круга по такой же
частичной выборке будет отклонён как `INCOMPLETE COVERAGE`.

`North offset` калибрует ноль механизма: физическая команда равна истинному
азимуту плюс offset, а telemetry преобразуется обратно перед картой и DF; распределённый РЭР — В разработке.
В таблице `AZ` — истинное направление, `DEV` — показание контроллера. Изменение
любого предела или offset во время DF немедленно прекращает сканирование и
отправляет rotator команду `STOP`. Пределы и offset сохраняются в рабочем
профиле, но сам DF после запуска программы остается выключенным.

### Rotator / Hamlib rotctld

1. Запустите `rotctld` с backend нужного поворотного устройства.
2. В Horizon выберите `Rotator / Hamlib rotctld`.
3. Введите endpoint `IP:порт`, например `127.0.0.1:4533`, и нажмите `Add device`.
4. Проверьте появление свежих `Az/El`, затем используйте `Set heading` или Direction Finder.

Если порт не указан, используется стандартный `4533`. Сетевое устройство имеет ту же
проверку свежести telemetry и ожидание фактического поворота, что и GS-232.
Таблица показывает тип, драйвер, endpoint, состояние и данные. `Remove` удаляет
выбранное устройство.

Ответ положения GS-232 считается свежим 1,5 секунды. Если rotator заявил поддержку
telemetry, DF не начинает измерение по старому углу и не переключается автоматически
в режим без обратной связи: статус показывает ожидание свежей telemetry, а через
15 секунд операция завершается с ошибкой. Задержка 750 мс используется только для
простого rotator-драйвера, который изначально не имеет capability telemetry.

`Generic serial transport` резервирует обычный COM endpoint для будущего или
пользовательского протокола. Выбранный `driverId`, endpoint и автоподключение
сохраняются в рабочем профиле. Старые профили GPS/rotator автоматически переводятся
на новые идентификаторы драйверов.

### Карта

В подписи поста ALT показывает численную высоту рельефа для его координат
на любом слое карты. Высота автоматически берётся из DEM с постоянной
детализацией и не зависит от масштаба карты. До загрузки показывается «…»,
при отсутствии данных — «—». При выборе позиции щелчком по карте найденная
высота рельефа также подставляется в поле `Alt`. Высота GPS и значение, введённое
через поля вручную, сохраняются без автоматической замены.

- `Карта` (`Map`) — координатная сетка, `Спутник` (`Satellite`) — спутниковые
  тайлы, `Карта высот` (`Elevation map`) — рельеф с окраской высот и затенением склонов.
- В режиме `Позиция поста` левый щелчок заполняет широту и долготу, а после загрузки DEM — поле `Alt`.
- Выберите `Расстояние`, `Радиус` или `Азимут` в панели над картой. Первый щелчок
  задаёт точку A, движение мыши показывает предварительное измерение, второй
  щелчок фиксирует точку B. Следующий щелчок начинает новое измерение.
- `Расстояние` показывает длину по поверхности Земли; `Радиус` рисует круг с центром
  в A и радиусом A–B. `Азимут` показывает направление от A к B: 0° — истинный север,
  90° — восток, отсчёт по часовой стрелке. При совпадении точек азимут не определён.
- `Очистить измерение` убирает точки и фигуру. Измерения сохраняют географические
  координаты при перемещении карты и смене слоя и не меняют позицию поста.
- На карте высот рядом с результатом отображаются приблизительные высоты рельефа
  в точках A/B. Это высоты земли, а не зданий или GPS-приёмника. Цветовая шкала
  расположена внизу карты; полный список источников открывается по ссылке слева.
- Новые участки спутниковой карты и карты высот загружаются из сети. Просмотренные
  тайлы кэшируются на диске. При недоступности данных высота не подменяется нулём.
  Источник рельефа: [Terrain Tiles](https://registry.opendata.aws/terrain-tiles/).
- Средняя кнопка перемещает карту.
- Колесо меняет масштаб относительно курсора.
- Координаты можно задать через `Lat`, `Lon`, `Alt` и `Set position`.
- `Find GPS` и `Follow GPS` относятся к скрытому прототипу и недоступны в текущей Beta.

### Direction Finder

1. Установите позицию поста.
2. Подключите rotator.
3. Задайте `DF MHz`, измерительную `BW`, `Step deg`, `Dwell ms` и `El`.
4. Нажмите `Start DF`.

Rotator проходит азимуты, Horizon ждёт завершения движения, накапливает уровень и
строит диаграмму. На каждом азимуте обрабатываются все кадры за `Dwell`, а не один
последний кадр: статус показывает duty-weighted уровень, SNR, `ACTIVE` и число
кадров `N`. Это уменьшает вероятность пропустить редкий прыжок FHSS/ELRS. `BW`
должна покрывать рабочую полосу выбранного ППРЧ-трека.

После полного прохода Horizon интерполирует максимум между шагами поворотного
устройства. `AZ` — оценка азимута, `+/-` — угловая погрешность, `BW` — ширина
главного лепестка по уровню -3 dB, `C` — доверие к диаграмме. Плоская или неполная
диаграмма автоматически даёт низкое доверие и большую погрешность.

Красный статус `DF REJECTED` означает, что диаграмма оставлена только для
диагностики и не добавлена на карту, в инцидент; `RER session` — В разработке. В статусе указана
причина: мало измеренных углов, неполное покрытие, низкий контраст, слишком широкий
луч, низкое доверие или чрезмерная погрешность. Для рабочего пеленга уменьшите шаг,
увеличьте `Dwell`, проверьте полосу `BW` и направленность антенны.

Завершённый проход добавляет луч на карту. После измерений минимум
из двух разнесённых позиций выполняется локальная триангуляция. Почти параллельные
лучи отклоняются; рекомендуются три и более позиции. `Clear bearings` начинает
новую сессию.

### РЭР — В разработке

Распределённая РЭР не прошла полевую приёмку. В текущей Beta окно `RER session`,
кнопка карты и пункты меню скрыты; старый рабочий профиль не открывает это окно
и не запускает синхронизацию постов. Наличие протоколов в исходниках не означает
готовность функции для пользователей. Доступна карта с ручным вводом координат;
GPS, устройства и пеленгация скрыты как функции в разработке. План распределённого РЭР описан в разделе 20.

В основных рабочих окнах и разделах настроек есть кнопка **«Помощь»**.
Она открывает краткие пояснения под кнопкой: назначение окна, порядок начала
работы и значение основных параметров. Закрыть пояснение можно щелчком снаружи.

## 13. Automation

«Автоматизация» настраивает одно действие по событию. Для обычной работы
есть два готовых действия, которые заполняются через форму:

- **«Показать уведомление»** — показывает событие в Horizon. Звук включается
  галочкой. Текст можно оставить пустым: программа сама подставит данные события.
- **«Записать IQ»** — задайте диапазон монитора 1, длительность в секундах и
  папку. Запись начнётся автоматически и остановится через указанное время.
  Остальные мониторы записываются в текущих диапазонах. Для этого нужен
  работающий приём SDR и право записи IQ в лицензии.

### Как настроить

1. В **«Когда запускать»** выберите событие:
   - **«При тревоге уровня»** — «Настроить тревогу…» открывает настройку
     зоны частот, порога и включения тревоги.
   - **«При новой высокой угрозе»** — один запуск при начале нового события High.
2. В **«Что сделать»** выберите готовое действие и заполните его параметры.
3. Нажмите **«Выполнить один раз»** для реальной проверки выбранного действия.
   Результат появится в журнале.

По умолчанию автозапуск выключен. Строка в первом блоке показывает его состояние.
Запись IQ меняет диапазон первого монитора на указанный в форме. При уже идущей
записи новая запись не запускается и существующая не прерывается. Файл каждого
запуска получает отдельное имя в выбранной папке.

Кнопка **«Помощь»** открывает пояснения в выпадающем окне под кнопкой.
Окно закрывается щелчком снаружи.

### Для интеграций

Галочка **«Интеграции и внешние программы»** раскрывает дополнительные действия:
запуск программы, HTTP-запрос, Webhook и MQTT. Эти действия не нужны для
уведомления и записи IQ.

Программа запускается отдельным процессом. Для `.ps1` выберите `powershell.exe`,
для `.py` — `python.exe`, путь к скрипту укажите в аргументах. REST поддерживает
GET/POST/PUT/PATCH/DELETE, Webhook — POST JSON. MQTT 3.1.1 использует QoS 0
без логина и TLS; очередь отправки не подтверждает получение сообщения.

В «Помощи» для этих действий перечислены переменные:

- `${frequency_hz}`, `${frequency_mhz}` — основная частота;
- `${secondary_frequency_hz}`, `${secondary_frequency_mhz}` — частота видео;
- `${level_db}`, `${confidence}` — уровень сигнала и уверенность детектора;
- `${event_type}`, `${evidence}`, `${timestamp}` — тип, описание и время UTC.

Подставляются данные последнего срабатывания автоматизации. До первого события
числовые значения равны нулю. Текстовые значения не экранируются для JSON.

## 14. Level alarm


`Confirm` задает минимальное время непрерывного превышения порога. До его
истечения зона имеет состояние `PENDING`, поэтому одиночный выброс FFT не
создает инцидент и не запускает автоматизацию. `Release` задает время, которое
уровень должен непрерывно оставаться ниже `Level - Hyst`, чтобы активная тревога
вернулась в `ARMED`. Значения по умолчанию: 200 и 500 мс соответственно.
Состояния рассчитываются по монотонному времени источника, а не по FPS
интерфейса; настройки сохраняются в профиле рабочего пространства.
Level alarm контролирует независимые частотные зоны.

1. Нажмите `Add zone` и выберите строку.
2. Задайте имя, `Start`, `End`, `Level` и `Hyst`.
3. Включите зону в столбце `On`.
4. Включите общий `Enabled`.

`Hyst` — гистерезис: после события уровень должен опуститься ниже порога на эту
величину, чтобы зона вернулась в норму.

- `Sound` — звук.
- `Snapshot` — снимок спектра.
- `IQ clip` — IQ до/после события; длительности задают `Pre` и `Post`.
- `Test` проверяет звук, но не имитирует полный RF-инцидент.
- `Open incidents` открывает материалы.

Зоны имеют независимые latch-состояния. Двойной щелчок по `Evidence` открывает
папку события.

## 15. Channel planner

1. Задайте `Start`, `End`, `Width MHz` и порог `Busy dB`.
2. Включите `Enabled` и дождитесь не менее восьми наблюдений полного sweep.
3. Сравнивайте `Avg dB`, устойчивый к одиночным выбросам `P95 dB`, `Busy` и
   `Coverage`. Число после косой черты в Coverage — количество наблюдений.
4. Дважды щёлкните готовую строку, чтобы перенести диапазон в основной Start/End.

До достаточного накопления строки показаны серым, Rank равен `-`, а статус остаётся
`COLLECTING`. Канал получает рекомендацию только при Coverage не ниже 80% и минимум
восьми наблюдениях. `Reset statistics` очищает накопление, `Export CSV...` сохраняет
полную ранжированную таблицу с P95, coverage и признаком готовности.

Планировщик оценивает RF-активность, но не гарантирует юридическую или протокольную
доступность канала.

## 16. Запись и воспроизведение IQ

### Record IQ

1. Запустите RX реального SDR.
2. Выберите `Tools > Record IQ...`. В окне «Запись IQ» задайте начало и конец
   диапазона в МГц для каждого активного монитора, файл и длительность в секундах.
   «До ручной остановки» (0 секунд) позволяет записывать без ограничения времени.
3. Нажмите «Начать запись». SDR настроится на выбранные диапазоны. По истечении
   длительности файл автоматически закрывается и готов к воспроизведению;
   приём и отображение спектра продолжаются.
4. В непрерывной полосе Horizon создаёт `.hiq`; в широком sweep или multi-RX —
   `.hmiq` с частотами и временными метками каждого сегмента. Широкая полоса
   снимается по участкам частот; это не одновременный непрерывный IQ всей полосы.
5. Во время записи пункт меню меняется на `Остановить запись IQ` (`Stop IQ recording`).
   Он позволяет завершить запись раньше таймера. В поиске ELRS индикатор `IQ REC`
   показывает растущий размер записи и `IQ DROP` — потерянные при записи отсчёты.

IQ записывается до display/DSP ring в отдельном writer-потоке. `Pause display` не
останавливает SDR и запись. Статус показывает размер и DROP. При росте DROP уменьшите
sample rate или используйте быстрый диск. `.hiq` хранит center, rate, bandwidth,
время и число отсчётов; заголовок финализируется при Stop.

### Replay IQ / Открыть IQ

- `.hiq` открывается с метаданными автоматически.
- `.hmiq` восстанавливает несколько SDR либо аппаратный sweep, его частоты и общую
  временную шкалу. Спектр и waterfall строятся заново из сохранённых IQ-сэмплов.
- Имена IQ-файлов могут содержать кириллицу.
- `.cf32`, `.iq`, `.bin` считаются interleaved CF32: float32 I, затем float32 Q;
  center и rate вводятся вручную.
- Если RX уже работает, Replay корректно останавливает живой поток и не переключается
  обратно на симулятор.
- Файл проходит через тот же DSP и детекторы, что SDR.
- `Pause display` не ставит файл на паузу: позиция продолжает двигаться.
- `Stop RX` завершает Replay, удаляет временный файловый пункт из списка и возвращает
  SDR, который был выбран до открытия файла.
- Для анализа с начала откройте файл заново.

### Передача IQ через SDR (закрытая Beta)

Передача доступна только если выбранный драйвер сообщает TX, лицензия одновременно
содержит `iq.replay` и отдельное право `sdr.tx`, а build safety gate открыт.
Pro и Maximum включают эти права, но не обходят аппаратные и safety-проверки.
Free и стандартный локальный demo-режим не разрешают физическое излучение.
Для рабочей сборки разработчика параметр CMake `HORIZON_ENABLE_LOCAL_IQ_TX=ON`
открывает передачу IQ в локальном режиме. Он выключен по умолчанию; упаковщик
Windows явно выключает его для выпуска. Поддержка TX устройством и оба
подтверждения оператора остаются обязательными.

1. Выберите TX-совместимый SDR и откройте `Tools > Transmit IQ through SDR...`.
2. Выберите `.hmiq`, `.hiq` либо raw `.cf32`, `.iq`, `.bin` или `.raw`.
   Для `.hmiq` выберите записанный поток SDR, если их несколько. Частота,
   sample rate и полоса каждого блока берутся из записи; поля первого блока
   показывают начальные параметры. Для `.hiq` параметры читаются из заголовка;
   для raw CF32 задайте их вручную.
3. Проверьте частоты записи и TX gain. `IQ amplitude` отдельно
   масштабирует I/Q и по умолчанию равен 10%.
4. Подтвердите подходящую антенну/нагрузку и право работать на выбранной частоте.
5. Нажмите `Start TX`. Передача выполняется один раз, без автоматического loop.
   Во время работы видны красный статус `TX ACTIVE`, прогресс и `Stop TX`.

Для записи и последующей передачи используйте `Record IQ...`, остановите запись,
затем выберите полученный файл в `Transmit IQ through SDR...`. HMIQ передаёт блоки
одного выбранного SDR в порядке записи, перестраивая передатчик по частотам и
параметрам блоков. Усиление приёмника из записи не применяется к TX: используются
TX gain и IQ amplitude из окна передачи. Паузы между блоками и одновременная работа
нескольких SDR не воспроизводятся; при перестройке передатчика возникает пауза.
Прогресс и длительность относятся к выбранному потоку. До включения передачи
проверяются структура файла, выбранные отсчёты и возможность настроить SDR на все
параметры потока. Большой HMIQ-файл полностью читается перед стартом TX, поэтому
проверка может занять время; виден статус «ПРОВЕРКА IQ-ФАЙЛА | TX ОСТАНОВЛЕН».
Несовместимые параметры или повреждённый файл вызывают отказ. Полоса фильтра HackRF
выбирается из доступных аппаратных значений; она может отличаться от записанной
полосы. Порядок настройки соответствует контракту
[libhackrf](https://github.com/greatscottgadgets/hackrf/blob/main/host/libhackrf/src/hackrf.h).

Перед включением TX Horizon останавливает RX. После завершения или Stop устройство
остаётся остановленным: возврат на приём выполняется пользователем вручную. Закрытие
окна, ошибка файла, отказ драйвера и таймаут подачи данных всегда вызывают `stopTx()`.
Рабочий профиль не восстанавливает TX вооружённым.

Нативные пути HackRF и bladeRF и общий Soapy TX покрыты тестами с поддельными
библиотеками/устройствами. Перед снятием production-блокировки обязательна проверка
на эквиваленте нагрузки и измерительном оборудовании для каждой модели SDR.

## 17. Performance, Sweep и Monitors

### Performance

- `Maximum quality` — максимальная плотность и частота обновления.
- `Balanced` — основной компромисс.
- `Low CPU` — реже обновляет и уменьшает обработку.

Для слабого ПК закройте Video и плавающие инструменты, уменьшите FFT, оставьте один
monitor и при необходимости скройте Spectrum или Waterfall.

### Sweep

- `Fast` — максимальная скорость прохода.
- `Balanced` — основной режим.
- `Deep` — больше IQ на сегмент, лучше для слабых/длинных признаков, но медленнее.

После первого полного прохода single-SDR sweep автоматически чаще возвращается
к сегментам с устойчивым превышением локального шумового фона. Внеочередной
проход помечается `REVISIT`; `RV n` показывает число возвратов в последнем
завершенном цикле. Приоритет затухает, когда активность исчезает. Частота
возвратов ограничена профилем Sweep, поэтому все базовые сегменты по-прежнему
обязательно посещаются, а `COV` и `AGE` не выдают revisit за новое покрытие.
Первый цикл всегда линейный: Horizon сначала строит полную карту диапазона и
только затем включает адаптивный приоритет.

Для первичного поиска используйте Fast. Для подтверждения SF сузьте диапазон либо
выберите Balanced/Deep.

В верхнем статусе `COV` показывает долю сегментов, которые действительно обновлены
за допустимое время, а `AGE` — возраст самого старого свежего сегмента. Нормальное
состояние после первого полного прохода — `COV 100%`. При ошибке перестройки Horizon
очищает соответствующую часть панорамы; старый сигнал не выдаётся за новое наблюдение.

### Monitors

`Tools > Monitors` включает 1–6 экранов. В многомониторном режиме каждый имеет
собственные Start/End. Новый монитор сначала наследует основной диапазон, затем
становится независимым.

Кнопка отделения в заголовке дополнительного монитора открывает весь его блок
Spectrum/Waterfall в отдельном системном окне. Перетащите это окно на другой
экран. Закройте его или нажмите кнопку возврата в заголовке, чтобы вернуть
монитор в сетку главного окна. Состав отделённых мониторов, экран и положение
окон сохраняются в рабочем профиле.

Один SDR последовательно обслуживает объединённый диапазон всех экранов; это не
несколько независимых приёмников. RAM-бюджет Waterfall делится между активными
мониторами.

FFT общей полосы вычисляется один раз. В многомониторном режиме на отрисовку и в
GPU каждого экрана передаются только bins его Start/End, поэтому добавление узких
экранов не размножает полную sweep-карту.

### Receiver manager

В колонке `Cal dB` задаётся индивидуальная поправка уровня каждого SDR от `-60` до
`+60 dB`. Поправка применяется до объединения диапазонов и используется спектром,
waterfall и детекторами. Она сохраняется по серийному номеру устройства.

Во время приёма колонки `Rate / IQ`, `Queue`, `Drop` и `Age` показывают настроенный
sample rate, среднюю скорость поступления IQ, глубину очереди, потерянные блоки и
возраст последнего блока. `STALE` означает, что данные не поступали больше секунды.

Если живой SDR не отдаёт IQ две секунды, receiver session аварийно завершилась или
sweep несколько раз подряд не смог перестроить частоту, Horizon закрывает текущий
тракт и выполняет до трёх автоматических перезапусков через `1`, `2` и `4` секунды.
Строка состояния показывает номер попытки и причину. После успешного запуска
появляется `RX RECOVERED`; если новый отказ случился после 30 секунд стабильной
работы, счётчик попыток начинается заново.

`AUTO RECOVERY EXHAUSTED` означает, что дальнейшие команды прекращены до ручного
`Start RX`. Нажатие `Stop RX` отменяет ожидающий перезапуск. Воспроизведение IQ-файла
никогда не перезапускается автоматически.

Раз в секунду Horizon записывает эту телеметрию в
`Documents/Horizon/Logs/receiver_health_YYYYMMDD.jsonl`. Файл ограничен 32 MB, после
чего предыдущая часть сохраняется с окончанием `.1`. Команды
`Tools > Export receiver diagnostics...` и `Tools > Open diagnostics folder`
экспортируют CSV и открывают каталог журналов.

`Tools > Receiver manager` показывает все найденные SDR. Флажок `Use` включает
приёмник в план, а таблица заранее показывает назначенные monitor, объединённые
диапазоны и число перестроек. Планировщик распределяет диапазоны так, чтобы
минимизировать самый длинный sweep среди выбранных SDR. Выбор сохраняется в
рабочем профиле; `Rescan` повторно опрашивает USB-устройства.

Переключатель `Assignment` задаёт способ распределения:

- `Auto balance` оставляет описанное автоматическое распределение;
- `Per SDR ranges` закрепляет отдельный диапазон за каждой отмеченной SDR.

В режиме `Per SDR ranges` колонки `Start MHz` и `End MHz` становятся
редактируемыми. Первая отмеченная SDR обслуживает Monitor 1, вторая — Monitor 2
и так далее; число экранов синхронизируется с числом выбранных приёмников.
Диапазоны сохраняются по серийному номеру. Если устройство не поддерживает
назначенную ему полосу, Horizon показывает `UNSUPPORTED MONITOR` и не подменяет
его другим SDR. Поля и флажки можно менять во время RX: тракт перезапускается с
новым назначением без повторного открытия Receiver manager.


При выборе двух и более SDR `Start RX` запускает параллельный receiver pool.
Непересекающиеся частотные участки распределяются пропорционально sample rate,
а обзорный monitor может одновременно собираться из нескольких приёмников.
Spectrum, Waterfall и общий анализ сигналов/FPV получают независимые кадры и
время соответствующего SDR. Изменение флажков во время RX автоматически
перезапускает тракт с новым планом.

Для multi-RX верхний статус также показывает минимальное `COV` среди monitor и
`AGE` самого старого использованного слоя. Покрытие считается по фактически
полученным частотным bins, поэтому потеря одного блока видна даже внутри завершённого
цикла. После секунды без IQ watchdog переводит SDR в `STALE`, исключает его слой,
очищает связанные частоты и аннотации. Если поток не восстановился за две секунды,
сессия завершается как `MULTI-RX FAULT` с причиной; старые обнаружения не продолжают
участвовать в тревогах.

Перед стартом pool Horizon открывает выбранные SDR и запрашивает их реальные RX
frequency ranges. Каждый участок назначается только приемнику, который полностью его
покрывает. Если хотя бы один monitor недоступен всем выбранным устройствам, RX не
запускается: строка состояния показывает номер непокрытого monitor. Это исключает
тихую работу системы с незаметной слепой зоной.

`Tools > Record IQ...` в multi-RX сохраняет контейнер `.hmiq`. Каждый блок содержит
serial SDR, сегмент и цикл sweep, центральную частоту, фактический sample rate и
монотонное время. `Pause display` не останавливает запись. Строка состояния
показывает объём и `DROP`; при росте DROP нужен более быстрый диск или меньший rate.
`Tools > Replay IQ...` открывает `.hmiq`, индексирует потоки без загрузки всего
файла в RAM и восстанавливает многоприёмный план. Блоки поступают в общий DSP по
записанным монотонным меткам времени и циклически воспроизводятся. `Pause display`
скрывает новые кадры, но временная позиция файла продолжает двигаться.

При классификации Horizon сначала проверяет подтверждённый SF, затем характерные
диапазоны и ширины Wi-Fi/GSM/LTE. Метка `FHSS` появляется только при отсутствии
более подходящего типа сигнала; одно перемещение пика по sweep-карте не считается
достаточным подтверждением канала управления.

## 18. Меню и рабочий профиль

### Файл

- `Открыть IQ...` — открыть `.hiq` или сырой CF32.
- `Выход` — сохранить профиль и закрыть программу.

### Правка

- `Настройки...` — Sample rate и Waterfall FFT.
- `Сбросить масштаб` — полный диапазон Spectrum/Waterfall.
- `Сбросить рабочий профиль` — удалить сохранённые параметры; применяется после
  перезапуска.

### Вид

Дублирует видимость инструментов, Monitors и Performance. Плавающие окна можно
перемещать, закреплять и закрывать.

### Справка

- `SDR runtime...` показывает найденные аппаратные библиотеки и factories.
- `Канал обновлений` выбирает `Stable` или `Beta`; выбор сохраняется.
- `Проверить обновления...` запрашивает манифест выбранного канала.

Проверка обновлений не останавливает RX и ничего не устанавливает автоматически.
Stable доступен анонимно. Beta активен только для связанного online-аккаунта с
`updates.beta`; Horizon обновляет короткоживущий access token непосредственно перед
запросом и не сохраняет его. Если Beta-доступ исчез, Horizon не подменяет запрос
анонимным Stable-каналом.

Пункт работает только в production-сборке со встроенным HTTPS endpoint вида
`/v1/releases/latest`, отдельным Ed25519 public key релизов и закреплённым SHA-256
сертификата издателя Horizon. Для
найденной версии доступны страница релиза и `Скачать и проверить`. Во втором случае
выберите путь: Horizon сначала загружает файл во временный staging, проверяет
подписанные размер и SHA-256, затем Windows Authenticode, цепочку и закреплённого
издателя, после чего повторно проверяет размер/SHA-256 и атомарно сохраняет файл.
Unsigned-файл и подпись другого издателя отклоняются. При отмене или любой ошибке
старый файл не заменяется. После успеха можно открыть папку; запуск EXE остаётся
ручным действием пользователя.

Сохраняются диапазоны, rate, FFT, режимы, мониторы, карта, зоны, внешние устройства,
раскладка. РЭР — В разработке: старые Session/Post/пути не включают скрытый инструмент;
секрет сессии не сохраняется.
Не восстанавливаются вооружёнными: AMP, TX, alarm, High threat, Auto DF, planner,
video, recording и Auto sync.

## 19. Встроенный симулятор

`RF scenario simulator [SIM-RF-0001]` создаёт:

- шесть независимых ELRS-подобных ППРЧ SF5–SF10 в диапазоне 2,4 ГГц;
- ELRS-подобные ППРЧ SF5/SF7/SF9 в диапазоне 868 МГц;
- ELRS-подобные ППРЧ SF6/SF8/SF10 в диапазоне 915 МГц;
- Wi-Fi-подобный burst 20 МГц на 2462 МГц;
- GSM-подобный сигнал около 947,4 МГц;
- analog-video-подобный сигнал на 5806 МГц.

У ППРЧ-источников различаются частота прыжков, длительность пакета и занимаемый
диапазон. Набор конкретного диапазона выбирается при настройке центральной частоты,
поэтому источники 2,4 ГГц не появляются при тестировании 868/915 МГц и наоборот.
Это детерминированные формы для проверки отображения и анализаторов, а не полные
протокольные кадры ELRS, Wi-Fi, GSM или аналогового видео.

Для rotator используйте `SIM-ROTATOR`.

## 20. Распределённая РЭР — В разработке

Функция скрыта для пользователей. Она не входит в готовые возможности бесплатной
Beta и не продаётся как готовый сервис. Экспериментальные протоколы обмена,
синхронизация наблюдений, облачные роли и объединение данных нескольких постов
требуют отдельной приёмки. TDoA требует синхронизированного оборудования и также
находится в разработке.

До открытия раздела нужны измерения минимум двух реальных разнесённых постов,
проверка UTC и погрешности часов, координат и калибровки антенн, отклонения ложных
сопоставлений, устойчивости обмена и защиты доступа. Проверки файлов/математики
на компьютере не заменяют эти полевые измерения.

## 21. Файлы и каталоги

- Инциденты: `Documents/Horizon/Incidents`.
- Журналы: `Documents/Horizon/Logs`.
- Видео: `Videos/Horizon/Video`, с fallback в Documents.
- Ручная IQ-запись: путь выбирает оператор.

Инцидент может содержать `incident.json`, `spectrum.png` и `capture.hiq`.

## 22. Термины

- **IQ** — комплексные отсчёты до FFT.
- **Sample rate** — IQ-отсчёты в секунду и мгновенная полоса.
- **FFT** — преобразование IQ в частотные бины.
- **SNR** — превышение над шумом.
- **SF** — spreading factor LoRa.
- **Pkt MHz** — мгновенная полоса пакета.
- **Range MHz** — весь занятый диапазон ППРЧ-трека.
- **Hop / Hops/s** — переход / оценка переходов в секунду.
- **Dwell** — время на одном канале.
- **Duty/Activity** — доля активности.
- **Fill** — спектральная заполненность.
- **Persistence** — устойчивость во времени.
- **AoA** — направление прихода.
- **TDoA** — разность времени прихода на синхронизированные посты.
- **RMS error** — среднеквадратичная невязка пеленгов.

## 23. Устранение проблем

### SDR не найден

Проверьте USB/питание, драйвер производителя и SoapySDR-модуль, остановите RX и
повторите поиск. Сначала проверьте SDR в фирменной утилите.

### Низкий FPS

Закройте Video и неиспользуемые инструменты, уменьшите FFT, выберите Balanced/Low
CPU и Fast sweep, уменьшите rate/диапазон, оставьте один monitor или скройте один
из основных графиков.

### Не видны короткие чирпы

Выберите Maximum quality, начните с FFT 4096–8192, сузьте диапазон, увеличьте
временную глубину и настройте Auto/Manual color. Проверьте IQ-запись: при sweep
источник мог передавать, когда SDR находился на другом сегменте.

### Время Waterfall кажется неправильным

Шкала показывает возраст сохранённых строк, не длительность файла. В sweep одна
строка полного диапазона составлена из временно разнесённых сегментов. Для точного
временного анализа сузьте диапазон до мгновенной полосы SDR.

### SF не определяется

Дайте несколько пакетов, проверьте SNR и отсутствие перегрузки, сузьте диапазон,
выберите Balanced/Deep и проверьте sample rate IQ-файла.

### Много ложных меток

Выключите Raw candidates, ждите CONFIRMED, отключите AMP при интермодуляции,
сузьте диапазон и сохраняйте IQ ложного события для улучшения детектора.

### Аналоговое видео не синхронизируется

Проверьте PAL/NTSC, частоту, непрерывный 20 MS/s RX и возможности SDR. Отключите
AMP при перегрузке.

### Карта показывает неверную ручную позицию

Проверьте введённые широту, долготу и высоту. GPS и пеленгация скрыты в текущей Beta.
