Выбран приоритетный экран, а не листалка: устройство смотрится боковым зрением и должно само показывать то, что ближе к своему порогу. Совмещённый экран отвергнут по измерениям - вторая температура влезает только шрифтом 5x7, и смысл крупной цифры теряется. Отдельным пунктом записан опыт, который надо поставить до реализации: проверить, будит ли опрос дискретную видеокарту и не начнёт ли мониторинг сам расходовать батарею. Измеритель есть - датчик мощности разряда батареи, прав администратора он не требует. Записана и главная ловушка подхода: при близких к порогам показателях экран начнёт скакать между ними, нужна задержка переключения. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
208 lines
16 KiB
Markdown
208 lines
16 KiB
Markdown
# Бэклог
|
||
|
||
Идеи и незакрытые хвосты по проекту. Не план работ: сюда складывается то, что
|
||
решено не делать сейчас, чтобы не потерялось.
|
||
|
||
---
|
||
|
||
## 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, так что выигрыш только для будущих клонов.
|
||
|
||
Решено оставить как есть.
|