84 lines
2.5 KiB
Bash
84 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# bt-brightness - LCD backlight control for ButtonTask.
|
|
#
|
|
# Usage:
|
|
# bt-brightness status
|
|
# bt-brightness set <0-100>
|
|
#
|
|
# Invoked through sudo by the web configurator / Qt UI.
|
|
# Prefers /sys/class/backlight/backlight; otherwise the first device with
|
|
# max_brightness > 0.
|
|
set -euo pipefail
|
|
|
|
err() { echo "bt-brightness: $*" >&2; exit 1; }
|
|
|
|
BACKLIGHT_ROOT="/sys/class/backlight"
|
|
|
|
find_device() {
|
|
local d preferred="$BACKLIGHT_ROOT/backlight" max
|
|
if [ -d "$preferred" ] && [ -f "$preferred/max_brightness" ]; then
|
|
max="$(cat "$preferred/max_brightness" 2>/dev/null || echo 0)"
|
|
if [ "$max" -gt 0 ] 2>/dev/null; then
|
|
echo "$preferred"
|
|
return 0
|
|
fi
|
|
fi
|
|
for d in "$BACKLIGHT_ROOT"/*; do
|
|
[ -d "$d" ] || continue
|
|
[ -f "$d/max_brightness" ] || continue
|
|
max="$(cat "$d/max_brightness" 2>/dev/null || echo 0)"
|
|
if [ "$max" -gt 0 ] 2>/dev/null; then
|
|
echo "$d"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
emit_status() {
|
|
local dev="$1" max cur percent
|
|
max="$(cat "$dev/max_brightness")"
|
|
if [ -f "$dev/actual_brightness" ]; then
|
|
cur="$(cat "$dev/actual_brightness")"
|
|
else
|
|
cur="$(cat "$dev/brightness")"
|
|
fi
|
|
if [ "$max" -gt 0 ]; then
|
|
percent=$(( (cur * 100 + max / 2) / max ))
|
|
else
|
|
percent=0
|
|
fi
|
|
[ "$percent" -gt 100 ] && percent=100
|
|
[ "$percent" -lt 0 ] && percent=0
|
|
printf '{"device":"%s","brightness":%s,"max":%s,"percent":%s}\n' \
|
|
"$(basename "$dev")" "$cur" "$max" "$percent"
|
|
}
|
|
|
|
set_percent() {
|
|
local percent="$1" dev max value
|
|
[[ "$percent" =~ ^[0-9]+$ ]] || err "percent must be an integer 0-100"
|
|
[ "$percent" -ge 0 ] && [ "$percent" -le 100 ] || err "percent must be 0-100"
|
|
dev="$(find_device)" || err "no backlight device found"
|
|
max="$(cat "$dev/max_brightness")"
|
|
[ "$max" -gt 0 ] || err "max_brightness is 0"
|
|
value=$(( (percent * max + 50) / 100 ))
|
|
[ "$value" -lt 0 ] && value=0
|
|
[ "$value" -gt "$max" ] && value="$max"
|
|
# Avoid completely blank panel unless explicitly requested as 0.
|
|
printf '%s\n' "$value" > "$dev/brightness"
|
|
emit_status "$dev"
|
|
}
|
|
|
|
cmd_status() {
|
|
local dev
|
|
dev="$(find_device)" || err "no backlight device found"
|
|
emit_status "$dev"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
status) cmd_status ;;
|
|
set) [ "$#" -eq 2 ] || err "usage: bt-brightness set <0-100>"; set_percent "$2" ;;
|
|
*) err "usage: bt-brightness {status|set <0-100>}" ;;
|
|
esac
|