# Roadmap Живой план. Не обязательства, а список идей по приоритету. Отметки: ✅ готово · 🔜 ближайшее · 💡 идея. Актуально на **v0.11.0** (2026-08-03). История версий — в [CHANGELOG.md](CHANGELOG.md). ## ✅ Сделано **Ядро (v0.1–v0.2)** - Заряд «беречь ~80% / полный» через WMI + ChargeGuard (держится после сна/смены питания). - Режимы производительности, трей + тёмное меню (следует теме на лету), автозапуск. - OSD (питание, режимы, заряд), динамический значок трея по режиму. - Авторские SVG-иконки (OSD цветные + трей монохром), рендер Svg.NET, app.ico. - GitHub + CI-релизы по тегу (self-contained + framework-dependent exe). **Клавиши (v0.3–v0.5)** - Mi-кнопка: клик = цикл режимов, двойной клик = заряд 80/100, удержание = панель; при открытой панели жесты работают внутри неё. Раскладка и двойной клик настраиваются. - «Настройки» (`0x1B`): заряд 80/100 (ремап на Параметры Windows), «Проекция» (`0x01`) → Win+P, AI (`0x23`) → Copilot или своя программа (`AiKeyProgram`), микрофон (`0x21`) → системный mute + OSD, подсветка (`0x05`) → OSD с уровнями (4 иконки), **Fn-Lock (`0x07`) → OSD с замком** (v0.5.3). - Скрытый режим **Эко (`0x0A`)** — найден и подтверждён; Эко и Полную мощность можно скрыть. - Панель: 5 режимов, анимации иконок (алгоритмические, 0% CPU в простое), Esc-хоткей. - Подменю «Настройки» в меню трея: язык (RU/EN/ZH), автозапуск, галочки всех опций. - README со скриншотами, LICENSE (GPLv3), CHANGELOG, документация протокола (две таблицы MIFS). **Комфорт (v0.6+)** - **«Режим совы»** — не гасить экран/не спать; закрытая крышка на сети только гасит экран (v0.6). - **«Монитор»** — плавающий виджет: живые графики потребления (Вт), CPU %, RAM % (v0.7). - **Режим при старте** — восстанавливать последний режим после перезагрузки или закрепить фиксированный (прошивка сбрасывает режим на ребуте) (v0.7). - Иконка языка в меню + **выбор языка по языку ОС при первом старте** (v0.7). - **Авто-герцовка** — 120 Гц от сети / 60 Гц от батареи (настраивается), переключатель в меню и панели; чистый Win32 `ChangeDisplaySettings` (v0.7.0). - **Профили питания** — свой режим производительности при зарядке и от батареи (выбор в меню, «не менять»); яркость экрана запоминается и восстанавливается для каждого состояния. Взаимоисключающе с «Режимом при старте». Driver-free: режим — WMI-прошивка (`0x08`), яркость — WMI `WmiMonitorBrightness*` (ACPI-подсветка, тот же канал, что у Windows). Паттерн гарда (событие питания + дебаунс), как у авто-герцовки (v0.7.0). - **Режим «В дорогу»** — временный заряд до 100% поверх «беречь 80%» (ячейка в панели + пункт меню); по достижении 100% OSD + джингл, авто-сброс при отключении зарядника. Двухстатусная иконка-чемодан с мигающей молнией; 100% ловится лёгким опросом `BatteryLifePercent` (v0.7.0). - **Тачпад вкл/выкл** — действие для клавиш + ячейка в панели (левее герцовки) + OSD. Чистый SetupAPI/CfgMgr32: отключается родительский узел «HID на шине I2C», как в Диспетчере устройств; без флага PERSIST — после перезагрузки тачпад всегда включён (v0.7.0). - **Окно «Настройки»** в стиле Win11 — все опции по вкладкам (Общие/Батарея/Экран/ Производительность/Клавиши/О программе), заменяет длинное подменю трея; тёмная/светлая тема, ноль фоновой нагрузки (живёт только пока открыто). Частоты герцовки и AI-программа теперь настраиваются из UI (v0.7.0). - **Переназначение клавиш** — каждой клавише своё действие (клик/двойной Mi, «Настройки», AI, «Проекция»): наши функции, системные Win+P/Параметры/Copilot, запуск программы, «Ничего»; миграция со старых опций автоматическая (v0.7.0). - **«Запоминать яркость» отвязана от профилей** — самостоятельная опция в «Общих» (v0.7.0). - **Мониторинг температуры** — строка-график «горячей точки» в «Мониторе» (полный вид). Driver-free через Intel DPTF: WMI `root\wmi\EsifDeviceInformation`, `.Temperature` уже в °C, берём максимум среди активных доменов. Ранее числился закрытым как «невозможно» — переоткрыт на проверенном сигнале (см. ниже). Горячая зона графика подсвечивается вишнёвым (порог от ACPI `CriticalTripPoint`) (v0.7.0). - **Загрузка GPU в «Мониторе»** — ряд между CPU и RAM: процент + график, под ним частота и мощность (`2450 МГц · 21.4 Вт`); в мини-виде только процент. Driver-free через **Intel IGCL** — user-mode API графического драйвера (`ControlLib.dll` из System32, прав администратора не нужно даже на чтение): один `ctlPowerTelemetryGet`, загрузка и ватты считаются как приращения накопительных счётчиков. Не Intel → ряда просто нет. Разбор и замеры — [docs/09-power-monitoring.md](docs/09-power-monitoring.md) (XIC-18, v0.9.0). - **Сенсорный экран вкл/выкл** — то же, что тачпад, для тач-экрана ноутбука: действие для клавиш + ячейка в панели (левее тачпада, только если тачскрин есть) + OSD. Общая база `HidNodeToggle` (тачпад `U:0005`, тачскрин `U:0004`). Вклад контрибьютора (PR #4) (v0.7.0). - **Мощность зарядника (ADPW)** — прошивка отдаёт номинал PD-адаптера в Вт (MIFS `0x10/06`): ватты в зарядном OSD и строкой в «Мониторе». Плюс **бейдж-оверлей** поверх иконки заряда — красный «!» для слабого (ниже порога), серый «?» для не-PD (`ADPW=0`); база иконки при этом несёт лимит 80/100. Порог настраивается. Ранее «авто-детект слабой зарядки» был закрыт (нет сигнала) — ADPW его открыл (v0.7.0). - **Здоровье батареи** — панель в Настройках → Батарея: износ (текущая/проектная ёмкость), число циклов, ёмкость Вт·ч — штатные WMI-классы ACPI (`BatteryStaticData`/`BatteryFullChargedCapacity`/ `BatteryCycleCount`) + прошивочный SOH1 (`0x10/01`) как фолбэк. Driver-free, только чтение (v0.7.0). - **Живая мощность в «Мониторе»** — чтение через штатный Battery API (`IOCTL_BATTERY_QUERY_STATUS`) вместо WMI `BatteryStatus`: IOCTL опрашивает `_BST` в момент вызова, показания не «застывают» без сторонних поллеров (HWiNFO). Знаковый `Rate`. WMI остался фолбэком (v0.7.0). - **Вкладка «Функции» + управление частотой как фича** — отдельная вкладка настроек «что показывать»: переключатели доступности совы, тачпада, сенсорного экрана (переехали из «Общих») и новый мастер-тумблер «Управление частотой экрана» (`RefreshRateFeature`). Выключенная фича исчезает из меню/панели/вкладки «Экран» целиком; активная авто-герцовка при этом гасится (v0.7.0). - **Настраиваемые тайминги в config.json** — `MiHoldMs` (удержание Mi-кнопки), `MiDoubleClickMs` (окно двойного клика), `OsdDurationMs` (длительность OSD); дефолты = прежним значениям, правятся вручную (v0.7.0). - **HTTP API для локальной сети** — опциональный веб-API (телефон / Home Assistant): `GET /status` (режим, заряд, батарея) + `POST /mode|care|travel|owl`. Хост на `HttpListener` (без второго рантайма), по умолчанию выключен → 0 CPU; bind `127.0.0.1`, доступ из сети — отдельным тумблером с firewall-правилом LocalSubnet. Токен хранится SHA-256, белый список команд, настройки в ProgramData под ACL (правкой config.json API не включить). Вкладка «HTTP API» в настройках (v0.7.0). - **Выбор порога заряда (40/50/60/70/80/100%)** — 🎉 переоткрыто 2026-07-29: `MIFS 0x10/0x02` оказался многоуровневым, не бинарным (см. [docs/12-charge-levels.md](docs/12-charge-levels.md)). Пикер порога — Настройки → Батарея; панель — бинарный тумблер «X% / 100%»; везде реальный %, не хардкод 80; `ChargeGuard` переармливает выбранный код; на моделях без granular — деградация к 80/100 (прошивка сама валидирует набор, отказ → откат выбора + честная ошибка). Driver-free, тем же каналом (XIC-4, v0.8.0). Отсечка на 40–70% подтверждена железом: при 66% заряда лимит 70 — ток идёт, 60/50/40 — ток в ноль. - **«Удерживать частоту»** — авто-герцовка возвращает заданную частоту, если режим экрана сменил кто-то извне (параметры Windows, чужая утилита, драйвер после сброса). Раньше гард просыпался только на события питания, и настройка тихо не держалась до следующего втыкания зарядки. Отдельный шов `IDisplayEvents` на общей реализации `SystemEventsSource` (одно окно-маршалер на питание и экран); опроса нет — только событие `DisplaySettingsChanged` через тот же дебаунс. Opt-in, по умолчанию выключено; тумблер гаснет, пока авто-частота выключена (XIC-22, v0.10.0). - **Мёртвая зона у нижнего края тачпада** — вкладка настроек «Тачпад»: тумблер + высота полосы (8/10/12/15/20 мм, дефолт 12) против ложных срабатываний от лежащей ладони. Driver-free: штатная curtain-зона Windows PTP (`SuperCurtainBottom`, himetric), применяется рестартом узла тачпада — без перезахода в сеанс. Гасится **начало** касания: жест, начатый выше, доходит до низа, а нажатие в зоне срабатывает (проверено вживую; зонально подавить нажатие штатно нельзя, см. «Закрытые вопросы») (XIC-24, v0.10.0). - **Авто-герцовка правит встроенную панель, а не основной экран** — `EnumDisplaySettings`/ `ChangeDisplaySettings` с `null` адресуют ОСНОВНОЙ дисплей: назначил пользователь основным внешний монитор — и отключение зарядки уводило на пониженную частоту его, а панель ноутбука оставалась на 120 Гц. Панель теперь ищется явно через CCD (`QueryDisplayConfig`, признак `DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL`), имя перечитывается каждый раз — при переподключении монитора GDI-имена перетасовываются. Панели нет среди активных путей → не трогаем ничего (XIC-21, v0.10.0). - **Пояснение к порогу «беречь батарею»** — под выбором уровня в Настройки → Батарея заметка «для кого этот уровень», меняющаяся вместе с выбором: 40–50% «ноутбук вместо десктопа», 60–70% «компромисс», 80% «баланс». Часы автономной работы намеренно не обещаем — зависят от яркости, режима и нагрузки (XIC-25, v0.10.0). - **Автозапуск — своя задача на пользователя** — имя включает SID (`XiControl_`): раньше задача была одна на машину, и второй пользователь, включив автозапуск, перезаписывал задачу первого. Задача старого образца распознаётся и мигрирует при следующем переключении; чужая не трогается никогда. Самопочинка теперь ловит и устаревшую версию exe (типовой portable-случай «запускаемся из новой папки»), дев-сборки `0.0.0` в сверке не участвуют. Добавлен триггер `ConsoleConnect` — быстрое переключение пользователей не является входом в систему (XIC-23, v0.10.0). - **Проверка обновлений** — раз в сутки один запрос к GitHub `/releases/latest` (эндпоинт сам отсекает скользящий `pre`), тост со ссылкой на релиз один раз на версию и отметка на вкладке «О программе». Самообновления нет намеренно: запущенный exe не перезаписать, любое «обновить сейчас» потребовало бы сторожевого процесса. Тумблер в «Общих» = выключатель трафика: выключен — ни одного сетевого запроса (XIC-20, v0.10.0). - **Кнопка «Buy me a coffee»** — отдельной карточкой «Поддержать проект» внизу вкладки «О программе». Официальный фирменный ассет (`assets/svg/ui/`), рендерится через `SvgIcons.RenderByHeight` с сохранением пропорций; клик открывает страницу автора. Никаких сборов внутри приложения, только внешняя ссылка (XIC-26, v0.10.0). - **Мультимедиа и калькулятор в действиях клавиш** — на любой слот (Mi-кнопка, AI, «Настройки», «Проекция») вешаются воспроизведение/пауза, следующий/предыдущий трек, остановка и калькулятор. Реализация — синтез медиа-VK (`keybd_event`): клавишу получает владелец медиа-сессии Windows, работает с любым плеером без интеграций. Калькулятор — тоже клавишей (`VK_LAUNCH_APP2`), а не `Process.Start`: мы elevated, а UWP-калькулятор должен открыться от имени пользователя. Громкость намеренно не добавляли — на клавиатуре есть отдельные кнопки (XIC-27, v0.11.0). - **Настраиваемое удержание Mi-кнопки** — долгое нажатие стало обычным слотом с общим списком действий (раньше было зашито на быструю панель). Старые конфиги ведут себя как прежде (миграция дефолтом «panel»); «Ничего» гасит жест целиком — долгое нажатие отрабатывает как одиночный клик, а не пропадает (XIC-28, v0.11.0). - **Сведения о железе на «О программе»** — модель с кодом платы («Xiaomi Book Pro 14 (TM2424)» — в отчётах о совместимости важен именно код), BIOS с датой, серийный номер. Серийник по умолчанию замаскирован (видны последние 4 знака, клик раскрывает): скриншот вкладки уходит в тему совместимости, уникальному идентификатору там не место. WMI-чтение — один раз за сеанс, лениво, вне конструктора вкладки (XIC-3, v0.11.0). - **Юнит-тесты UI-краёв** — чистая навигация вынесена в `UiNav` (порядок обхода ячеек панели, циклический фокус стрелками, клэмп вкладки настроек) и накрыта тестами; заодно закрыты края «деление на ноль при пустом обходе» и «мусорный индекс вкладки» (XIC-9, v0.11.0). - **Лимит яркости экрана** — два лимита (сеть/батарея) в Настройки → Экран: превышение плавно (~10 с, 1%-шагами) сводится к лимиту «вежливым торгом» — раз в минуту разрыв половинится, остаток ≤2% доводится сразу; повторный подъём после нашего шага = пауза 2 часа (сброс блокировкой, сном, сменой питания). Мотивация — OLED-панель. Заблокировать ползунок Windows нельзя — только вернуть после факта, о чём честно сказано в настройке. С адаптивной яркостью не работает (детект `powrprof.dll`, плашка с причиной). «Запоминать яркость» хранит намерение: превышение лимита не запоминается вообще, восстановление клампится. Свои WMI-записи отличаются от пользовательских по меткам значений с TTL (события дублируются — выяснено вживую). Вкладка «Экран» теперь видна всегда; фича частоты скрывает только свой раздел (XIC-29, v0.11.0). ## 🔜 Ближайшее - Зафиксированных ближайших задач нет — см. «Идеи» ниже. ## 💡 Идеи - Камера/приватность (`0xA0` из карты MIControl) — на TM2424 событие не замечено, ждём тестеров. ## ❓ Открытые вопросы - Fn отдельным кодом не приходит → комбинации с Fn недоступны (обходим жестами Mi). - Набор уровней порога заряда на ДРУГИХ моделях — на TM2424 это 40/50/60/70/80/100% ([docs/12](docs/12-charge-levels.md)); read-only запроса набора в MIFS нет, поэтому неподдержка выясняется попыткой (отказ → откат выбора); ждём отчётов тестеров с других моделей. ## ✔ Закрытые вопросы - **Отключить НАЖАТИЕ в мёртвой зоне тачпада** — driver-free невозможно (проверено 2026-08-01). В документации PTP-тюнинга нет ни одного зонального параметра для кнопки: curtain/super-curtain подавляют «taps and mouse moves», состояние кнопки в них не входит — и это подтвердил эксперимент (в зоне не начинается касание, но продавливание проходит). Единственная штатная ручка про клик — `ClickForceSensitivity` → HID feature «Button Press Threshold» (`0x0D/0xB0`, Win11 26027+), и она **глобальная, а не зональная**; к тому же наше железо её не поддерживает: в дескрипторе `COL02` только feature `0x0D/0x59` (Pad Type), `0x0D/0x55` (Contact Count Max) и вендорский `0xFF00/0xC5`, коллекции Haptics (`0x0E`) нет вовсе — то есть `FeedbackEnabled`/`FeedbackIntensity` у нас ни на что не влияют, а пэд не haptic в смысле Windows. Остаётся только RE вендорского канала (`0xFF00/0xC5` report 6, коллекции `COL04`/`COL05`) — отдельная задача, если понадобится. - WMI `0x0C` — рудиментный слот TPLock игровой таблицы MIFS: флаг хранится, к железу на TM2424 не подключён. Не используем. Детали: [docs/01-wmi-protocol.md](docs/01-wmi-protocol.md). - Управление кулером сверх режимов — на TM2424 отсутствует (полный свип `0x01..0x30`: `0x14/0x15` макс. кулер и `0x17` CPU power — `0xE0`). - **Ограничение TDP в ваттах (CPU/iGPU)** — driver-free невозможно: команды лимита мощности в MIFS нет (`0x17`=`0xE0`), реальные PL держит Intel DTT/ACPI, а произвольные ватты — только запись RAPL MSR = kernel-драйвер. Проверено на TM2424. Детали: [docs/05-open-questions.md](docs/05-open-questions.md). - **Мониторинг температур** — ✅ **переоткрыт и сделан driver-free** (см. «Сделано»). Тупиковыми оказались MIFS (`0xE0`) и ACPI-зона `\_TZ.TZ00` (`MSAcpi_ThermalZoneTemperature` — капризна, не отражает CPU). Рабочий путь — **Intel DPTF**: WMI `root\wmi\EsifDeviceInformation` отдаёт `.Temperature` (°C) по доменам, провайдер идёт со штатными драйверами Intel. Проверено на TM2424: в бенче показания растут до ~90 °C синхронно с нагрузкой. per-core/PCH через MSR по-прежнему не берём (драйвер). ## 🚫 Не берём - Ручной цикл частоты экрана по клавише — не нужна: висела «если попросят», запросов не было, авто-герцовка по питанию покрывает сценарий (XIC-2 отменена; вернёмся, если попросят тестеры). - ICC-профили, splash-скины, служба + named pipe + protobuf (архитектура MIControl). - **Обороты вентиляторов** — WMI на нашей модели не отдаёт, EC закрыт своим драйвером; в Intel IGCL `ctlEnumFans` на встроенном GPU тоже отказ (это путь для дискретных Arc, как и `ctlEnumTemperatureSensors`). GPU-**режим** (переключение/профили самого GPU) — тоже нет. При этом **телеметрия** iGPU ✅ **сделана** driver-free через IGCL (загрузка/ватты/частота, см. «Сделано»), а температуры — через DPTF; так что «GPU не отдаётся» больше не верно целиком. - WinRing0 / прямой доступ к EC — цель проекта в том, чтобы обойтись без них. - Lottie-анимации — заменены алгоритмическими (+10 МБ и второй рендер-стек не окупаются). - NFC-фичи (метки → действия) — модуль есть в железе, но в Windows как устройство не выведен (нет драйвера); driver-free недоступно. - **Удалённое включение ПК (Xiaomi remote wake, IoT-модуль `ACPI\IOTD0000`)** — команда wake живёт в китайском облаке Xiaomi по DID и требует miIO-токена (только облако/дамп флеша); облачный вход закрыт (`502` — нет международного бэкенда, нужен CN-аккаунт + привязка в Mi Home). Локальный провижининг — OEM-служба + named pipe + нативная DLL, против driver-free. Полный разбор: [docs/11-iot-remote-wake.md](docs/11-iot-remote-wake.md).
💡 **Обратная сторона — driver-free-кандидат, отложен по решению:** *выключить* модуль (чтобы не включался сам и не висел в эфире) можно нашим MIFS-каналом (`0x0C/0x03`) + отключением службы `IoTSvc`. Тумблер «Выключить IoT-модуль» по паттерну opt-in (как `ApiFirewall`). Пока не берём — приоритеты; см. §7–8 дока 11. - Авто-детект «медленной зарядки» — надёжного сигнала нет: датчик тока батареи (`BatteryStatus.ChargeRate`) **беззнаковый** (показывает величину тока, флаг «заряд» ставит драйвер при подключении), поэтому под нагрузкой на слабом блоке величина растёт как «заряд», хотя батарея разряжается; на простое низкий у любого блока. Windows это и так показывает («зарядка идёт медленно»). Цвет графика по направлению — оставили (заряд зелёный / разряд оранжевый), это отдельно и работает. Разбор — [docs/09-power-monitoring.md](docs/09-power-monitoring.md). - **OSD «слабый/неправильный зарядник»** (`0x01`/value 2 из карты MIControl) — **пока отказались**. На TM2424 такого события нет: при подключении зарядки прилетает только `0x27` (смена режима энергоэффективности), кода про зарядник железо не шлёт. Детект по ваттам ненадёжен (беззнаковый датчик тока — см. пункт выше), а надёжный статус есть только у Windows (UCSI «зарядка идёт медленно») — он драйверный, без user-mode API, и Windows его и так показывает. Ждём тестеров с другой моделью, где событие реально приходит. Разбор — [docs/09-power-monitoring.md](docs/09-power-monitoring.md), [docs/07-keymap.md](docs/07-keymap.md).