167 lines
4.5 KiB
Bash
167 lines
4.5 KiB
Bash
#!/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
|
|
|
|
# Defaults
|
|
DEFAULT_TIMEOUT_DIM=5
|
|
DEFAULT_TIMEOUT_OFF=3
|
|
DEFAULT_BRIGHTNESS_DIM_DIVISOR=8
|
|
DEFAULT_FIFO="/var/run/display.fifo"
|
|
DEFAULT_ENABLE_LOCKSCREEN=1
|
|
|
|
# Load from UCI
|
|
config_get TIMEOUT_DIM display timeout_dim "$DEFAULT_TIMEOUT_DIM"
|
|
config_get TIMEOUT_OFF display timeout_off "$DEFAULT_TIMEOUT_OFF"
|
|
config_get BRIGHTNESS_DIM_DIVISOR display brightness_dim_divisor "$DEFAULT_BRIGHTNESS_DIM_DIVISOR"
|
|
config_get FIFO display fifo "$DEFAULT_FIFO"
|
|
config_get ENABLE_LOCKSCREEN display enable_lockscreen "$DEFAULT_ENABLE_LOCKSCREEN"
|
|
|
|
# Derived or fixed values
|
|
BRIGHTNESS_OFF=1
|
|
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="/etc/logos/boot_logo.fb"
|
|
POWEROFF_FILE="/etc/logos/poweroff_logo.fb"
|
|
UPDATE_DISPLAY_BIN="/usr/bin/update-display"
|
|
|
|
# Timer PIDs
|
|
TIMER_DIM_PID=""
|
|
TIMER_OFF_PID=""
|
|
|
|
# Create FIFO if it doesn't exist
|
|
[ -e "$FIFO" ] || mkfifo "$FIFO"
|
|
|
|
# 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
|
|
TIMER_DIM_PID=""
|
|
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 for OFF state
|
|
TOTAL_TIMEOUT=$((TIMEOUT_DIM + TIMEOUT_OFF))
|
|
(
|
|
sleep $TOTAL_TIMEOUT
|
|
logger -t display "Timer: OFF"
|
|
enqueue "off"
|
|
) &
|
|
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
|
|
|
|
# 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
|