diff --git a/AB.service b/AB.service index d6aa319..812aabe 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=no -RestartSec=1 +Restart=on-failure +RestartSec=5s ExecStart=/usr/local/bin/AutomaticBrightness.sh diff --git a/AutomaticBrightness.sh b/AutomaticBrightness.sh index 4e8ee3f..23c8eb7 100755 --- a/AutomaticBrightness.sh +++ b/AutomaticBrightness.sh @@ -1,18 +1,19 @@ #!/bin/bash -#How much light change must be seen by the sensor befor it will act +#How much light change must be seen by the sensor before it will act LightChange=10 #How often it check the sensor SensorDelay=1 -# Scale sesor to displas brightness range -SensorToDisplayScale=24 +# Scale sensor to display brightness range +# NOW WITH FLOAT SUPPORT +SensorToDisplayScale=1 -#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 +# 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 # Read the variable names @@ -20,9 +21,12 @@ MinimumBrightness=001 -# 2 : Default | 1 : Add Offset | 0 : Subtract Offset, Recomended not to change +# 2 : Default | 1 : Add Offset | 0 : Subtract Offset, Recommended 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 @@ -33,6 +37,7 @@ 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) @@ -42,10 +47,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 ]] @@ -55,6 +60,7 @@ then OffSet=$((OffSet - num)) fi + # verify offset is not less than 0 OffSet=$((OffSet < 0 ? 0 : OffSet)) $(echo $OffSet > /dev/shm/AB.offset) @@ -69,14 +75,19 @@ 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 @@ -91,16 +102,14 @@ do fi Light=$(cat $LSensorPath) + ## apply offset to current light value Light=$((Light + OffSet)) - if [[ $Light -lt $LightChange ]] - then - MaxOld=$((OldLight + LightChange)) - MinOld=$((OldLight - LightChange)) - else - MaxOld=$((OldLight + OldLight/LightChange)) - MinOld=$((OldLight - OldLight/LightChange)) - fi + # Set allowed range for light + + MaxOld=$((OldLight + OldLight/LightChange)) + MinOld=$((OldLight - OldLight/LightChange)) + if [[ $Light -gt $MaxOld ]] || [[ $Light -lt $MinOld ]] then @@ -108,12 +117,15 @@ do CurrentBrightness=$(cat $BLightPath) - - Light=$(( $Light + $MinimumBrightness )) + # 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)) - TempLight=$(($Light * $SensorToDisplayScale)) - + # Check we do not ask the screen to go brighter than it can if [[ $TempLight -gt $MaxScreenBrightness ]] then NewLight=$MaxScreenBrightness @@ -121,26 +133,46 @@ do NewLight=$TempLight fi - DiffCount=$(( ($NewLight - $CurrentBrightness)/$LevelSteps )) + # How different should each stop be + DiffCount=$(LC_NUMERIC=C printf "%.0f" $(echo "scale=2; ( $NewLight - $CurrentBrightness ) / $LevelSteps" | bc )) + # 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 - brightnessctl -q s $NewLight + + 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 sleep $AnimationDelay done - + + # Store new light as old light for next comparison OldLight=$Light fi diff --git a/README.md b/README.md index b9faf48..5fe392f 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,27 @@ # 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 +Run ```setup.sh``` to make it a service and automaticaly set your ```SensorToDisplacScale``` 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 -brightnessctl +```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 ## Non 12th Gen Intel Framework Owners Your sensor has a diffrent range thant the 12th Gen Intel Framework laptop sensors, please see chart bellow @@ -30,6 +41,8 @@ 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 @@ -41,14 +54,16 @@ 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 - -```MaxScreenBrightness``` The highest value your screen supports, check ```/sys/class/backlight/intel_backlight/max_brightness``` on framework laptops +```AnimationDelay``` Speed of the brightness animation(delay between each step), recomended screen refreshrate in seconds (0.16 of 60Hz) ```MinimunBrightness``` The minimum screen brightness, recomended minumim 001 so the backlight dosn't turn off -~~ Other things to note +### Run``` setup.sh -u``` to update the installed script and service + +~~ Other things to note but shouldn't have to adjust ```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 8689d3c..628a942 100755 --- a/setup.sh +++ b/setup.sh @@ -1,14 +1,58 @@ #!/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 "Cloning AutomaticBrighness.sh..." -sudo cp AutomaticBrightness.sh /usr/local/bin/ +echo "Calibrating Light Sensor Scale..." -echo "Cloning AB.service for systemD" -sudo cp AB.service /etc/systemd/system/ +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 "Startin Service..." +echo "Starting Service..." sudo systemctl enable AB sudo systemctl start AB