Files
sxmo-utils/scripts/core/sxmo_led.sh
2023-02-24 19:21:47 +01:00

125 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh
get_type() {
# Get type from variable name created dynamically from the color,
# e.g. $SXMO_LED_RED_TYPE
eval type='$'SXMO_LED_"$(echo "$1" | tr '[:lower:]' '[:upper:]')"_TYPE
# Defaults
if [ -z "$type" ]; then
case $1 in
red|green|blue) type="indicator" ;;
white) type="flash" ;;
esac
fi
printf %s "$type"
}
get_led() {
color="$1"
usage() {
printf "usage: %s get [red|green|blue|white]\n" "$0"
exit 1
}
[ $# -lt 1 ] && usage
type="$(get_type "$color")";
value="$(cat "/sys/class/leds/$color:$type/brightness")"
max="$(cat "/sys/class/leds/$color:$type/max_brightness")"
printf "scale=0; %s / %s * 100\n" "$value" "$max" | bc -l
}
set_led() {
usage (){
printf "usage: %s set [red|green|blue|white] [0-100]\n" "$0"
exit 1
}
[ $# -lt 2 ] && usage
color="$1"
percent="$2"
type="$(get_type "$color")";
if [ ! -d "/sys/class/leds/$color:$type" ]; then
echo "LED does not exist: /sys/class/leds/$color:$type"
exit 1
fi
max="$(cat "/sys/class/leds/$color:$type/max_brightness")"
brightness="$(echo "($percent / 100.0) * $max" | bc -l)"
printf "%0.f\n" "$brightness" > "/sys/class/leds/$color:$type/brightness"
}
set_leds() {
while [ "$#" -ge 2 ]; do
set_led "$1" "$2" &
shift 2
done
wait
}
finish_blinking() {
sxmo_wakelock.sh unlock playing_with_leds
eval set_leds green '$'old_green blue '$'old_blue red '$'old_red ${white:+white '$'old_white}
exit
}
blink_leds() {
for color in green blue red white; do
percent="$(get_led "$color")"
eval "old_$color=$percent" # store old value
done
sxmo_wakelock.sh lock playing_with_leds 2s
trap 'finish_blinking' TERM INT EXIT
while [ -n "$1" ]; do
case "$1" in
green|blue|red|white)
eval "$1=100"
shift
;;
esac
done
# shellcheck disable=SC2154
set_leds green 0 blue 0 red 0 ${white:+white 0}
sleep 0.1 # Make blink noticable
set_leds green "${green:-0}" blue "${blue:-0}" red "${red:-0}" ${white:+white "${white:-0}"}
sleep 0.1 # Make blink noticable
set_leds green 0 blue 0 red 0 ${white:+white 0}
sleep 0.1 # Make blink noticable
}
[ -z "$SXMO_DISABLE_LEDS" ] || exit 1
exec 3<> "${XDG_RUNTIME_DIR:-$HOME}/sxmo.led.lock"
cmd="$1"
shift
case "$cmd" in
"set"|blink)
flock -x 3
"$cmd"_leds "$@"
;;
get)
flock -s 3
get_led "$@"
;;
esac