# XXX: better use lockfile (or something), but it's not in current firmware
test -e /tmp/op_power.lock && exit 2
touch /tmp/op_power.lock
+highpow="$(cat /etc/pandora/conf/led.conf | grep HighPowerLED: | awk -F\: '{print $2}')"
+lowpow="$(cat /etc/pandora/conf/led.conf | grep LowPowerLED: | awk -F\: '{print $2}')"
debug(){
return 1 # 0 when debugging, 1 when not
suspend_net
cat /proc/pandora/cpu_mhz_max > /tmp/oldspeed
- /usr/pandora/scripts/op_cpuspeed.sh 125
+ /usr/pandora/scripts/op_cpuspeed.sh -n 125
}
lowPowerOff(){ # switch from lowpower to normal mode
oldspeed=$(cat /tmp/oldspeed)
- /usr/pandora/scripts/op_cpuspeed.sh $oldspeed
+ /usr/pandora/scripts/op_cpuspeed.sh -n $oldspeed
+ rm -f /tmp/oldspeed
display_on
resume_net
do
kill -CONT $PID
done
- echo 255 > /sys/class/leds/pandora\:\:power/brightness #power LED bright
+ echo $highpow > /sys/class/leds/pandora\:\:power/brightness #power LED bright
+}
+
+display_on_with_checks() {
+ # after turning on the display, we don't want lowpower state
+ # (which could be active because of some races)
+ if [ "$powerstate" = "buttonlowpower" -o "$powerstate" = "lidlowpower" -o \
+ -e /tmp/oldspeed ]
+ then
+ lowPowerOff
+ else
+ display_on
+ fi
}
show_message() {
# TODO: check if desktop is visible; maybe use layer3?
xfceuser=$(ps u -C xfce4-session | tail -n1 | awk '{print $1}')
- cmd="DISPLAY=:0.0 zenity --info --text \"$1\""
+ cmd="DISPLAY=:0.0 zenity --info --text \"$1\" --timeout 10"
su -c "$cmd" $xfceuser
}
return 1
fi
- # TODO: we probably want to NOT do real suspend if:
- # - cards don't unmount (running PNDs will break)
- # - while charging too, since it stops on suspend?
-
if ! grep -q 'mmc_core.removable=0' /proc/cmdline; then
# must unmount cards because they will be "ejected" on suspend
# (some filesystems may even deadlock if we don't do this due to bugs)
# get rid of modules that prevent suspend due to bugs
modules="$(lsmod | awk '{print $1}' | xargs echo)"
- blacklist="ehci_hcd g_zero g_audio g_ether g_serial g_midi gadgetfs g_file_storage
- g_mass_storage g_printer g_cdc g_multi g_hid g_dbgp g_nokia g_webcam g_ncm g_acm_ms"
+ blacklist="g_zero g_audio g_ether g_serial g_midi gadgetfs g_file_storage
+ g_mass_storage g_printer g_cdc g_multi g_hid g_dbgp g_nokia g_webcam g_ncm g_acm_ms
+ ehci_hcd bridgedriver"
restore_list=""
for mod in $modules; do
if echo $blacklist | grep -q "\<$mod\>"; then
# if we are here, either we already resumed or the suspend failed
if [ -n "$restore_list" ]; then
- modprobe $restore_list
+ for module in $restore_list; do
+ modprobe $module
+ done
fi
display_on
resume_net
- echo 255 > /sys/class/leds/pandora\:\:power/brightness
+ echo $highpow > /sys/class/leds/pandora\:\:power/brightness
# wait here a bit to prevent this script from running again (keep op_power.lock)
# in case user did resume using the power switch.
suspend_() {
# dim power LED
- echo 16 > /sys/class/leds/pandora\:\:power/brightness
+ echo $lowpow > /sys/class/leds/pandora\:\:power/brightness
if suspend_real; then
# resumed already
powerstate="on"
;;
*)
- (debug && echo "display_on") || display_on
+ (debug && echo "display_on") || display_on_with_checks
powerstate="on"
;;
esac
esac
fi
fi
- fi
+elif [[ "$2" == "screensaver" ]]; then
+ # warning: don't try to interact with X or do real suspend here -
+ # will cause various deadlocks
+ unset DISPLAY
+
+ if [[ "$1" == 0 ]]; then # deactivate screensaver
+ display_on_with_checks
+ powerstate="on"
+ elif [[ "$1" == 1 ]]; then # activate screensaver
+ display_off
+ fi
+fi
+
debug && echo "powerstate=$powerstate"
echo "$powerstate" > /tmp/powerstate