#!/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 # all we know is it's not the rtc. Maybe modem? # TODO: Check mmcli or something or sxmo's notifs when # https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/356 # https://gitlab.com/postmarketOS/pmaports/-/merge_requests/2066 # fixed # TODO: Document UNSUSPENDREASONFILE echo "nonrtc" > "$UNSUSPENDREASONFILE" if [ "$(whichWake)" = "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