Mac-like-automatic-brightness/autobrightness.sh
Theluga 39ff5f9d8b
Improved sensor detection and more
Removed nonsensical function, 
improved sensor detection with * : very important when you have multiple sensors that are changing device order when booting
improved user configurable variable on the top of scrip
detecting minimum illuminance to set minimum brightness inside the loop (now brightness key works)
2023-12-19 12:51:50 -03:00

168 lines
4.1 KiB
Bash

#!/bin/bash
#variables to run
#decrease cpu usage
Priority=19 # CPU limit, adjust as needed
# How much light change must be seen by the sensor before it will act
LightChange=5
# How often it checks the sensor
SensorDelay=1
# Scale sensor to display brightness range
SensorToDisplayScale=20
# This should match your refresh rate otherwise it will either change the backlight more times than needed or too few for a smooth animation
LevelSteps=60
# The is should match the LevelSteps but in the actual time each event should take to see
AnimationDelay=0.016
# Read the variable names
MaxScreenBrightness=937
MinimumBrightness=1
#minimum illuminance to get minimum brightness
MinimimumIlluminance=0
# 2 : Default | 1 : Add Offset | 0 : Subtract Offset, Recommended not to change
op=2
#place where you get the brightness of the monitor being controled and the sensor of brightness
MonitorBrightness=/sys/class/backlight/intel_backlight/brightness
#my sensor keep changing places, this way it will always be found with * if you have lots of sensors
AnbientSensorIlluminance=/sys/bus/iio/devices/iio:*/in_illuminance_raw
while getopts i:d: flag; do
case "${flag}" in
i) op=1
num=${OPTARG};;
d) op=0
num=${OPTARG};;
esac
done
if [[ -f /tmp/AB.offset ]]; then
OffSet=$(cat /tmp/AB.offset)
else
OffSet=0
echo $OffSet > /tmp/AB.offset
chmod 666 /tmp/AB.offset
fi
OffSet=$((OffSet < 0 ? 0 : OffSet))
if [[ $op -lt 2 ]]; then
if [[ $op -eq 1 ]]; then
OffSet=$((OffSet + num))
else
OffSet=$((OffSet - num))
fi
OffSet=$((OffSet < 0 ? 0 : OffSet))
echo $OffSet > /tmp/AB.offset
chmod 666 /tmp/AB.offset
exit
fi
# Set the priority of the current script and says it is running
renice "$Priority" "$$"
touch '/tmp/AB.running'
OldLight=$(cat $AnbientSensorIlluminance)
until [ -f /tmp/AB.kill ]; do
if [[ -f /tmp/AB.stop ]]; then
rm '/tmp/AB.stop'
rm '/tmp/AB.running'
until [[ -f /tmp/AB.start ]]; do
sleep 10
done
rm '/tmp/AB.start'
touch '/tmp/AB.running'
else
if [[ -f /tmp/AB.offset ]]; then
OffSet=$(cat /tmp/AB.offset)
else
OffSet=0
echo $OffSet > /tmp/AB.offset
chmod 666 /tmp/AB.offset
fi
Light=$(cat $AnbientSensorIlluminance)
RealLight=$(cat $AnbientSensorIlluminance)
Light=$((Light + OffSet))
RealLight=$((RealLight + OffSet))
if [[ $Light -lt $LightChange ]]; then
MaxOld=$((OldLight + LightChange))
MinOld=$((OldLight - LightChange))
else
MaxOld=$((OldLight + OldLight/LightChange))
MinOld=$((OldLight - OldLight/LightChange))
fi
if [[ $Light -gt $MaxOld ]] || [[ $Light -lt $MinOld ]]; then
CurrentBrightness=$(cat $MonitorBrightness)
Light=$(( $Light + $MinimumBrightness ))
TempLight=$(($Light * $SensorToDisplayScale))
if [[ $TempLight -gt $MaxScreenBrightness ]]; then
NewLight=$MaxScreenBrightness
LimitMaxIlluminanceReached=1
elif [[ $RealLight -le $MinimimumIlluminance ]]; then
NewLight=$MinimumBrightness
LimitMinIlluminanceReached=1
else
NewLight=$TempLight
fi
DiffCount=$(( ($NewLight - $CurrentBrightness)/$LevelSteps ))
for i in $(eval echo {1..$LevelSteps}); do
NewLight=$(( $DiffCount ))
if [[ $NewLight -lt 0 ]]; then
NewLight=$( echo "$NewLight" | awk -F "-" {'print$2'})
NewLight=$(echo $NewLight-)
else
NewLight=$(echo +$NewLight)
fi
if [[ $i -eq $LevelSteps ]]; then
brightnessctl -q s $NewLight
if [[ $LimitMaxIlluminanceReached -eq 1 ]]; then
NewLight=$MaxScreenBrightness
LimitMaxIlluminanceReached=0
fi
if [[ $LimitMinIlluminanceReached -eq 1 ]]; then
NewLight=$MinimumBrightness
LimitMinIlluminanceReached=0
fi
fi
brightnessctl -q s $NewLight
sleep $AnimationDelay
done
OldLight=$Light
fi
sleep $SensorDelay
fi
done
rm '/tmp/AB.running'
rm '/tmp/AB.kill'