#!/bin/sh
#
# zpm - Power Management for Zaurus SL-7500C 
# This program can adjust screen light & cpu clock

# 6502 ( walkdan@gmail.com ) 2007/12/20

# core data:
#   screenlight=
#   cpuclock=

VER=0.1.11

MODULE=unknown
if [ -e /proc/deviceinfo/product ]; then
    MODEL=`cat /proc/deviceinfo/product` 
fi
        
usage()
{
    cat <<EOF

zpm-$VER - Power Management for Zaurus/SL-7500C
(C)6502<walkdan@gmail.com>

Usage: `basename $0` [OPTIONS]
    -h, --help                      Display this help and exit.
     p, -p, --powersaver            Scheme: Super Power Saver, -s=1 -c=121
     n, -n, --normal                Scheme: Normal, -s=4 -c=161
     P, -P, --highperf              Scheme: High Performence, -s=6 -c=162 
    -b, --black                     Set screen black, -s=0   
    -s, --screenlight=LIGHT         Set screen light, value is 0~6
    -c, --cpuclock=CPUCLOCK         Set cpu clock, CPUCLOCK=121,141,161,162
     o, -o, --option                Show options, let user to choose
    -V, --version                   Show version number
     +,                             Increase light
     -,                             Decrease light
EOF
}

log_err()
{
    echo "$@" >&2
}

do_option()
{
    echo
    echo "choose light:"
    select screenlight in 1 2 3 4 5 6; do
        break
    done

    echo
    echo "choose clock:"
    select clock in "121 - lowest" "141 - low" "161 - normal" "162 - high"; do
        cpuclock=${clock% -*}
        break
    done
}

parse_arguments()
{
    for arg do
        [ -z $debug] || log_err "$arg"
        case "$arg" in
            -h|--help)      usage; exit 0;;
            p|-p|--powersaver)parse_arguments -s=1 -c=121;;
            n|-n|--normal)  parse_arguments -s=4 -c=161;;
            P|-P|--highperf)parse_arguments -s=6 -c=162;;
            -b|--black)     parse_arguments -s=0;;
            --screenlight=*)screenlight=`echo "$arg" | sed -e "s;--screenlight=;;"`;;
            -s=*)           screenlight=`echo "$arg" | sed -e "s;-s=;;"`;;
            --cpuclock=*)   cpuclock=`echo "$arg" | sed -e "s;--cpuclock=;;"`;;
            -c=*)           cpuclock=`echo "$arg" | sed -e "s;-c=;;"`;;
            o|-o|--option)  do_option;;
            +)              setfl +;;
            -)              setfl -;;
            -D|--debug)     debug="on";;
            -V|--version)   echo "zpm version:$VERSION";;
            *)              log_err "bad argument:$arg"; exit 1;;
        esac
    done

    #exit 0;
}

if [ $# -eq 0 ]; then
    usage
    exit 1
fi

parse_arguments "$@"

[ -z $debug ] || log_err "[screenlight=$screenlight,cpuclock=$cpuclock, model=$MODEL]"

#check model
case "$MODEL" in
    SL-C860|SL-C760|SL-C750|SL-7500|SL-C700)
        ;;
    *)
        echo "$MODEL Not support!"
        exit 1
        ;;
esac

#set screenlight
if [ ! -z $screenlight ]; then
    # check screenlight
    if [ $screenlight -lt 0 -o $screenlight -gt 6 ]; then
        log_err "bad screenlight argument:$screenlight"
        exit 1
    fi

    setfl $screenlight
    echo "Screen light: $screenlight"
fi

#set cpuclock
if [ ! -z $cpuclock ]; then
    # check cpuclock
    if [ $cpuclock -lt 121 -o $cpuclock -gt 162 ]; then
        log_err "bad cpuclock argument:$cpuclock"
        exit 1
    fi

    echo $cpuclock > /proc/cccr_change
    echo "Clock: `cat /proc/cccr_change`"
fi
