#!/bin/sh
# tlp - adjust power settings 
#
# Copyright (c) 2013 Thomas Koch <linrunner at gmx.net>
# This software is licensed under the GPL v2 or later.

# --- Constants
readonly LIBDIRS="/usr/lib/tlp-pm /usr/lib64/tlp-pm"
readonly LIBS="tlp-functions tlp-rf-func"

# --- Locate and source libraries
for libdir in $LIBDIRS; do [ -d $libdir ] && break; done
if [ ! -d $libdir ]; then
    echo "Error: missing library directory ($LIBDIRS)."
    exit 1
fi

for lib in $LIBS; do 
    if [ ! -f $libdir/$lib ]; then
        echo "Error: missing function library \'$libdir/$lib\'."
        exit 1
    fi
    . $libdir/$lib
done

# --- MAIN
read_defaults
check_tlp_enabled || exit 1
check_laptop_mode_tools || exit 2

# get cmd line args
mode=$(echo $1 | tr "[:upper:]" "[:lower:]")
mode2=$(echo $2 | tr "[:upper:]" "[:lower:]")
mode3=$(echo $3 | tr "[:upper:]" "[:lower:]")

echo_debug "run" "+++ mode=$mode $mode2 $mode3"
echo_debug "path" "PATH=$PATH"

case "$mode" in
    init) # system initialization/shutdown: sysv, upstart, systemd, ...
        case $mode2 in
            start|restart|force-reload)
                echo -n "Loading tp-smapi kernel module..."
                load_tp_modules
                echo "done. "
        
                init_radio_devices start
    
                echo -n "Setting battery charge thresholds..."
                set_charge_thresholds
                echo "done."

                # wake upowerd only if present & arg "upwr" is given
                if cmd_exists $UPWR && [ "$mode3" = "upwr" ]; then
                    echo -n "Starting upowerd..."
                    $UPWR -e > /dev/null 2>&1
                    echo "done."
                    echo_debug "run" "upower_start"
                fi
                ;;
        
            stop)
                init_radio_devices stop

                if [ "$USB_AUTOSUSPEND_DISABLE_ON_SHUTDOWN" = "1" ]; then
                    echo -n "Disabling usb autosuspend..."
                    set_usb_suspend 0 on
                    echo "done."
                fi
                
                # remove usb startup flag
                [ -f $USB_DONE ] && rm $USB_DONE
                ;;

            *)
                echo "Usage: tlp init {start|stop|restart|force-reload}" >&2
                exit 3
                ;;
        esac
        ;;

    start) # set start power mode depending on state
        check_root
        get_power_state
        pwr=$?
        load_tp_modules
        set_laptopmode $pwr
        set_dirty_parms $pwr
        set_scaling_governor $pwr
        set_scaling_min_max_freq $pwr
        set_cpu_boost_all $pwr
        set_sched_powersave $pwr
        set_nmi_watchdog
        set_phc_controls $pwr
        set_disk_apm_level $pwr
        set_disk_spindown_timeout $pwr
        set_disk_io_sched
        set_sata_link_power $pwr
        set_pcie_aspm $pwr
        set_radeon_profile $pwr
        set_wifi_power_mode $pwr
        disable_wake_on_lan $pwr
        set_sound_power_mode $pwr
        set_runtime_pm $pwr
        set_usb_suspend 0 auto
        set_charge_thresholds
        [ "$pwr" = "1" ] && poweroff_drivebay 0
        
        echo_started_mode $pwr
        ;;

    true|bat*) # set battery power mode
        check_root
        load_tp_modules
        set_laptopmode 1
        set_dirty_parms 1
        set_scaling_governor 1
        set_scaling_min_max_freq 1
        set_cpu_boost_all 1
        set_sched_powersave 1
        set_nmi_watchdog
        set_phc_controls 1
        set_disk_apm_level 1
        set_disk_spindown_timeout 1
        set_disk_io_sched
        set_sata_link_power 1
        set_pcie_aspm 1
        set_radeon_profile 1
        set_wifi_power_mode 1
        disable_wake_on_lan 1
        set_sound_power_mode 1
        set_runtime_pm 1
        [ "$X_TLP_USB_MODE" = "1" ] && set_usb_suspend 0 auto
        poweroff_drivebay 0
        
        echo_started_mode 1
        ;;
        
    false|ac) # set ac power mode
        check_root
        load_tp_modules
        set_laptopmode 0
        set_dirty_parms 0
        set_scaling_governor 0
        set_scaling_min_max_freq 0
        set_cpu_boost_all 0
        set_sched_powersave 0
        set_nmi_watchdog
        set_phc_controls 0
        set_disk_apm_level 0
        set_disk_spindown_timeout 0
        set_disk_io_sched
        set_sata_link_power 0
        set_pcie_aspm 0
        set_radeon_profile 0
        set_wifi_power_mode 0
        disable_wake_on_lan 0
        set_sound_power_mode 0
        set_runtime_pm 0
        [ "$X_TLP_USB_MODE" = "1" ] && enable_usb_suspend 0
         
        echo_started_mode 0
        ;;

    usb) # Enable usb autosuspend
        check_root
        set_usb_suspend 1 auto
        ;;
        
    bayoff) # power off drive bay
        check_root
        poweroff_drivebay 1
        ;;
        
    setcharge) # set charge thresholds (temporarily)
        check_root
        load_tp_modules
        setcharge_battery $2 $3 $4
        ;;

    fullcharge) # charge battery up to 100% (temporarily)
        check_root
        load_tp_modules
        setcharge_battery 96 100 $2
        ;;

    chargeonce) # charge battery to upper threshold once
        check_root
        load_tp_modules
        chargeonce_battery $2
        ;;

    discharge) # discharge battery completely (to recalibrate)
        check_root
        load_tp_modules
        discharge_battery $2
        ;;
        
    recalibrate) # recalibrate battery, i.e. discharge and charge to 100%
        check_root
        load_tp_modules
        setcharge_battery 96 100 $2
        discharge_battery $2
        ;;        
        
    stat) # show status
        shift
        tlp-stat $*
        ;;

    diskid) # show disk-by-id
        { for dev in $(ls /dev/disk/by-id/ | egrep '^ata' | egrep -v '\-part[1-9]+'); do
            if [ -n "$dev" ]; then
                get_disk_dev $dev
                echo "$disk_dev: $disk_id"
            fi
        done } | sort
        ;;
        
    *) 
        echo "Error: unknown command \"$mode\"."  1>&2
        echo "Usage: tlp start|true|bat|false|ac|wifi|usb|bayoff|discharge|setcharge|fullcharge|recalibrate|stat|diskid" 1>&2
        ;;
esac

exit 0


