Files
Arduino/CPU_temp/docs/BACKLOG.md
T
oskarvitaliiandClaude Opus 5 f18090b5b7 feat(ui): экран оперативной памяти и переключение кнопкой BOOT
Второй экран показывает загрузку ОЗУ крупной цифрой и её график со
шкалой 0-100 - у памяти она естественная, подбирать нечего. В углу свой
значок, планка памяти вместо микросхемы: он же и говорит, какой экран
открыт.

Тревога в приоритете: при перегреве плата принудительно возвращается на
экран процессора и кнопка не работает, пока температура не упадёт. Смысл
тревоги в том, что её нельзя прощёлкать.

Экран памяти выпадает из листания, если агент не шлёт ключ M - со старым
агентом кнопка просто ничего не делает. То же решение подойдёт машинам
без дискретной видеокарты.

Выбранный экран не запоминается при перезагрузке: хранить негде.
Тревоги по памяти нет намеренно - загрузка ОЗУ под 100% здесь обычное
рабочее состояние.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 19:56:33 +07:00

219 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Бэклог
Идеи и незакрытые хвосты по проекту. Не план работ: сюда складывается то, что
решено не делать сейчас, чтобы не потерялось.
---
## 1. Другие показатели и листалка по кнопке BOOT — частично сделано
**Сделано 2026-09-17:** экран оперативной памяти и переключение кнопкой BOOT.
Решения, принятые при реализации, чтобы не пересматривать заново:
- **Тревога в приоритете.** При перегреве плата принудительно возвращается на
экран процессора, и кнопка не работает, пока температура не упадёт. Из трёх
вариантов, перечисленных ниже, выбран самый жёсткий: смысл тревоги в том, что
её нельзя прощёлкать.
- **Выбранный экран не запоминается** при перезагрузке — хранить негде.
- **Тревоги по памяти нет:** загрузка ОЗУ под 100 % на этой машине обычное
состояние.
- **Защита от дребезга** — 50 мс, порог в `config.h`.
- **Экран без данных выпадает из листания.** Если агент не шлёт ключ `M`, экран
памяти недоступен, и кнопка просто ничего не делает. Это же решение подойдёт
для машин без дискретной видеокарты.
**Осталось:** экраны батареи и сети, а также видеокарта — но у неё свой путь,
см. пункт 2.
**Что хочется.** Показывать не только процессор: видеокарту, оперативную память,
диски. Переключать экраны кнопкой **BOOT** на плате — нажал, увидел следующий
набор данных.
**Почему это дёшево со стороны протокола.** Формат `T=67.0;L=34` изначально
сделан расширяемым: прошивка молча игнорирует незнакомые ключи. Агент может
начать слать `G=61;GL=88;M=73` (видеокарта, её загрузка, память), и уже прошитые
платы от этого не сломаются — просто не покажут новое.
**Что придётся решить при реализации:**
- ~~**Кнопка BOOT сидит на GPIO9.**~~ Проверено на практике: чтение через
`INPUT_PULLUP` в работе никак не мешает загрузке платы.
- ~~**Дребезг контактов.**~~ Сделано: 50 мс, `BUTTON_DEBOUNCE_MS`.
- **Свой макет под каждый экран.** На 72×40 не получится «то же самое, только
другие цифры»: у памяти уместнее проценты и гигабайты, у диска — температура
без графика. Каждый экран проектировать отдельно.
- **Отдельная история на каждый показатель.** Сейчас кольцевой буфер один и
хранит температуру CPU. На каждый график нужен свой буфер: 72 байта на штуку,
памяти достаточно.
- **Что показывать, если данных нет.** Например, в системе нет дискретной
видеокарты — экран GPU надо либо пропускать при листании, либо честно писать,
что источника нет.
- ~~**Запоминать ли выбранный экран**~~ Решено не запоминать: хранилища нет.
- ~~**Тревога при листании.**~~ Решено: принудительно перекидывать на экран
процессора и блокировать кнопку.
**Для видеокарты выбран другой путь** — приоритетный экран без кнопки, см.
пункт 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, так что выигрыш только для будущих клонов.
Решено оставить как есть.