diff options
author | Thomas Rijpstra | 2024-09-03 14:04:24 +0200 |
---|---|---|
committer | Thomas Rijpstra | 2024-09-03 14:04:24 +0200 |
commit | 8ab4d79ab03f237ae50d2a36d42e8e641ac8cfac (patch) | |
tree | ff67be5e75d89b13e8c6f4db4e7dee871409ab50 | |
parent | c2926eb19ab6e07b28859b171ed1acd493606770 (diff) | |
download | aur-8ab4d79ab03f237ae50d2a36d42e8e641ac8cfac.tar.gz |
feat: allow manually changing brightness when enabled
-rw-r--r-- | .SRCINFO | 4 | ||||
-rw-r--r-- | PKGBUILD | 4 | ||||
-rwxr-xr-x | auto-brightness.sh | 193 |
3 files changed, 134 insertions, 67 deletions
@@ -1,6 +1,6 @@ pkgbase = auto-brightness pkgdesc = A script to automatically adjust screen brightness based on ambient light - pkgver = 1.0.2 + pkgver = 1.0.3 pkgrel = 1 url = https://github.com/trijpstra-fourlights/auto-brightness arch = any @@ -12,7 +12,7 @@ pkgbase = auto-brightness source = auto-brightness.service source = auto-brightness.conf source = wait-for-als-sensor.sh - sha256sums = 62358fd73d1934261e3259c3075b64605540058c0b9eea92cf240a3b8d5ebf1e + sha256sums = 6c3f60a736cda1d9fe363253e4126ff408999e6479f8a41704f1c1ed268acf04 sha256sums = 0cb8db3700b878e82c42cdd2e95893d12dc926f106742d6bccfe1a7f395f2800 sha256sums = 4a2f4e4a331df6c2e3cda53b0cb38161fd5cff153253166d740d0c86b8d444a8 sha256sums = e208630a23360de4e336649c6bc0970b3c3dfecf5b906d3e334530dd279be9c6 @@ -1,6 +1,6 @@ # Maintainer: Thomas Rijpstra <thomas at fourlights dot nl> pkgname=auto-brightness -pkgver=1.0.2 +pkgver=1.0.3 pkgrel=1 pkgdesc="A script to automatically adjust screen brightness based on ambient light" arch=('any') @@ -11,7 +11,7 @@ source=("auto-brightness.sh" "auto-brightness.service" "auto-brightness.conf" "wait-for-als-sensor.sh") -sha256sums=('62358fd73d1934261e3259c3075b64605540058c0b9eea92cf240a3b8d5ebf1e' +sha256sums=('6c3f60a736cda1d9fe363253e4126ff408999e6479f8a41704f1c1ed268acf04' '0cb8db3700b878e82c42cdd2e95893d12dc926f106742d6bccfe1a7f395f2800' '4a2f4e4a331df6c2e3cda53b0cb38161fd5cff153253166d740d0c86b8d444a8' 'e208630a23360de4e336649c6bc0970b3c3dfecf5b906d3e334530dd279be9c6') diff --git a/auto-brightness.sh b/auto-brightness.sh index fd43bae2f606..256f354bc36a 100755 --- a/auto-brightness.sh +++ b/auto-brightness.sh @@ -9,10 +9,10 @@ DEFAULT_MAX_BRIGHTNESS_DELTA=1 # Source the main configuration file if it exists source_config() { - MAIN_CONFIG_FILE="/etc/conf.d/auto-brightness.conf" - if [ -f "$MAIN_CONFIG_FILE" ]; then - source "$MAIN_CONFIG_FILE" - fi + MAIN_CONFIG_FILE="/etc/conf.d/auto-brightness.conf" + if [ -f "$MAIN_CONFIG_FILE" ]; then + source "$MAIN_CONFIG_FILE" + fi } # Function to source individual configuration files in /etc/conf.d/auto-brightness.d/ @@ -25,25 +25,35 @@ source_individual_configs() { fi } -read_config() { - source_config - source_individual_configs - - # Set the configuration values, using defaults if not set in the config file or individual files - max_brightness_sensor_value=${max_brightness_sensor_value:-$DEFAULT_MAX_BRIGHTNESS_SENSOR_VALUE} - min_brightness_sensor_value=${min_brightness_sensor_value:-$DEFAULT_MIN_BRIGHTNESS_SENSOR_VALUE} - update_interval_s=${update_interval_s:-$DEFAULT_UPDATE_INTERVAL_S} - min_brightness_delta=${min_brightness_delta:-$DEFAULT_MIN_BRIGHTNESS_DELTA} - max_brightness_delta=${max_brightness_delta:-$DEFAULT_MAX_BRIGHTNESS_DELTA} - - refresh_config_interval_s=$(if [ $(awk "BEGIN {print ($update_interval_s > 1)}") -eq 1 ]; then echo $update_interval_s; else echo 1; fi) - refresh_config_count_max=$(awk "BEGIN {print ($refresh_config_interval_s / $update_interval_s)}") - refresh_config_count=0 +# Functions +get_max_brightness() { + # Set max_brightness, fallback to the device's max_brightness if not set or -1 + if [ -z "$max_brightness" ] || [ "$max_brightness" -eq -1 ]; then + echo $(get_device_max_brightness) + fi + echo $max_brightness } -read_config +get_device_max_brightness() { + echo $(cat ${brightness_path}/max_brightness) +} + +get_brightness() { + echo $(cat ${brightness_path}/brightness) +} + +get_illuminance() { + echo $(cat ${sensor_path}/in_illuminance_raw) +} + +brightness_percentage() { + local current=$1 + local maximum=$2 + maximum=${maximum:-$(get_device_max_brightness)} + + echo "$(awk "BEGIN {print (100 * $current / $maximum)}")%" +} -# Functions to find devices find_iio_device_with_illuminance() { for device in /sys/bus/iio/devices/iio:device*; do if [ -f "$device/in_illuminance_raw" ]; then @@ -66,24 +76,9 @@ find_backlight_device() { return 1 } -# Set paths, using explicit values from config or finding them -brightness_path=${brightness_path:-$(find_backlight_device)} -sensor_path=${sensor_path:-$(find_iio_device_with_illuminance)} - -# Exit if devices are not found -if [[ $brightness_path == "No device with brightness found." || $sensor_path == "No device with in_illuminance_raw found." ]]; then - echo "Required device not found. Exiting." - exit 1 -fi - -# Set max_brightness, fallback to the device's max_brightness if not set or 0 -if [ -z "$max_brightness" ] || [ "$max_brightness" -eq 0 ]; then - max_brightness=$(cat ${brightness_path}/max_brightness) -fi - # Function to test write access to brightness setting test_write_access() { - local current_brightness=$(cat ${brightness_path}/brightness) + local current_brightness=$(get_brightness) if ! echo $current_brightness | tee ${brightness_path}/brightness > /dev/null 2>&1; then echo "Error: Unable to write to ${brightness_path}/brightness." echo "Please ensure the script has the necessary permissions to write to the brightness setting." @@ -92,46 +87,118 @@ test_write_access() { fi } -# Test write access -test_write_access - # Function to set smoothly set brightness set_brightness_smooth() { - local target_brightness=$1 - - local target=$target_brightness - if [ $max_brightness_delta -ne -1 ]; then - if [ $(($target_brightness - $current_brightness)) -gt $max_brightness_delta ]; then - target=$((current_brightness + $max_brightness_delta)) - elif [ $(($current_brightness - $target_brightness)) -gt $max_brightness_delta ]; then - target=$((current_brightness - $max_brightness_delta)) - fi - fi - - #echo "Setting brightness to $target" - echo $target | tee ${brightness_path}/brightness > /dev/null + local target_brightness=$1 + + local target=$target_brightness + if [ $max_brightness_delta -ne -1 ]; then + if [ $(($target_brightness - $current_brightness)) -gt $max_brightness_delta ]; then + target=$((current_brightness + $max_brightness_delta)) + elif [ $(($current_brightness - $target_brightness)) -gt $max_brightness_delta ]; then + target=$((current_brightness - $max_brightness_delta)) + fi + fi + + #echo "Setting brightness to $target" + echo $target | tee ${brightness_path}/brightness > /dev/null } +# Function to read configuration +read_config() { + local old_min_brightness_delta=${min_brightness_delta:--1} + local old_max_brightness_delta=${max_brightness_delta:--1} + local old_max_brightness=${max_brightness:--1} + local old_brightness_path=${brightness_path:-""} + local old_sensor_path=${sensor_path:-""} + + source_config + source_individual_configs + + # Set the configuration values, using defaults if not set in the config file or individual files + max_brightness_sensor_value=${max_brightness_sensor_value:-$DEFAULT_MAX_BRIGHTNESS_SENSOR_VALUE} + min_brightness_sensor_value=${min_brightness_sensor_value:-$DEFAULT_MIN_BRIGHTNESS_SENSOR_VALUE} + update_interval_s=${update_interval_s:-$DEFAULT_UPDATE_INTERVAL_S} + min_brightness_delta=${min_brightness_delta:-$DEFAULT_MIN_BRIGHTNESS_DELTA} + max_brightness_delta=${max_brightness_delta:-$DEFAULT_MAX_BRIGHTNESS_DELTA} + + refresh_config_interval_s=$(if [ $(awk "BEGIN {print ($update_interval_s > 1)}") -eq 1 ]; then echo $update_interval_s; else echo 1; fi) + refresh_config_count_max=$(awk "BEGIN {print ($refresh_config_interval_s / $update_interval_s)}") + refresh_config_count=0 + + # Check if config values have changed, and if so, continue the auto-sensor if it was paused + if [ $old_min_brightness_delta -ne $min_brightness_delta ] || [ $old_max_brightness_delta -ne $max_brightness_delta ] || [ $old_max_brightness -ne $max_brightness ] || [[ $old_brightness_path != $brightness_path ]] || [[ $old_sensor_path != $sensor_path ]]; then + # Set paths, using explicit values from config or finding them + brightness_path=${brightness_path:-$(find_backlight_device)} + sensor_path=${sensor_path:-$(find_iio_device_with_illuminance)} + + if [ $old_max_brightness -ne $max_brightness ] || [[ $old_brightness_path != $brightness_path ]]; then + max_brightness=$(get_max_brightness) + fi + + last_brightness=$(get_brightness) + if [ ! -z $backoff ] && [ $backoff -eq 1 ]; then + echo "(auto-brightness/resume) Config has changed"; + backoff=0 + fi + fi +} + +read_config + + +# Exit if devices are not found +if [[ $brightness_path == "No device with brightness found." || $sensor_path == "No device with in_illuminance_raw found." ]]; then + echo "Required device not found. Exiting." + exit 1 +fi + +max_brightness=$(get_max_brightness) + +# Test write access +test_write_access + +last_brightness=$(get_brightness) +backoff=0 + while true; do if [ $refresh_config_count -eq $refresh_config_count_max ]; then read_config fi - current_brightness=$(cat ${brightness_path}/brightness) - sensor=$(cat ${sensor_path}/in_illuminance_raw) - # Clamp sensor value - if [ $sensor -lt $min_brightness_sensor_value ]; then sensor=$min_brightness_sensor_value; fi - if [ $sensor -gt $max_brightness_sensor_value ]; then sensor=$max_brightness_sensor_value; fi + current_brightness=$(get_brightness) + illuminance=$(get_illuminance) + + # check if brightness has changed unexpectedly + if [ $current_brightness -lt $((last_brightness - min_brightness_delta)) ] || [ $current_brightness -gt $((last_brightness + min_brightness_delta)) ]; then + if [ $backoff -eq 0 ]; then + echo "(auto-brightness/pause) Brightness was changed externally. Backing off until it's back in range." + backoff=1 + fi + + sleep $update_interval_s + refresh_config_count=$((refresh_config_count + 1)) + continue + fi + + if [ $backoff -eq 1 ]; then + echo "(auto-brightness/resume) Brightness is back in range." + backoff=0; + fi - target_brightness=$((sensor * max_brightness / max_brightness_sensor_value)) + # Clamp illuminance value + if [ $illuminance -lt $min_brightness_sensor_value ]; then sensor=$min_brightness_sensor_value; fi + if [ $illuminance -gt $max_brightness_sensor_value ]; then sensor=$max_brightness_sensor_value; fi - should_update=$(if [ $current_brightness -lt $((target_brightness - min_brightness_delta)) ] || [ $current_brightness -gt $((target_brightness + min_brightness_delta)) ]; then echo 1; else echo 0; fi) + target_brightness=$((illuminance * max_brightness / max_brightness_sensor_value)) - if [ "$should_update" -eq 1 ]; then - set_brightness_smooth $target_brightness - sleep 0.01 + if [ $current_brightness -lt $((target_brightness - min_brightness_delta)) ] || [ $current_brightness -gt $((target_brightness + min_brightness_delta)) ]; then + set_brightness_smooth $target_brightness + last_brightness=$(get_brightness) + sleep 0.01 else - sleep $update_interval_s + last_brightness=$(get_brightness) + sleep $update_interval_s refresh_config_count=$((refresh_config_count + 1)) fi done |