Refactor display manager and logo handling for improved functionality and organization

This commit is contained in:
Miguel Fuertes committed 2025-10-18 23:10:40 +02:00
1 parent ecc8f39da5
commit a78fda1f86
5 files changed
+133 -67

No files matched your search

+14 -1
View File
@@ -9,9 +9,22 @@
lockfile="/tmp/toff.lock"
delay=1
maybe_notify_display_shutdown() {
. /lib/functions.sh
config_load system
config_get FIFO display fifo "/var/run/display.fifo"
[ -p "$FIFO" ] && {
echo "shutdown" > "$FIFO" 2>/dev/null;
sleep 1;
}
}
shutdown() {
logger -t poweroff "Powering off..."
# maybe_notify_display_shutdown
sync
/sbin/poweroff
}
+3 -3
View File
@@ -67,9 +67,9 @@ define Package/router-display/install
$(INSTALL_DIR) $(1)/lib/preinit
$(INSTALL_BIN) ./files/preinit/05_display_logo $(1)/lib/preinit/05_display_logo
$(INSTALL_DIR) $(1)/usr/share/logos
$(INSTALL_DATA) ./files/logos/boot_logo.fb $(1)/usr/share/logos/boot_logo.fb
$(INSTALL_DATA) ./files/logos/poweroff_logo.fb $(1)/usr/share/logos/poweroff_logo.fb
$(INSTALL_DIR) $(1)/etc
$(INSTALL_DATA) ./files/logos/boot_logo.fb $(1)/etc/logos/boot_logo.fb
$(INSTALL_DATA) ./files/logos/poweroff_logo.fb $(1)/etc/logos/poweroff_logo.fb
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/display-manager.uci $(1)/etc/config/display
@@ -23,5 +23,4 @@ stop_service() {
echo "shutdown" > "$FIFO" 2>/dev/null;
sleep 1;
}
}
@@ -1,6 +1,25 @@
#!/bin/sh
# /usr/sbin/display-manager
PID_FILE=/var/run/display.pid
if [ -f "$PID_FILE" ]; then
old_pid=$(cat "$PID_FILE" 2>/dev/null)
if [ -n "$old_pid" ] && kill -0 "$old_pid" 2>/dev/null; then
echo "Another display-manager is running (PID: $old_pid). Exiting."
exit 1
else
# Stale PID file, remove it
logger -t display "Removing stale PID file"
rm -f "$PID_FILE"
fi
fi
echo $$ > "$PID_FILE"
# Enabling backlight power on startup
echo 0 > /sys/class/backlight/backlight/bl_power 2>/dev/null
. /lib/functions.sh
config_load system
@@ -8,8 +27,6 @@ config_load system
DEFAULT_TIMEOUT_DIM=5
DEFAULT_TIMEOUT_OFF=3
DEFAULT_BRIGHTNESS_DIM_DIVISOR=8
# FIFO stored in uci as a global shared memory
# This variable is meant to be used as RO
DEFAULT_FIFO="/var/run/display.fifo"
DEFAULT_ENABLE_LOCKSCREEN=1
@@ -26,27 +43,42 @@ BACKLIGHT_PATH="/sys/class/backlight/backlight"
MAX_BRIGHTNESS=$(cat "$BACKLIGHT_PATH/max_brightness" 2>/dev/null || echo 1785)
BRIGHTNESS_FULL=$MAX_BRIGHTNESS
BRIGHTNESS_DIM=$((MAX_BRIGHTNESS / BRIGHTNESS_DIM_DIVISOR))
LOCKSCREEN_FILE="/usr/share/logos/boot_logo.fb"
POWEROFF_FILE="/usr/share/logos/poweroff_logo.fb"
LOCKSCREEN_FILE="/etc/logos/boot_logo.fb"
POWEROFF_FILE="/etc/logos/poweroff_logo.fb"
UPDATE_DISPLAY_BIN="/usr/bin/update-display"
# PIDs
# Timer PIDs
TIMER_DIM_PID=""
TIMER_OFF_PID=""
# FIFO
# Create FIFO if it doesn't exist
[ -e "$FIFO" ] || mkfifo "$FIFO"
trap "rm -f $FIFO; exit 0" EXIT TERM INT
# Cleanup function: kills timers, closes FD, removes FIFO
cleanup() {
logger -t display "Cleaning up..."
[ -n "$TIMER_DIM_PID" ] && kill "$TIMER_DIM_PID" 2>/dev/null
[ -n "$TIMER_OFF_PID" ] && kill "$TIMER_OFF_PID" 2>/dev/null
exec 3<&- # Close file descriptor
rm -f "$FIFO"
rm -f "$PID_FILE"
exit 0
}
# Register cleanup on exit/termination/interrupt
trap cleanup EXIT TERM INT
# Display image file to framebuffer
fb_show_file() {
[ -c /dev/fb0 ] && [ -f "$1" ] && cat "$1" > /dev/fb0 2>/dev/null
}
# Set backlight brightness
set_brightness() {
echo "$1" > "$BACKLIGHT_PATH/brightness" 2>/dev/null
}
# Cancel running timers
cancel_timers() {
[ -n "$TIMER_DIM_PID" ] && kill "$TIMER_DIM_PID" 2>/dev/null
[ -n "$TIMER_OFF_PID" ] && kill "$TIMER_OFF_PID" 2>/dev/null
@@ -54,68 +86,81 @@ cancel_timers() {
TIMER_OFF_PID=""
}
# Send command to FIFO queue
enqueue() {
[ -p "$FIFO" ] && echo "$1" > "$FIFO" 2>/dev/null
}
# Start dim and off timers
start_timers() {
cancel_timers
# Timer for DIM state
(
sleep $TIMEOUT_DIM
logger -t display "Timer: DIM"
enqueue "dim"
) &; TIMER_DIM_PID=$!
) &
TIMER_DIM_PID=$!
# Timer for OFF state
TOTAL_TIMEOUT=$((TIMEOUT_DIM + TIMEOUT_OFF))
(
sleep $TOTAL_TIMEOUT
logger -t display "Timer: OFF"
enqueue "off"
) &; TIMER_OFF_PID=$!
) &
TIMER_OFF_PID=$!
}
logger -t display "Display manager started (dim:${TIMEOUT_DIM}s off:${TIMEOUT_OFF}s)"
fb_show_file "$LOCKSCREEN_FILE"
set_brightness $BRIGHTNESS_OFF
# Main FIFO loop
while true; do
if read -r cmd < "$FIFO"; then
case "$cmd" in
full)
logger -t display "Backlight: FULL"
set_brightness $BRIGHTNESS_FULL
start_timers
enqueue "update"
;;
dim)
logger -t display "Backlight: DIM (enqueue lockscreen)"
set_brightness $BRIGHTNESS_DIM
[ "$ENABLE_LOCKSCREEN" = "1" ] && enqueue "lockscreen"
;;
off)
logger -t display "Backlight: OFF"
cancel_timers
set_brightness $BRIGHTNESS_OFF
;;
lockscreen)
logger -t display "Show lockscreen"
fb_show_file "$LOCKSCREEN_FILE"
;;
update)
logger -t display "Update display"
[ -x $UPDATE_DISPLAY_BIN ] && $UPDATE_DISPLAY_BIN
;;
shutdown)
logger -t display "Shutdown sequence"
cancel_timers
fb_show_file "$POWEROFF_FILE"
echo 0 > "$BACKLIGHT_PATH/brightness" 2>/dev/null
echo 4 > /sys/class/graphics/fb0/blank 2>/dev/null
exit 0
;;
*)
logger -t display "Unknown command: $cmd"
;;
esac
fi
# Open FIFO once with persistent file descriptor
exec 3<> "$FIFO"
# Main FIFO command loop
while read -r cmd <&3; do
[ -z "$cmd" ] && continue # Skip empty lines
case "$cmd" in
full)
logger -t display "Backlight: FULL"
set_brightness $BRIGHTNESS_FULL
start_timers
enqueue "update"
;;
dim)
logger -t display "Backlight: DIM"
set_brightness $BRIGHTNESS_DIM
[ "$ENABLE_LOCKSCREEN" = "1" ] && enqueue "lockscreen"
;;
off)
logger -t display "Backlight: OFF"
cancel_timers
set_brightness $BRIGHTNESS_OFF
;;
lockscreen)
logger -t display "Show lockscreen"
fb_show_file "$LOCKSCREEN_FILE"
;;
update)
logger -t display "Update display"
[ -x $UPDATE_DISPLAY_BIN ] && $UPDATE_DISPLAY_BIN
;;
shutdown)
logger -t display "Shutdown sequence"
cancel_timers
fb_show_file "$POWEROFF_FILE"
echo 0 > "$BACKLIGHT_PATH/brightness" 2>/dev/null
# echo 4 > /sys/class/graphics/fb0/blank 2>/dev/null
break # Exit while loop
;;
*)
logger -t display "Unknown command: '$cmd'"
;;
esac
done
# Cleanup runs automatically via trap EXIT
@@ -2,25 +2,34 @@
show_logo() {
(
. /lib/functions.sh
config_load system
config_get FIFO display fifo "/var/run/display.fifo"
FB="/dev/fb0"
BL="/sys/class/backlight/backlight"
LOGO="/etc/logos/boot_logo.fb"
[ -p "$FIFO" ] || {
mkdir -p "$(dirname "$FIFO")";
mkfifo "$FIFO";
chmod 600 "$FIFO";
}
i=0; while { [ ! -c "$FB" ] || [ ! -d "$BL" ]; } && [ $i -lt 50 ]; do
# Wait for framebuffer
i=0
while [ ! -c "$FB" ] && [ $i -lt 50 ]; do
usleep 100000 # 100 ms
i=$((i + 1))
done
echo "dim" > "$FIFO" 2>/dev/null
# Show logo on framebuffer
if [ -c "$FB" ] && [ -f "$LOGO" ]; then
cat "$LOGO" > "$FB" 2>/dev/null
fi
# Wait for backlight
i=0
while [ ! -d "$BL" ] && [ $i -lt 50 ]; do
usleep 100000 # 100 ms
i=$((i + 1))
done
# Set backlight
if [ -d "$BL" ]; then
echo 0 > "$BL/bl_power" 2>/dev/null
echo 1 > "$BL/brightness" 2>/dev/null
fi
) &
}