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

17 KiB
Raw Blame History

Бэклог

Идеи и незакрытые хвосты по проекту. Не план работ: сюда складывается то, что решено не делать сейчас, чтобы не потерялось.


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, так что выигрыш только для будущих клонов.

Решено оставить как есть.