Como posso otimizar este script bash para definir o brilho da minha luz de fundo em incraments de 5% sem erros de arredondamento?

0

Este é o código:

#!/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

Este é um script para exibir e me permite ajustar o brilho da luz de fundo na barra de status do meu gerenciador de janelas. Tudo o que eu faço a partir desse script é o que aparece na barra de status. A coisa que parece um asterisco na saída é apenas um ícone solar unicode. $ BLOCK_BUTTON é o botão que pressiono enquanto o cursor está sobre ele, com 4 representando a rolagem para cima e 5 representando a rolagem para baixo. Ele exibe o brilho atual bem. Sempre que eu rola para cima, ele aumenta o brilho de 0% para 55% em incraments de 5%. Então vai para 59%, 64%, 69%, 74%, etc. Por que está fazendo isso? Isso é algum tipo de erro de arredondamento? Como posso corrigi-lo para que ele seja inserido em 5% até 100%.

    
por Garrett 04.03.2016 / 00:41

1 resposta

0

Sugiro contar a diferença entre o valor do brilho atual e o valor a ser definido em cada etapa, dependendo da sobra para o máximo. Dessa forma, os erros de arredondamento não serão acumulados.

Com o valor máximo de literal da minha máquina, aqui está a demonstração:

$> 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

Se a diferença for sempre a mesma, os erros serão adicionados:

$> 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

Para essa recomendação, você deve ter um contador de passos armazenado para saber qual deve ser seu divisor atual para calcular a diferença.

    
por 04.03.2016 / 01:58

Tags