Files
utun2/doc/device_calls.txt
T

55 lines
5.6 KiB
Plaintext

Вызов подгруппы устройств: звонок и приглашение в рацию
Цель задаётся устройством и явным флагом devices. В потоке ядра выбираются все
проверенные участники его devgroup в выбранном CHAT-канале, с живым BGP-маршрутом,
кроме собственного узла. Имя группы не является идентификатором. Снимок адресатов
фиксируется при старте; максимум 64, превышение отклоняется без частичной рассылки.
Одиночный вызов использует тот же протокол выбора с одним адресатом. DM остаётся адресным.
Первый ACCEPT, обработанный инициатором, фиксирует победителя. Ручной DECLINE,
полученный раньше выбора, завершает всю попытку. BUSY, POLICY, PHONE_BUSY и потеря
маршрута относятся только к отдельному устройству. PHONE_BUSY требует решения
инициатора только когда не осталось других потенциальных адресатов.
После выбора поздние ответы проигравших не меняют победителя; повторного выбора нет.
Отмена инициатором завершает также подключение выбранного устройства.
Обычный звонок: INVITE -> RINGING -> ACCEPT -> SELECT -> SELECTED -> ACTIVE.
ACCEPT выражает решение пользователя, SELECT разрешает подключение только победителю.
До SELECT вызываемый остаётся ANSWERING без медиа. Инициатор переходит из SELECTING
в ACTIVE после SELECTED. ACCEPT и SELECT повторяются каждые 300мс; повтор SELECT
в ACTIVE повторяет SELECTED. Общий deadline приглашения 60с не продлевается.
Финальные команды и подтверждения обслуживаются отдельно для каждого адресата.
Ранний CANCEL сохраняет закрытый tuple (id, group, peer), чтобы поздний INVITE
не создал новый рингтон. Медиа принимает только выбранный peer.
CALL_ACCEPTED: call_id:8, reason:1=0, actual_peer:8 (native endian).
Рация: START -> INCOMING/READY -> ANSWER -> ANSWERING -> SELECTED -> ACCEPT/FAIL.
ANSWER — кнопка пользователя (wire RC_ACCEPT), ACCEPT — фактическая готовность
рации после SELECTED. На проводе RC_SELECT повторяется до RESULT/ACK.
Рация, уже включённая в канале, тоже получает уведомление и сигнал вызова.
Автоматического ответа ALREADY_ACTIVE больше нет. Приглашение не делает рацию
приватной: это по-прежнему общий PTT-канал. Финальный отбой не выключает ранее
работавшую рацию. Отменённая незавершённая активация освобождает только ресурсы
своего ID; ручной/новый запуск меняет владельца и защищён от старого callback.
После успешного приглашения рация продолжает обычную работу независимо от него.
UI: заголовок подгруппы запускает devices, строка устройства — адресный вызов.
Один исходящий вызов и один итог для пользователя. После выбора показывается
фактический peer. Линия занята всей попыткой, не отдельными адресатами.
Ядро/сеть сериализованы в uasync; GUI передаёт только значения команд.
Headless control:
call_start: прежние ch/node_id/call_id, дополнительно devices:1.
radio_call: action, call_id (hex); START также ch (decimal), node_id (hex), devices:0/1.
action: 1 START, 2 READY, 3 ACCEPT, 4 DECLINE, 5 CANCEL, 6 FAIL, 7 REJECT_BUSY,
8 CONTINUE, 9 ANSWER. START без call_id генерирует его. Событие radio_call содержит
call_id/ch/peer/state/reason/incoming. state: 1 OUTGOING, 2 INCOMING, 3 RINGING,
4 FINISHED, 5 WAIT_DECISION, 6 ANSWERING, 7 SELECTED. После SELECTED клиент включает
рацию через radio_on и отправляет ACCEPT либо FAIL. Финальный reason=9 означает POLICY.
Диагностика: категории call/radio. INFO — адресаты, выбор, результат и отбой;
DEBUG — подтверждения отдельных адресатов. Ошибки отправки/таймеров/активации
логируются. Для сетевых проверок: test_call_admission и test_radio (три узла,
подписанная devgroup, два ответа, потеря SELECT/SELECTED, отказ всей подгруппе,
уже включённая рация и отбой до завершения активации).