Живой план. Не обязательства, а список идей по приоритету. Отметки: ✅ готово · 🔜 ближайшее · 💡 идея.
Актуально на 2026-08-21: выпущены v0.12.0 (авто-яркость, портативный режим, индикатор в трее), v0.12.1 (фикс авто-яркости) и v0.12.2 (управление обучением кривой). Тестеры живут на скользящем pre-release. История версий — в 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), яркость — WMIWmiMonitorBrightness*(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, берём максимум среди активных доменов. Ранее числился закрытым как «невозможно» — переоткрыт на проверенном сигнале (см. ниже). Горячая зона графика подсвечивается вишнёвым (порог от ACPICriticalTripPoint) (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 (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) вместо WMIBatteryStatus: 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; bind127.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). Пикер порога — Настройки → Батарея; панель — бинарный тумблер «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_<SID>): раньше задача была одна на машину, и второй пользователь, включив автозапуск, перезаписывал задачу первого. Задача старого образца распознаётся и мигрирует при следующем переключении; чужая не трогается никогда. Самопочинка теперь ловит и устаревшую версию 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). -
Авто-яркость по датчику освещённости с обучаемой кривой — экран следует за светом по кривой lux → %, которая учится на правках пользователя (механика wluma: якоря, вытеснение противоречий, кусочно-линейная интерполяция в лог-шкале). Кривых две (сеть/батарея); «инерция» — медиана люксов за окно против бликов; гистерезис ±26% и дебаунс — экран не «дышит»; на вкладке живые люксы и график обеих кривых со «срезом» лимитом. Нейросети нет намеренно — модель объяснима и лежит в config.json. Датчик — driver-free через WinRT LightSensor сырой активацией (классический Sensor API в elevated-процессе мёртв; датчик стримит только при живом событийном подписчике — см. docs/13) (XIC-30, v0.12.0).
-
Файн-тюнинг обучения авто-яркости — клавиши Windows шагают по 10%, комфортное значение между ступенями руками не выставить, и человек колеблется (60/50/60), а кривая скакала за ним. Теперь уточняющая правка (в пределах ступени) сдвигает прежний якорь навстречу наполовину: колебание 65/55 сходится к 60 — значению, которое кривая может, а клавиши нет; заодно у колебаний исчезает причина. Крупная правка записывается точно. Округление AwayFromZero — настойчивый повтор доводит якорь ровно до цели. Перехват штатных клавиш (доводка их шага до 5%) проверен пробой и отклонён: видимый отскок яркости (XIC-32, v0.12.0).
-
Портативный режим — метка
.portable/portable.txt(или готовый config.json) рядом с exe переселяет настройки и журнал в папку программы: переезд на другой диск и переустановка Windows без потерь (запрос GitHub #32). Прежние настройки переносятся из %APPDATA% при первом старте; read-only каталог (winget в Program Files) → честный откат в %APPDATA% с причиной в логе. api.json намеренно остаётся в %ProgramData% под ACL (модель безопасности HTTP API), автозапуск — системная задача планировщика по природе (XIC-34, v0.12.0). -
Индикатор в трее — второй значок с цифрой выбранной метрики (потребление Вт / CPU / GPU / RAM / температура), как TrafficMonitor: Windows не даёт подписать значок текстом, поэтому цифра рендерится в саму иконку (PNG-ICO в памяти, без GDI-хэндлов — приём RunCat365). Тултип с точным значением, клик открывает «Монитор», период 1–10 с, цвет по теме панели. По умолчанию выключен; выключен = не создаётся ничего (ни значка, ни таймера, ни источников) — ноль нагрузки. Источники CPU/RAM/DPTF вынесены из «Монитора» в SystemIntegration и стали общими (XIC-35, v0.12.0).
-
Фикс: авто-яркость была мертва после старта — сэмплы датчика (~1.5 с) идут чаще дебаунса стабилизации (2 с), и после запуска каждый из них заново взводил ожидание: оно не истекало никогда, реакция на свет приходила только после смены питания. Отдельная база взвода: дебаунс перевзводится, лишь пока свет продолжает значимо меняться. Чинит заодно плавный рассвет (XIC-36, v0.12.1).
-
Управление обучением кривой — тумблер «Обучение кривой» замораживает кривую: правки яркости становятся временными, а «Возврат к выученному» (всегда / только от батареи / выключен) мягко сводит яркость обратно по механике лимита, в обе стороны; повторная правка — уступка на 2 часа или до блокировки. Свои тайминги в config.json. Ответ на «хочу временно прибавить, не переучивая» (XIC-37, v0.12.2).
- Зафиксированных ближайших задач нет — см. «Идеи» ниже.
- Камера/приватность (
0xA0из карты MIControl) — на TM2424 событие не замечено, ждём тестеров.
- Fn отдельным кодом не приходит → комбинации с Fn недоступны (обходим жестами Mi).
- Набор уровней порога заряда на ДРУГИХ моделях — на TM2424 это 40/50/60/70/80/100% (docs/12); 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только feature0x0D/0x59(Pad Type),0x0D/0x55(Contact Count Max) и вендорский0xFF00/0xC5, коллекции Haptics (0x0E) нет вовсе — то естьFeedbackEnabled/FeedbackIntensityу нас ни на что не влияют, а пэд не haptic в смысле Windows. Остаётся только RE вендорского канала (0xFF00/0xC5report 6, коллекцииCOL04/COL05) — отдельная задача, если понадобится. - WMI
0x0C— рудиментный слот TPLock игровой таблицы MIFS: флаг хранится, к железу на TM2424 не подключён. Не используем. Детали: docs/01-wmi-protocol.md. - Управление кулером сверх режимов — на TM2424 отсутствует (полный свип
0x01..0x30:0x14/0x15макс. кулер и0x17CPU power —0xE0). - Ограничение TDP в ваттах (CPU/iGPU) — driver-free невозможно: команды лимита мощности
в MIFS нет (
0x17=0xE0), реальные PL держит Intel DTT/ACPI, а произвольные ватты — только запись RAPL MSR = kernel-драйвер. Проверено на TM2424. Детали: docs/05-open-questions.md. - Мониторинг температур — ✅ переоткрыт и сделан driver-free (см. «Сделано»). Тупиковыми
оказались MIFS (
0xE0) и ACPI-зона\_TZ.TZ00(MSAcpi_ThermalZoneTemperature— капризна, не отражает CPU). Рабочий путь — Intel DPTF: WMIroot\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.
💡 Обратная сторона — driver-free-кандидат, отложен по решению: выключить модуль (чтобы не включался сам и не висел в эфире) можно нашим MIFS-каналом (0x0C/0x03) + отключением службыIoTSvc. Тумблер «Выключить IoT-модуль» по паттерну opt-in (какApiFirewall). Пока не берём — приоритеты; см. §7–8 дока 11. - Авто-детект «медленной зарядки» — надёжного сигнала нет: датчик тока батареи (
BatteryStatus.ChargeRate) беззнаковый (показывает величину тока, флаг «заряд» ставит драйвер при подключении), поэтому под нагрузкой на слабом блоке величина растёт как «заряд», хотя батарея разряжается; на простое низкий у любого блока. Windows это и так показывает («зарядка идёт медленно»). Цвет графика по направлению — оставили (заряд зелёный / разряд оранжевый), это отдельно и работает. Разбор — docs/09-power-monitoring.md. - OSD «слабый/неправильный зарядник» (
0x01/value 2 из карты MIControl) — пока отказались. На TM2424 такого события нет: при подключении зарядки прилетает только0x27(смена режима энергоэффективности), кода про зарядник железо не шлёт. Детект по ваттам ненадёжен (беззнаковый датчик тока — см. пункт выше), а надёжный статус есть только у Windows (UCSI «зарядка идёт медленно») — он драйверный, без user-mode API, и Windows его и так показывает. Ждём тестеров с другой моделью, где событие реально приходит. Разбор — docs/09-power-monitoring.md, docs/07-keymap.md.