# Бэклог Идеи и незакрытые хвосты по проекту. Не план работ: сюда складывается то, что решено не делать сейчас, чтобы не потерялось. --- ## 1. Другие показатели и листалка по кнопке BOOT **Что хочется.** Показывать не только процессор: видеокарту, оперативную память, диски. Переключать экраны кнопкой **BOOT** на плате — нажал, увидел следующий набор данных. **Почему это дёшево со стороны протокола.** Формат `T=67.0;L=34` изначально сделан расширяемым: прошивка молча игнорирует незнакомые ключи. Агент может начать слать `G=61;GL=88;M=73` (видеокарта, её загрузка, память), и уже прошитые платы от этого не сломаются — просто не покажут новое. **Что придётся решить при реализации:** - **Кнопка BOOT сидит на GPIO9.** Это пин начальной загрузки: при сбросе он должен быть в высоком уровне, иначе плата уйдёт в режим прошивки. Читать его как `INPUT_PULLUP` в работе безопасно, но проверить фактически. - **Дребезг контактов.** Нужна программная защита, иначе одно нажатие пролистает три экрана. - **Свой макет под каждый экран.** На 72×40 не получится «то же самое, только другие цифры»: у памяти уместнее проценты и гигабайты, у диска — температура без графика. Каждый экран проектировать отдельно. - **Отдельная история на каждый показатель.** Сейчас кольцевой буфер один и хранит температуру CPU. На каждый график нужен свой буфер: 72 байта на штуку, памяти достаточно. - **Что показывать, если данных нет.** Например, в системе нет дискретной видеокарты — экран GPU надо либо пропускать при листании, либо честно писать, что источника нет. - **Запоминать ли выбранный экран** между перезагрузками. Если да, понадобится энергонезависимое хранилище, которого у прошивки сейчас нет вовсе. - **Тревога при листании.** Сейчас перегрев виден всегда, потому что экран один. С листалкой можно стоять на экране памяти и не увидеть, что горит процессор. Нужно решить: принудительно перекидывать на экран CPU, показывать тревогу поверх любого экрана или мигать только светодиодом. Последний пункт — самый важный: он затрагивает смысл устройства, а не удобство. **Для видеокарты выбран другой путь** — приоритетный экран без кнопки, см. пункт 2. Листалка остаётся в силе для остального: памяти, батареи, сети. ### Что фактически доступно на этой машине Проверено перебором датчиков через `LibreHardwareMonitorLib` после установки PawnIO (ноутбук с i5-11400H и RTX 3050 Ti): | Железо | Датчики | Права | |---|---|---| | Процессор | температура (15 датчиков: пакет, среднее, максимум, по ядрам, запас до предела), мощность | админ | | Процессор | загрузка (общая, по ядрам, по потокам), частоты | обычные | | Видеокарта NVIDIA | температура ядра и горячей точки, загрузка, мощность, напряжение, частоты, память, PCIe | **обычные** | | Встроенная графика Intel | загрузка по блокам (3D, декод видео, копирование) | обычные | | Оперативная память | занято и свободно в ГБ, загрузка в процентах | обычные | | Сеть (5 адаптеров) | скорость приёма и отдачи, объём, утилизация | обычные | | Батарея | заряд, деградация, ток, напряжение, мощность заряда и разряда, ёмкость | обычные | Важное следствие: **температура видеокарты не требует прав администратора** — NVIDIA отдаёт её через свой драйвер, ядро для этого не нужно. Админ нужен только процессору, потому что там чтение MSR. Чего нет: дисков (раздел не появился даже при включённом `IsStorageEnabled` — вероятно, тоже упирается в права) и датчиков материнской платы с вентиляторами. Для ноутбуков второе обычно: доступ к встроенному контроллеру закрыт. ### Разобранные кандидаты на экраны 1. **Видеокарта** — температура и загрузка. Полный аналог текущего экрана, макет переиспользуется целиком. Работает даже без прав администратора. 2. **Память** — занято в гигабайтах и процент. Меняется медленно, читается с расстояния, сглаживание не нужно. 3. **Батарея** — заряд и мощность разряда в ваттах: сразу видно, сколько ест ноутбук прямо сейчас. Для стационарного ПК бесполезно, экран надо скрывать. 4. **Сеть** — скорость приёма и отдачи. Живее всего смотрится на графике, но единицы прыгают от килобайт до мегабайт, и понадобится автоматическая смена масштаба — это единственный кандидат, требующий новой логики отрисовки. Порядок реализации по возрастанию стоимости: видеокарта, память, батарея, сеть. --- ## 2. Мониторинг видеокарты: приоритетный экран **Выбранный подход.** Не листалка, а **приоритетный экран**: плата сама показывает то, что ближе к своему порогу. Греется видеокарта — показывает её, в простое показывает процессор по умолчанию. Обоснование: устройство стоит на столе и смотрится боковым зрением, от него нужен ответ на один вопрос — «всё ли в порядке». Листалка заставляет либо жать кнопку, либо ждать нужного экрана. Значок в углу при этом естественно превращается в указатель, чьи данные показаны, и понадобится второй значок — видеокарты. Совмещённый экран отвергнут по измерениям: свободно 17 пикселей по ширине, вторая температура влезет только шрифтом 5×7, и смысл крупной цифры теряется. ### Сторона агента Работа одинакова для любого способа отображения и не ломает совместимость: прошивка игнорирует незнакомые ключи, поэтому агента можно обновить раньше прошивки. - включить `IsGpuEnabled`; - брать `Temperature/GPU Core` и `Load/GPU Core`; - добавить в строку ключи `G=` (температура) и `GL=` (загрузка): `T=67.0;L=34;G=61.0;GL=88`; - **опрашивать видеокарту реже процессора**, примерно раз в 5 секунд (см. ниже). Права администратора для видеокарты не нужны — NVIDIA отдаёт температуру через свой драйвер, а не через MSR. ### Сторона прошивки - **Свои пороги на каждый показатель.** У процессора 85/82. У ноутбучной RTX 3050 Ti предел около 87, так что пороги будут другими — подобрать, а не копировать. - **Задержка переключения.** Главная ловушка подхода: когда оба показателя близки к своим порогам, экран начнёт скакать между ними каждую секунду. Нужно либо минимальное время удержания экрана (5–10 секунд), либо заметный отрыв по «близости к порогу», при котором происходит переключение. - **Свой буфер истории на каждый показатель** — по 72 байта, памяти достаточно. - **Свой значок** для видеокарты, рядом с существующим значком процессора. - **Устаревание по каждому ключу отдельно.** Если данных по видеокарте нет дольше N секунд, её экран просто не участвует в выборе. Это же снимает вопрос, что делать на машине без дискретной видеокарты: экран не появится никогда. - **Сглаживание.** Температуру видеокарты усреднять так же, как процессорную, но окно считать в замерах, а не в секундах: при опросе раз в 5 секунд окно из 5 замеров даст 25 секунд, что слишком много. Вероятно, хватит 2–3. --- ## 2a. Сначала проверить: будит ли опрос видеокарту **Выполнить до реализации.** У ноутбука переключаемая графика, и в простое дискретная видеокарта уходит в сон. Опрос её датчиков может будить её и мешать энергосбережению — то есть мониторинг начнёт сам расходовать батарею и греть машину. Сейчас она отвечает (39 °C), значит не спит, но в глубоком простое поведение будет другим. **Как проверить.** Прямой измеритель уже есть: у батареи читается датчик `Power/Charge/Discharge Rate` в ваттах, и права администратора для него не нужны. 1. Отключить ноутбук от сети, оставить машину в простое, не трогать ввод. 2. Замер А: 10 минут писать мощность разряда **без** опроса видеокарты (`IsGpuEnabled = false`), раз в 10 секунд. 3. Замер Б: 10 минут то же самое **с** опросом видеокарты раз в секунду. 4. Сравнить средние. Заодно записывать `GpuNvidia Power/GPU Package`: если при опросе он перестаёт падать до нуля — видеокарта не засыпает. **Что делать с результатом.** Разница в пределах шума — опрашивать раз в секунду, как процессор. Разница заметная (скажем, больше половины ватта) — оставить опрос раз в 5 секунд или реже и запомнить это решение здесь. Оценка: около десяти минут работы плюс двадцать минут ожидания замеров. --- ## 3. Обрезание строки при 100° и 100% При трёхзначной температуре и трёхзначной загрузке верхняя строка занимает 79 пикселей из 72: `100` — 49 px, зазор 2, `100%` — 28 px. Лишние 7 пикселей уходят за правый край, и загрузка обрезается. Дефект существовал с самого начала, проявляется только под предельной нагрузкой. Для i5-11400H это не гипотеза: предельная температура около 100 °C. Решение на выбор: при трёхзначной температуре переходить на более мелкий шрифт загрузки либо убирать знак процента. Оценка — около получаса вместе с проверкой. Решено оставить как есть: в такой момент экран всё равно мигает тревогой. --- ## 4. Автозапуск не проверен перезагрузкой Задание Планировщика `CPU Temp Agent` зарегистрировано с триггером «при входе в систему», запускается вручную и работает. Живой перезагрузкой триггер не испытан. Проверится само при следующей перезагрузке: экран должен ожить без участия пользователя в течение примерно полуминуты. --- ## 5. Скрипт заливки Цикл «остановить агента → залить прошивку → запустить агента» делается тремя командами вручную. Пока правок мало, это терпимо; если работа по экрану продолжится, стоит свести в `flash.ps1`. Причина, по которой шаг вообще нужен: плата прошивается через тот же COM-порт, по которому идут данные, и занятый порт валит заливку с `PermissionError`. --- ## 6. Вес обзорного изображения `docs/promo.png` весит 2,1 МБ при исходниках примерно на 30 КБ. Сжатие до 300–500 КБ не ухудшило бы читаемость, но старый файл всё равно останется в истории git, так что выигрыш только для будущих клонов. Решено оставить как есть.