#!/usr/bin/env bash
#
# Copyright 2021 RnD Center "ELVEES", JSC
# SPDX-License-Identifier: BSD-2-Clause
#
# Enumerates all LEDs in the system (except mmc*) and blinks them one by one
# in cycle.
#

set -eo pipefail

DURATION=5
BASEDIR=/sys/class/leds
declare -A triggers

log() {
    # shellcheck disable=SC2015
    [[ $VERBOSE ]] && echo "$@" || true
}

leds_list() {
    find $BASEDIR -mindepth 1 -maxdepth 1 ! -name 'mmc*' | sort
}

leds_save_triggers() {
    log "Saving triggers..."
    for led; do
        triggers[$led]=$(sed 's/.*\[\(.*\)\].*/\1/' $led/trigger)
        log "  $led = ${triggers[$led]}"
    done
}

leds_restore_triggers() {
    log "Restoring triggers..."
    for led in "${!triggers[@]}"; do
        echo ${triggers[$led]} > $led/trigger
    done
}

leds_off() {
    for led; do
        echo 0 > $led/brightness
    done
}

help() {
    echo "Usage: $0 [-d duration] [-v]"
    exit 1
}

while getopts 'd:v' opt; do
    case $opt in
        d) DURATION=$OPTARG;;
        v) VERBOSE=1;;
        *) help $0;;
    esac
done
shift $((OPTIND - 1))

leds=$(leds_list)
if [ -z "$leds" ]; then
    echo "No LEDs found"
    exit 1
fi

leds_save_triggers $leds

trap 'leds_off $leds; leds_restore_triggers' EXIT
trap 'exit 0' HUP INT TERM

for led in $leds; do
    echo none > $led/trigger
done

leds_off $leds

while true; do
    for led in $leds; do
        log "Turn on $(basename $led) LED..."
        cat $led/max_brightness > $led/brightness
        sleep $DURATION
        echo 0 > $led/brightness
    done
done
