Вот код:

#!/bin/bash

blDir='/sys/class/backlight/intel_backlight'
brightness=$(cat $blDir/brightness) # current brightness
max=$(cat $blDir/max_brightness)    # maximum brightness
percentage=$(echo "scale=3; ($brightness/$max)*100" | bc | awk '{print int($1+0.5)}')

case $BLOCK_BUTTON in
    # brightness up %5
    4) echo $(( $brightness + ( $max / 20 ) )) > $blDir/brightness ;;   
    # brightness down %5
    5) echo $(( $brightness - ( $max / 20 ) )) > $blDir/brightness ;;   
esac

if (( $percentage >= 5 )); then
    # output current brightness
    echo "☀ $percentage%"
else
    # output '0%' instead of '%'
    echo "☀ 0%"
fi

Это скрипт для отображения, и я могу настроить яркость подсветки в строке состояния моего оконного менеджера. Все, что я повторяю из этого скрипта, это то, что появляется в строке состояния. Звездочка в выводе - просто иконка солнца в юникоде. $ BLOCK_BUTTON - это кнопка, которую я нажимаю, когда над ней наведен курсор, где 4 обозначает прокрутку вверх и 5 - прокрутку вниз. Он отображает текущую яркость просто отлично. Всякий раз, когда я прокручиваю вверх, яркость повышается с 0% до 55% в инкрементах по 5%. Затем он достигает 59%, 64%, 69%, 74% и т.д. Почему он это делает? Это какая-то ошибка округления? Как я могу исправить это так, чтобы оно пошло инкрементами от 5% до 100%.

1 ответ1

0

Я предлагаю подсчитать разницу между значением текущей яркости и значением, устанавливаемым на каждом шаге, в зависимости от остатка до макс. Таким образом, ошибки округления не будут накапливаться.

С буквальным значением max моей машины вот демо:

$> cat tuner.sh

current=0
max=4437
for step in {0..19}; do
   diff=$(echo "($max - $current)  / (20-$step)" | bc )
   current=$(echo "$current + $diff" | bc )
   echo "$current / $max"
done

$> ./tuner.sh
221 / 4437
442 / 4437
663 / 4437
885 / 4437
1107 / 4437
1329 / 4437
1551 / 4437
1773 / 4437
1995 / 4437
2217 / 4437
2439 / 4437
2661 / 4437
2883 / 4437
3105 / 4437
3327 / 4437
3549 / 4437
3771 / 4437
3993 / 4437
4215 / 4437
4437 / 4437

Если разница всегда одинакова, то ошибки складываются:

$> cat badtuner.sh

current=0
max=4437
for step in {0..19}; do
   diff=$(echo "$max / 20" | bc )
   current=$(echo "$current + $diff" | bc )
   echo "$current / $max"
done

$> ./badtuner.sh
221 / 4437
442 / 4437
663 / 4437
884 / 4437
1105 / 4437
1326 / 4437
1547 / 4437
1768 / 4437
1989 / 4437
2210 / 4437
2431 / 4437
2652 / 4437
2873 / 4437
3094 / 4437
3315 / 4437
3536 / 4437
3757 / 4437
3978 / 4437
4199 / 4437
4420 / 4437

Для этой рекомендации у вас должен быть сохранен счетчик шагов, чтобы узнать, каким должен быть ваш текущий делитель для вычисления разницы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .