Files
Button/winDeployScripts/software/webconfig/scripts/bt-brightness
T

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