Benutzerinformationen überspringen
Ubuntu: 12.04
Kernel: 3.2.0-24-generic
Desktop: KDE
Architektur: 64-bit
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
#!/bin/bash
#
# acerfand - Rudimentary automatic fan control for noisy Acer Aspire One models
#
# Author Rachel Greenham
#
# version 0.01
LOGGER=$(which logger)
if [ ! -x $LOGGER ] ; then
LOGGER="/usr/bin/logger"
fi
if [ ! -x $LOGGER ] ; then
echo "Warning, logger can't be found. Will log to stdout"
unset LOGGER
fi
LOGLEVEL="info"
log() {
if [ ! -z "$LOGGER" ] ; then
$LOGGER -p daemon.$LOGLEVEL -t acerfand "$@"
else
echo "$@"
fi
}
info() {
LOGLEVEL="info"
log "$@"
}
notice() {
LOGLEVEL="notice"
# log "$@"
}
err() {
LOGLEVEL="err"
log "$@"
}
if pgrep acerfand | grep -v $$ > /dev/null; then
info "acerfand already running"
exit 0
fi
ME=$(readlink -f $0)
ACEREC=$(which acer_ec.pl)
if [ -z $ACEREC ] ; then
ACEREC=$(dirname $ME)/acer_ec.pl
fi
if [ ! -r $ACEREC ] ; then
err "acer_ec.pl can't be found"
exit 1
fi
INTERVAL=5
FANOFF=60
FANAUTO=70
if [ -r "/etc/acerfand.conf" ] ; then
source "/etc/acerfand.conf"
fi
R_FAN=55
R_TEMP=58
FAN_CMD_OFF=21 # verändert von 1f auf 21 bei BIOS-Version3308
FAN_CMD_AUTO=0 # verändert von 00 auf 0 bei BIOS-Version3308
FAN_STATE_UNRECOGNIZED=0
FAN_STATE_AUTO=1
FAN_STATE_OFF=2
FAN_STATE_NAMES=("Unrecognized" "Auto" "Off")
FAN_STATE_CMDS=("$FAN_CMD_OFF" "$FAN_CMD_AUTO" "$FAN_CMD_OFF")
acer_ec() {
perl $ACEREC $@
}
getTemp() {
TEMP=$[$(acer_ec ?= $R_TEMP | cut -f 3 -d' ')]
notice "temp: $TEMP"
}
getRawFanState() {
RAW_FAN_STATE=$(acer_ec ?= $R_FAN | cut -f 3 -d' ')
}
getFanState() {
FAN_STATE=$FAN_STATE_UNRECOGNIZED
getRawFanState
if [ "$RAW_FAN_STATE" == "0x21" ]; then # verändert von 0x1f auf 0x21 bei BIOS-Version3308
FAN_STATE=$FAN_STATE_OFF
else
let A="$RAW_FAN_STATE & 0x10" || true
if [ "$A == 0" ] ; then
# ASSUMPTION: All values with nybble 1==0 denote auto
FAN_STATE=$FAN_STATE_AUTO
fi
fi
notice "read fan state ${FAN_STATE_NAMES[$FAN_STATE]}"
}
setFan() {
info "Set fan ${FAN_STATE_NAMES[$1]}"
acer_ec := $R_FAN ${FAN_STATE_CMDS[$1]} > /dev/null
}
govern() {
trap "info exiting;setFan $FAN_STATE_AUTO; exit" INT TERM EXIT
info "Starting to govern acer fan speed. Interval: $INTERVAL, fan-off: $FANOFF, fan-auto: $FANAUTO"
while true; do
getTemp
getFanState
case "$FAN_STATE" in
$FAN_STATE_AUTO)
if [ "$TEMP" -le "$FANOFF" ] ; then
setFan $FAN_STATE_OFF
fi
;;
$FAN_STATE_OFF)
if [ "$TEMP" -ge "$FANAUTO" ] ; then
setFan $FAN_STATE_AUTO
fi
;;
*)
# weird state. Let's turn it off,
# then decide next time around
setFan $FAN_STATE_OFF
;;
esac
sleep $INTERVAL
done
}
set -e
govern &
|
Benutzerinformationen überspringen
Ubuntu: 12.04
Kernel: 3.2.0-24-generic
Desktop: KDE
Architektur: 64-bit
Burning Board, entwickelt von WoltLab GmbH.
UbuntuFreunde von Easyy-S und basslord seit 06.12.06
Ubuntufreunde.de runs on ubuntu 10.04





