sxmo-utils/scripts/core/sxmo_screenlock.sh
Stacy Harper 4e36154aef
fix going back to crust after sms or missed call
RTC loops was storing the good wake up reason but not the classic crust.

We fix it to notify the modemmonitor with the reason of the wake. This
should solve the issue and put the phone back to crust after sms.
2021-06-21 08:54:17 +02:00

203 lines
5.3 KiB
Bash
Executable file

#!/usr/bin/env sh
# include common definitions
# shellcheck source=scripts/core/sxmo_common.sh
. "$(dirname "$0")/sxmo_common.sh"
# Run xinput and get touchscreen id
TOUCH_POINTER_ID="${TOUCH_POINTER_ID:-"8"}"
REDLED_PATH="/sys/class/leds/red:indicator/brightness"
BLUELED_PATH="/sys/class/leds/blue:indicator/brightness"
WAKEUPRTC="/sys/class/wakeup/wakeup1/active_count"
MODEMUPRTC="/sys/class/wakeup/wakeup10/active_count"
NETWORKRTCSCAN="/sys/module/8723cs/parameters/rtw_scan_interval_thr"
OLD_RTC_WAKECOUNT="$XDG_RUNTIME_DIR/wakeup.rtc.count"
OLD_MODEM_WAKECOUNT="$XDG_RUNTIME_DIR/wakeup.modem.count"
saveAllEventCounts() {
cat "$WAKEUPRTC" > "$OLD_RTC_WAKECOUNT"
cat "$MODEMUPRTC" > "$OLD_MODEM_WAKECOUNT"
# TODO: add logic for modem wakeup
}
whichWake() {
if [ "$(cat "$WAKEUPRTC")" -gt "$(cat "$OLD_RTC_WAKECOUNT")" ] ; then
echo "rtc"
elif [ "$(cat "$MODEMUPRTC")" -gt "$(cat "$OLD_MODEM_WAKECOUNT")" ] ; then
echo "modem"
else
# button does not have a active count so if it's none of the above, it has to be the button
echo "button"
fi
}
getCurState() {
if xinput list-props "$TOUCH_POINTER_ID" | grep "Device Enabled" | grep -q "0$"; then
if xset q | grep -q "Off: 3"; then
echo "off"
else
echo "lock"
fi
else
echo "unlock"
fi
}
updateLed() {
case "$(getCurState)" in
"off")
echo 1 > "$REDLED_PATH"
echo 1 > "$BLUELED_PATH"
;;
"lock")
echo 0 > "$REDLED_PATH"
echo 1 > "$BLUELED_PATH"
;;
"unlock")
echo 0 > "$REDLED_PATH"
echo 0 > "$BLUELED_PATH"
;;
esac
}
if [ "$1" != "getCurState" ]; then
d=$(date)
echo "sxmo_screenlock: transitioning to stage $1 ($d)" >&2
fi
if [ "$1" = "lock" ] ; then
# always echo last state first so that user can use it in their hooks
# TODO: Document LASTSTATE
getCurState > "$LASTSTATE"
# Do we want this hook after disabling all the input devices so users can enable certain devices?
if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/lock" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/lock"
fi
xset dpms 0 0 0
xset dpms force on
# TODO: Could be improved by running xinput and disabling ALL input devices automatically but would need
# to decide on the hook issues. Do we want a prelock and postlock? Or should users
# be expected to edit the source code for disabling certain input devices?
# this code allows us to not use the slock locking mechanism in the original sxmo_lock.sh
# when combined with a working slock (see ~iv's) implementation, this should be secure.
xinput disable "$TOUCH_POINTER_ID"
killall lisgd
updateLed
exit 0
elif [ "$1" = "unlock" ] ; then
getCurState > "$LASTSTATE"
if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/unlock" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/unlock"
fi
xset dpms 0 0 0
xset dpms force on
xinput enable "$TOUCH_POINTER_ID"
sxmo_lisgdstart.sh
updateLed
exit 0
elif [ "$1" = "off" ] ; then
getCurState > "$LASTSTATE"
# TODO: document this hook
if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/screenoff" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/screenoff"
fi
xset dpms 0 0 3
xset dpms force off
# stop responding to input
xinput disable "$TOUCH_POINTER_ID"
killall lisgd
updateLed
exit 0
elif [ "$1" = "crust" ] ; then
getCurState > "$LASTSTATE"
if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/presuspend" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/presuspend"
fi
echo 1 > "$REDLED_PATH"
echo 0 > "$BLUELED_PATH"
xset dpms force off
# configure crust
# TODO: disable all wakeup sources other than button, rtc, and modem.
# TODO: make sure there is logic in whichWake and saveAllEventCounts functions
# Do I need to unbind? https://git.sr.ht/~mil/sxmo-utils/commit/bcf4f5c24968df0055d15a9fca649f67de9ced6a
echo "deep" > /sys/power/mem_sleep # deep sleep
echo "mem" > /sys/power/state
echo "crust" > "$LASTSTATE"
d=$(date)
echo "sxmo_screenlock: woke up from crust ($d)" >&2
updateLed
xset dpms force on
UNSUSPENDREASON=$(whichWake)
echo "$UNSUSPENDREASON" > "$UNSUSPENDREASONFILE"
if [ "$UNSUSPENDREASON" = "button" ] && [ -x "$XDG_CONFIG_HOME/sxmo/hooks/postwake" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/postwake"
fi
exit 0
elif [ "$1" = "rtc" ] ; then
getCurState > "$LASTSTATE"
# USER MUST USE sxmo_screenlock.sh rtc rather than using rtcwake directly.
# With this new version of lock, we dont check the exit code of the user hook. User must execute "sxmo_screenlock.sh rtc $TIME" at the end of their hook (depending on whether they want to re-rtc)
echo 1 > "$REDLED_PATH"
echo 0 > "$BLUELED_PATH"
saveAllEventCounts
if [ -x "$XDG_CONFIG_HOME/sxmo/hooks/presuspend" ]; then
"$XDG_CONFIG_HOME/sxmo/hooks/presuspend"
fi
xset dpms force off
rtcwake -m mem -s "$2"
UNSUSPENDREASON=$(whichWake)
echo "$UNSUSPENDREASON" > "$UNSUSPENDREASONFILE"
echo "crust" > "$LASTSTATE"
updateLed
if [ "$UNSUSPENDREASON" = "rtc" ]; then
WAKEHOOK="$XDG_CONFIG_HOME/sxmo/hooks/rtcwake";
elif [ "$UNSUSPENDREASON" = "button" ]; then
WAKEHOOK="$XDG_CONFIG_HOME/sxmo/hooks/postwake";
fi
d=$(date)
echo "sxmo_screenlock: woke up from crust (reason=$UNSUSPENDREASON) ($d)" >&2
if [ "$UNSUSPENDREASON" != "rtc" ]; then
xset dpms force on
fi
if [ -x "$WAKEHOOK" ]; then
echo 1200 > "$NETWORKRTCSCAN"
"$WAKEHOOK"
echo 16000 > "$NETWORKRTCSCAN"
fi
exit 0
elif [ "$1" = "getCurState" ] ; then
getCurState
exit 0
fi
echo "usage: sxmo_screenlock.sh [lock|unlock|off|crust|rtc|getCurState]">&2