Refactor display manager and logo handling for improved functionality and organization
This commit is contained in:
1 parent
ecc8f39da5
commit
a78fda1f86
5 files changed
+133
-67
No files matched your search
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
) &
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user