Сохранено: страница POWER (батарея/ADC/reboot), настройка радио с разрядами частоты,
темы и кириллица на дисплеях, меню уведомлений (тихие часы, режимы каналов),
стартовый экран MESHINFO, свои варианты плат.
Адаптировано под новый API 1.18.0: Listener (onMessageRecv/onChannelMessageRecv/
onQueueSizeChanged) вместо msgRead/newMsg, фильтрация уведомлений переехала в UITask,
в ChannelDetails добавлен индекс канала.
Отклонения от upstream: убран пин toolchain-gccarmnoneeabi@^1.140201.0 (такой версии
нет в реестре PlatformIO, сборка nRF52 висела) и не добавлен NRF52_POWER_MANAGEMENT
(upstream отключил его как ломающий не-Li-Ion батареи).
AUTO_OFF_MILLIS is a power-save feature aimed at battery use. When the
board reports isExternalPowered() == true (USB or other DC source),
blanking the screen serves no purpose — there's nothing to conserve.
But OLEDs are vulnerable to burn-in with static content, so this
behaviour is gated behind a new build flag KEEP_DISPLAY_ON_USB. Default
is unchanged from upstream — the display blanks after AUTO_OFF_MILLIS
on USB or battery. Variants that ship with an LCD instead of an OLED
(e.g. heltec_t096) can opt in by adding -D KEEP_DISPLAY_ON_USB to
their env, gaining always-on-while-powered without exposing OLED users
to burn-in risk.
When the flag is enabled, the implementation refreshes _auto_off every
loop iteration while externally powered, so the timer naturally counts
a fresh AUTO_OFF_MILLIS window from the moment power is removed —
no instantaneous-blank-on-unplug.
Applied to all three companion_radio UI flavours (ui-new, ui-tiny,
ui-orig). Boards without an isExternalPowered() override use the
base-class default in MeshCore.h (returns false), so battery-powered
behaviour is unchanged everywhere.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>