diff --git a/AB.service b/AB.service index 812aabe..d6aa319 100644 --- a/AB.service +++ b/AB.service @@ -1,10 +1,10 @@ [Unit] -Description=Mac-like-automatic-brightness as service +Description=Mac like automatic brightness as service [Service] Type=simple -Restart=on-failure -RestartSec=5s +Restart=no +RestartSec=1 ExecStart=/usr/local/bin/AutomaticBrightness.sh diff --git a/AutomaticBrightness.sh b/AutomaticBrightness.sh index 23c8eb7..4e8ee3f 100755 --- a/AutomaticBrightness.sh +++ b/AutomaticBrightness.sh @@ -1,19 +1,18 @@ #!/bin/bash -#How much light change must be seen by the sensor before it will act +#How much light change must be seen by the sensor befor it will act LightChange=10 #How often it check the sensor SensorDelay=1 -# Scale sensor to display brightness range -# NOW WITH FLOAT SUPPORT -SensorToDisplayScale=1 +# Scale sesor to displas brightness range +SensorToDisplayScale=24 -# 12 steps is the most similar on a Macbook 2017 running Arch compared to MacOS -LevelSteps=12 -# Plays the 12 step effectively at 30 FPS 32ms -AnimationDelay=0.032 +#This should match your refesh rate other wise it will either change the back light more times than needed or too few for a smooth animation +LevelSteps=60 +# The is should match the LevelSteps but in the acual time each event should take to see +AnimationDelay=0.016 # Read the variable names @@ -21,12 +20,9 @@ MinimumBrightness=001 -# 2 : Default | 1 : Add Offset | 0 : Subtract Offset, Recommended not to change +# 2 : Default | 1 : Add Offset | 0 : Subtract Offset, Recomended not to change op=2 - -# Only look for flags -i or -d with an additional value -# AutomaticBrightness.sh -i 100 while getopts i:d: flag do case "${flag}" in @@ -37,7 +33,6 @@ do esac done -# Verify offset file exists and if so read it if [[ -f /dev/shm/AB.offset ]] then OffSet=$(cat /dev/shm/AB.offset) @@ -47,10 +42,10 @@ else $(chmod 666 /dev/shm/AB.offset) fi -#if no offset or its less than 0 make 0 + OffSet=$((OffSet < 0 ? 0 : OffSet)) -# relatively change number in Offset file and write it + if [[ $op -lt 2 ]] then if [[ $op -eq 1 ]] @@ -60,7 +55,6 @@ then OffSet=$((OffSet - num)) fi - # verify offset is not less than 0 OffSet=$((OffSet < 0 ? 0 : OffSet)) $(echo $OffSet > /dev/shm/AB.offset) @@ -75,19 +69,14 @@ priority=19 # Priority level , 0 = regular app , 19 = very much background app # Set the priority of the current script, Thank you Theluga. renice "$priority" "$$" -sleep 5 - -# Get screen max brightness value MaxScreenBrightness=$(find -L /sys/class/backlight -maxdepth 2 -name "max_brightness" 2>/dev/null | grep "max_brightness" | xargs cat) -# Set path to current screen brightness value BLightPath=$(find -L /sys/class/backlight -maxdepth 2 -name "brightness" 2>/dev/null | grep "brightness") -# Set path to current luminance sensor LSensorPath=$(find -L /sys/bus/iio/devices -maxdepth 2 -name "in_illuminance_raw" 2>/dev/null | grep "in_illuminance_raw") -#Set the current light value so we have something to compare to + OldLight=$(cat $LSensorPath) while true @@ -102,14 +91,16 @@ do fi Light=$(cat $LSensorPath) - ## apply offset to current light value Light=$((Light + OffSet)) - # Set allowed range for light - - MaxOld=$((OldLight + OldLight/LightChange)) - MinOld=$((OldLight - OldLight/LightChange)) - + 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 @@ -117,15 +108,12 @@ do CurrentBrightness=$(cat $BLightPath) - # Add MinimumBrightness here to not effect comparison but the outcome - Light=$(LC_NUMERIC=C printf "%.0f" $(echo "scale=2; $Light + ( ($MaxScreenBrightness * ( $MinimumBrightness / 100 )) / $SensorToDisplayScale ) " | bc )) - - # Generate a TempLight value for the screen to be set to - # Float math thanks Matthias_Wachter - TempLight=$(LC_NUMERIC=C printf "%.0f" $(echo "scale=2; $Light * $SensorToDisplayScale" | bc)) + + Light=$(( $Light + $MinimumBrightness )) - # Check we do not ask the screen to go brighter than it can + TempLight=$(($Light * $SensorToDisplayScale)) + if [[ $TempLight -gt $MaxScreenBrightness ]] then NewLight=$MaxScreenBrightness @@ -133,46 +121,26 @@ do NewLight=$TempLight fi - # How different should each stop be - DiffCount=$(LC_NUMERIC=C printf "%.0f" $(echo "scale=2; ( $NewLight - $CurrentBrightness ) / $LevelSteps" | bc )) + DiffCount=$(( ($NewLight - $CurrentBrightness)/$LevelSteps )) - # Step once per Screen Hz to make animation for i in $(eval echo {1..$LevelSteps} ) do - # Set new relative light value NewLight=$(( $DiffCount )) + if [[ $NewLight -lt 0 ]] + then + NewLight=$( echo "$NewLight" | awk -F "-" {'print$2'}) + NewLight=$(echo $NewLight-) + else + NewLight=$(echo +$NewLight) + fi - - CurrentBrightness=$(cat $BLightPath) - FakeLight=$(( $NewLight + $CurrentBrightness)) - - if [[ $FakeLight -gt $MaxScreenBrightness ]] - then - NewLight=$MaxScreenBrightness - echo "ERROR" - else - echo $FakeLight > $BLightPath - fi - - # Format values appropriately for brightnessctl - #if [[ $NewLight -lt 0 ]] - #then - #NewLight=$( echo "$NewLight" | awk -F "-" {'print$2'}) - #NewLight=$(echo $NewLight-) - #else - #NewLight=$(echo +$NewLight) - #fi - - # Adjust brightness relatively - #brightnessctl -q s $NewLight - # Sleep for the screen Hz time so he effect is visible + brightnessctl -q s $NewLight sleep $AnimationDelay done - - # Store new light as old light for next comparison + OldLight=$Light fi diff --git a/README.md b/README.md index 5fe392f..b9faf48 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,16 @@ # Mac-like-automatic-brightness A simple script to provide a "Mac" like automatic brightness adjustemnt/ animation. ## Now as a system service -Run ```setup.sh``` to make it a service and automaticaly set your ```SensorToDisplacScale``` +Run ```setup.sh``` to make it a service made for the FrameWork laptop based on 2017 MacBook Pro - read ```Configuration``` for detailed informatoion about what options you have to easily customize/ adjust the bightness or animation speed -## Updating -Run ```git pull``` to download the latest version - -Then run ```./setup -u``` to update the the service and script running on your system with newly downloaded / modifyed versions - - ## Requires -```bc``` -For running as your user you need to be part of the ```video``` group -```sudo usermod -a -G video $USER``` if your not apart of the group - -If your installing as a system service your user dose not need to be apart of the group +brightnessctl ## Non 12th Gen Intel Framework Owners Your sensor has a diffrent range thant the 12th Gen Intel Framework laptop sensors, please see chart bellow @@ -41,8 +30,6 @@ Your sensor has a diffrent range thant the 12th Gen Intel Framework laptop senso ```/dev/shm/AB.offset | Stores current offset for the sensor``` -* Changing the offset of your backlight while the service is running is one way you increase or decease your screen bightness but keep the automatic adjustments when the lighting changes - ## Configuring @@ -54,16 +41,14 @@ Your sensor has a diffrent range thant the 12th Gen Intel Framework laptop senso ```LevelSteps``` Sets amount of brightness steps, recomended to match refeshrate -```AnimationDelay``` Speed of the brightness animation(delay between each step), recomended screen refreshrate in seconds (0.16 of 60Hz) +```AnimationDelay``` Speed of the brightness animation(delay between each step), recomended screen refreshrate in seconds + +```MaxScreenBrightness``` The highest value your screen supports, check ```/sys/class/backlight/intel_backlight/max_brightness``` on framework laptops ```MinimunBrightness``` The minimum screen brightness, recomended minumim 001 so the backlight dosn't turn off -### Run``` setup.sh -u``` to update the installed script and service - -~~ Other things to note but shouldn't have to adjust +~~ Other things to note ```Light``` The file where your lightsensor has its current value ```CurrentBirghtness``` The file where your screen stores its current brightness - -```MaxScreenBrightness``` The highest value your screen supports, check ```/sys/class/backlight/intel_backlight/max_brightness``` on framework laptops diff --git a/setup.sh b/setup.sh index 628a942..8689d3c 100755 --- a/setup.sh +++ b/setup.sh @@ -1,58 +1,14 @@ #!/bin/bash -# -case $1 in - -u) echo "Updating Mac-like-automatic-brightness..." - echo "Stopping AB service..." - sudo systemctl kill AB - echo "Updating AutomaticBrightness.sh..." - echo "Cloning AutomaticBrightness.sh..." - sudo cp AutomaticBrightness.sh /usr/local/bin/AutomaticBrightness.sh - echo "Updating AB.service for systemD..." - echo "Cloning AB.service for systemD..." - sudo cp AB.service /etc/systemd/system/AB.service - echo "Restarting AB service..." - systemctl daemon-reload - sudo systemctl start AB - exit;; -esac - echo "Setting up AutomaticBrightness.sh as a service..." -echo "Calibrating Light Sensor Scale..." +echo "Cloning AutomaticBrighness.sh..." +sudo cp AutomaticBrightness.sh /usr/local/bin/ -LSensorPath=$(find -L /sys/bus/iio/devices -maxdepth 2 -name "in_illuminance_raw" 2>/dev/null | grep "in_illuminance_raw") - -MaxScreenBrightness=$(find -L /sys/class/backlight -maxdepth 2 -name "max_brightness" 2>/dev/null | grep "max_brightness" | xargs cat) - -echo "Put your sensor in a bright light (outside works best)" -read -p "Press Enter to continue..." - -Smax=$(cat $LSensorPath) - -Scale=$(echo "scale=2; $MaxScreenBrightness / $Smax" | bc) - -Final="SensorToDisplayScale=$Scale" - -awk -v new_phrase="$Final" '/SensorToDisplayScale=/{ print new_phrase; next } 1' AutomaticBrightness.sh > temp && mv temp AutomaticBrightness.sh - -TempSteps=($MaxScreenBrightness / 60) -if [[ TempSteps -lt 17 ]] -then - Steps=$($MaxScreenBrightness / 16) - NewStep="LevelSteps=$Steps" - - awk -v new_phrase="$NewStep" '/LevelSteps=/{ print new_phrase; next } 1' AutomaticBrightness.sh > temp && mv temp AutomaticBrightness.sh -fi - -echo "Cloning AutomaticBrightness.sh..." -sudo cp AutomaticBrightness.sh /usr/local/bin/AutomaticBrightness.sh -sudo chmod u+x /usr/local/bin/AutomaticBrightness.sh - -echo "Cloning AB.service for systemD..." -sudo cp AB.service /etc/systemd/system/AB.service +echo "Cloning AB.service for systemD" +sudo cp AB.service /etc/systemd/system/ -echo "Starting Service..." +echo "Startin Service..." sudo systemctl enable AB sudo systemctl start AB