INAV: полезные настройки «только в CLI» — кандидаты на тумблеры (AD-690)
Статус: research / discovery, не решение о реализации. Документ обосновывает
список настроек, которые в официальном INAV Configurator доступны только через
CLI (set X = ...), но при этом полезны обычному пилоту и безопасны, чтобы
вывести их в нашем веб-туле «Инструменты → INAV» тумблерами/полями. Код тула
(web/static/js/tools/inav_msp.js, роуты, шаблоны) в рамках этого тикета не
трогаем — только исследование и этот файл.
0. Зачем это нужно
Официальный INAV Configurator сознательно не выносит в GUI часть параметров: их
меняют командой set <имя> = <значение> на вкладке CLI. Документация INAV прямо
говорит, что «GUI не умеет настраивать всё; часть фич включается/настраивается
только через CLI» (см. docs/Cli.md). Среди «спрятанных» параметров есть простые
и полезные — например одометр (stats), часовой пояс для логов (tz_offset),
выбор GNSS-созвездий. Наш тул может стать удобнее официального, показав их
понятными тумблерами — новичку не придётся лезть в CLI и знать точное имя команды.
Цель ресёрча: составить обоснованный список кандидатов с указанием, что делает
настройка, есть ли она в GUI Configurator, каким каналом MSP до неё дотянуться и
стоит ли выводить (риск/польза).
1. Модель доступа: почему «CLI-only» ≠ «недоступно по MSP»
Ключевой факт для реализации. В INAV каждый параметр set X зарегистрирован в
общей таблице настроек (src/main/fc/settings.yaml → генерится в таблицу
settings_t). Любой параметр из этой таблицы читается и пишется по MSP по имени
через общие команды протокола MSP v2 (src/main/msp/msp_protocol_v2_common.h):
| Команда | Opcode | Назначение |
|---|---|---|
MSP2_COMMON_SETTING |
0x1003 |
прочитать значение настройки (по имени или индексу) |
MSP2_COMMON_SET_SETTING |
0x1004 |
записать значение настройки |
MSP2_COMMON_SETTING_INFO |
0x1007 |
метаданные настройки: PG, тип, min/max, enum-таблица |
MSP2_COMMON_TZ / SET_TZ |
0x1001 / 0x1002 |
выделенные get/set часового пояса (i16, минуты) |
Отсюда следствия для нас:
- «CLI-only» в Configurator означает лишь «не выведено в GUI», а НЕ «недоступно
программно». Почти любой такой параметр мы можем читать/писать по MSP
0x1003/0x1004— ровно так, как наш тул уже делает для блока GPS
(GPS_CONFIG_SETTINGSвinav_msp.js: список{name, key, kind}, значение по
имени черезMSP2_COMMON_SETTING). То есть добавить тумблер = добавить запись в
такой список + элемент UI. Минимум кода, минимум риска. - Клиент обязан знать тип/размер значения заранее (u8/i16/bool/enum-таблица) —
MSP2_COMMON_SETTINGотдаёт «сырые» байты без типа. Тип можно либо захардкодить
(как сейчас у GPS), либо запрашивать динамически черезMSP2_COMMON_SETTING_INFO
(0x1007) — им же пользуется сам Configurator. - У части настроек есть выделенные типизированные MSP-сообщения — их и стоит
предпочесть, если они уже реализованы: имя борта →MSP_NAME/MSP_SET_NAME
(10/11), маска фич →MSP_FEATURE/SET_FEATURE(36/37), часовой пояс →
MSP2_COMMON_TZ/SET_TZ(0x1001/0x1002). - Настоящий CLI-passthrough (слать литеральную строку
set x = yв текстовый
#-режим) для скалярных тумблеров из этого документа не нужен — это запасной
путь. В туле он уже есть (AD-619/AD-623, бэкап/восстановлениеdiff all), но для
наших кандидатов он избыточен: везде хватаетMSP2_COMMON_SETTING.
Вывод: колонка «Доступ» ниже почти всегда — MSP по имени (0x1003/0x1004),
что позволяет делать честный двусторонний тумблер (прочитал текущее → показал →
записал новое), а не «слепой» CLI-set.
2. Таблица кандидатов
Данные (имя, дефолт, диапазон, тип) сверены по src/main/fc/settings.yaml INAV
9.1.0 (ветка master, получено 2026-07-18). Описания — свои, пересказ смысла
(clean-room, см. §5). «В GUI?» — по знанию официального Configurator (5.x/8.x/9.x);
где не уверен — помечено требует проверки.
| Настройка | Что делает | Дефолт / значения | В GUI Configurator? | Доступ | Выводить? |
|---|---|---|---|---|---|
stats |
Мастер-выключатель записи статистики полётов (одометр): суммарный налёт/дистанция/энергия/число полётов, обновляется при каждом disarm | OFF, bool |
Нет (только CLI) | MSP по имени 0x1003/0x1004 (bool) |
Да — флагман |
stats_total_time |
Суммарный налёт за всё время, сек (read-only-накопитель) | 0, u32 |
Нет (виден лишь на пост-флайт экране OSD) | MSP по имени (u32) | Да — показ + сброс |
stats_total_dist |
Суммарная дистанция за всё время, м | 0, u32 |
Нет | MSP по имени (u32) | Да — показ + сброс |
stats_total_energy |
Суммарный расход энергии, мВт·ч (нужен датчик тока, USE_ADC) |
0, u32 |
Нет | MSP по имени (u32) | Да — показ + сброс |
stats_flight_count |
Число полётов за всё время | 0, u16 |
Нет | MSP по имени (u16) | Да — показ + сброс |
tz_offset |
Смещение часового пояса от UTC (мин) — для меток времени GPS и Blackbox-логов | 0, −720…840 |
Нет (требует проверки) | Выделенный MSP MSP2_COMMON_TZ/SET_TZ 0x1001/0x1002 (i16) |
Да |
tz_automatic_dst |
Авто-переход на летнее время | OFF / EU / USA |
Нет (требует проверки) | MSP по имени (u8/enum) | Да (в паре с tz_offset) |
gps_ublox_use_beidou |
Использовать спутники BeiDou (за счёт других региональных созвездий) | ON, bool |
Нет | MSP по имени (bool) | Да — рядом с уже выведенным galileo |
gps_ublox_use_glonass |
Использовать спутники GLONASS | OFF, bool |
Нет | MSP по имени (bool) | Да — рядом с galileo |
small_angle |
Макс. наклон платы (град.), при котором ещё разрешён arming; выше — arming блокируется | 25, 0…180 |
Нет | MSP по имени (u8) | Да — полезно для наклонного/ручного старта |
failsafe_min_distance |
Если failsafe случился ближе этой дистанции от дома (см) — выполняется отдельная процедура (см. ниже), а не обычная | 0 (выкл.), 0…65000 |
Нет (требует проверки) | MSP по имени (u16) | Вторая волна (safety-нюанс) |
failsafe_min_distance_procedure |
Что делать при failsafe вблизи дома | DROP / LAND / RTH / NONE |
Нет (требует проверки) | MSP по имени (u8/enum) | Вторая волна (в паре с ↑) |
nav_extra_arming_safety |
Блокировка arming без GPS-фикса, когда настроены nav-режимы; ALLOW_BYPASS — можно обойти стиком |
ALLOW_BYPASS / ON |
Требует проверки (возможно есть в nav-разделе) | MSP по имени (u8/enum) | Вторая волна (safety) |
airmode_type / airmode_throttle_threshold |
Тип поведения Airmode (STICK_CENTER / THROTTLE_THRESHOLD) и порог газа | STICK_CENTER / 1150 |
Нет | MSP по имени (u8 / u16) | Вторая волна (тюнинг) |
osd_home_position_arm_screen |
Показывать координаты дома на экране arming | ON, bool |
Требует проверки (может быть на вкладке OSD) | MSP по имени (bool) | Нет (низкая ценность) |
pilot_name |
Имя пилота (персонализация/OSD) | "", строка |
Да — вкладка OSD (добавлено PR-ом в Configurator) | MSP по имени (строка) | Нет — уже в GUI |
name |
Имя борта (craft name) | "", строка |
Да — вкладка OSD (перенесено из Configuration в Configurator 5.0) | Выделенный MSP_NAME/SET_NAME (уже в туле) |
Нет — уже в GUI и в туле |
i2c_speed |
Тактовая частота шины I2C датчиков | 400KHZ / 100/200/800 |
Нет | MSP по имени (u8/enum) | Нет — риск отвалить сенсоры |
debug_mode |
Отладочные значения в debug-переменные | NONE, enum |
Нет | MSP по имени | Нет — только для разработчиков |
applied_defaults, model_preview_type |
Внутренние хинты Configurator («не менять вручную») | — | Нет | — | Нет — служебные |
3. Первая волна (рекомендованный минимум)
Критерий отбора: максимум пользы обычному пилоту при минимуме риска, все —
двусторонние (читаем текущее → пишем новое) через уже существующий в туле механизм
«настройка по имени» (MSP2_COMMON_SETTING/SET_SETTING). Ни один пункт не трогает
управление/моторы/ESC/шины.
-
Одометр —
stats+ панельstats_total_*. Флагманская фича.
-stats— тумблер ON/OFF (bool), MSP по имени.
-stats_total_time/stats_total_dist/stats_total_energy/
stats_flight_count— блок «Наработка борта»: read-only показ (перевести в
ч/км/мА·ч/шт.) + кнопка «Сбросить» (запись0в каждый). MSP по имени.
- ⚠️ Тонкость для тултипа: при включённомstatsINAV сохраняет конфиг в EEPROM
при каждом disarm. Побочный эффект — заодно фиксируются изменения, сделанные
в полёте RC-adjustments (PID, board alignment). Это нормальное поведение, но
пользователя стоит предупредить одной строкой. -
Часовой пояс логов —
tz_offset(+tz_automatic_dst). Прямо усиливает наш
раздел flight-logs: без него метки времени в Blackbox/GPS идут по UTC.
tz_offsetимеет выделенную типизированную командуMSP2_COMMON_TZ/SET_TZ
(0x1001/0x1002, i16 минут) — самый надёжный путь;tz_automatic_dst— по имени
(enum OFF/EU/USA). -
GNSS-созвездия —
gps_ublox_use_beidou,gps_ublox_use_glonass. Логичное
дополнение к уже выведенномуgps_ublox_use_galileo: два bool-тумблера в тот же
GPS-блок (GPS_CONFIG_SETTINGS). Помогает добрать спутники в своём регионе. -
small_angle— макс. угол arming. Одно числовое поле (0…180°, дефолт 25).
Реально нужно при пуске с наклонной поверхности / ручном старте крыла, когда борт
стоит под углом и отказывается армиться. Безопасно, MSP по имени.
Все четыре пункта укладываются в существующий паттерн GPS_CONFIG_SETTINGS
(inav_msp.js) — новый код минимален: описания настроек + элементы UI. Отдельных
MSP-команд писать не нужно, кроме опционального использования MSP2_COMMON_TZ для
tz_offset.
Вторая волна (после первой, требует аккуратности): failsafe-нюансы
(failsafe_min_distance + _procedure), nav_extra_arming_safety, Airmode
(airmode_type / airmode_throttle_threshold) — полезны, но это safety/тюнинг,
нужен более осторожный UI и предупреждения; и часть требует проверки наличия в GUI.
Явно НЕ выводить: i2c_speed, debug_mode, applied_defaults,
model_preview_type, motor_pwm_protocol, throttle_idle — опасно/служебно/уже в
GUI. name и pilot_name уже есть в официальном GUI (вкладка OSD) и/или в нашем
туле — не «спрятанные».
4. Мини-чеклист для реализующего тикета (не в этом тикете)
- [ ] Для каждого параметра первой волны — знать точный тип/размер (см. таблицу)
либо тянуть его черезMSP2_COMMON_SETTING_INFO(0x1007). - [ ]
stats_total_*— только чтение + явная кнопка сброса (не редактируемое поле). - [ ] Тултип-предупреждение про EEPROM-сохранение при
stats = ON. - [ ]
tz_offset— предпочесть выделенныйMSP2_COMMON_TZ/SET_TZ. - [ ] Проверить на живом борте наличие/отсутствие
tz_*,failsafe_min_distance*,
nav_extra_arming_safety,osd_home_position_arm_screenв текущем GUI
Configurator (снять пометки «требует проверки»). - [ ] Неизвестные enum-коды не терять (показывать «код N»), как уже сделано для
serialrx-провайдера/GPS.
5. Источники и clean-room
Исходники INAV читались только для понимания фактов (имена параметров, дефолты,
диапазоны, номера MSP-команд) — это API/данные, не творческий код. GPLv3-код в наш
репозиторий и тул не копировался; все описания настроек написаны своими словами.
Источники (INAV, ветка master = 9.1.0, получено 2026-07-18):
src/main/fc/settings.yaml— полный списокset-параметров, дефолты, диапазоны,
enum-таблицы. Ключевые строки:stats*— 3974–3996;name/pilot_name—
3945–3956;tz_offset/tz_automatic_dst— 4001–4010 (+ таблица DST 111–113);
gps_ublox_use_beidou/glonass/galileo— 1758–1772;small_angle— 1553–1557;
failsafe_min_distance*— 910–918;nav_extra_arming_safety— 2574–2578;
airmode_*— 1818–1828;i2c_speed— 3924–3928;applied_defaults— 1615–1621;
model_preview_type— 1250–1255.src/main/msp/msp_protocol_v2_common.h— opcodes MSP v2:MSP2_COMMON_TZ0x1001,
SET_TZ0x1002,SETTING0x1003,SET_SETTING0x1004,SETTING_INFO0x1007.CMakeLists.txt—project(INAV VERSION 9.1.0).docs/Cli.md(INAV) — подтверждение, что часть настроек доступна только через CLI.- Наш тул
web/static/js/tools/inav_msp.js— существующий паттерн «настройка по
имени» (GPS_CONFIG_SETTINGS,MSP2_COMMON_SETTING) и CLI-passthrough
(AD-619/AD-623) как база для реализации. - Проверка наличия в GUI: релиз-ноты INAV Configurator 5.0 (перенос craft name в
OSD) и PR добавленияpilot_nameв OSD-вкладку; фича-реквесты по выводу
stats_total_*в OSD/GUI.