Display/GUI watchdog for the "backlight on, no picture" failure

On PoE sites the MIPI-DSI panel can lose its init on a supply dip while the
RK3566 keeps running; the UI may also hang or exit. Three layers:

- hardware watchdog: systemd RuntimeWatchdogSec=20s (system.conf.d)
- GUI: SdWatchdog pings systemd per swapped frame (WATCHDOG_USEC=30s, enabled
  by the binary so older versions run under the same unit) and writes
  run/qt.frame; buttontask.service gets Restart=always, NotifyAccess=main,
  TimeoutAbortSec=10s
- bt-displaywatch (root, buttontask-displaywatch.service): kernel DRM/DSI
  timeouts, eth link down->up (PoE dip hint), stale UI frames, restart storms
  -> panel re-init (stop UI, fb0 blank 4->0, start UI), repeated -> reboot
  (max 3/day, never during OTA); incident log in /var/log/buttontask/

Manual recovery: hold one finger 10 s in the bottom-left corner (panels are
single-touch). Delivered by OTA via bt-update sync_system; the web service
runs `bt-update sync-system` at start for devices updated by an older
bt-update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-10 07:10:10 +00:00
co-authored by Claude Opus 5.5
parent 115879ab67
commit d71fa812da
18 changed files with 940 additions and 5 deletions
+2 -1
View File
@@ -48,6 +48,7 @@ $scriptsSrc = Join-Path $web 'scripts'
$needScripts = @(
'bt-netconfig', 'bt-netconfig-boot', 'bt-update', 'bt-service',
'bt-settime', 'bt-reboot', 'bt-access', 'bt-brightness', 'bt-set-master',
'bt-displaywatch',
'buttontask.sudoers'
)
foreach ($s in $needScripts) {
@@ -180,7 +181,7 @@ $fix = @()
$fix += Get-ChildItem (Join-Path $stage 'scripts') -File
$fix += Get-ChildItem (Join-Path $stage 'systemd') -File
$fix += Get-Item (Join-Path $stage 'device-install.sh')
$fix += @(Get-ChildItem (Join-Path $stage 'webconfig') -Recurse -File -Include 'bt-*', '*.sh', '*.service', '*.sudoers', 'override.conf*')
$fix += @(Get-ChildItem (Join-Path $stage 'webconfig') -Recurse -File -Include 'bt-*', '*.sh', '*.service', '*.sudoers', 'override.conf*', '*.conf')
$fix | Sort-Object FullName -Unique | ForEach-Object { ConvertTo-Lf $_.FullName }
Log "пакую архив"