sxmo-utils/scripts/core/sxmo_screenlock.sh
Stacy Harper 8a27933c47 SWMO - SXMO over Wayland
This is a huge patch for Swmo, Sxmo over Sway.

It is Dwm backward compatible so dwm users should not expect regressions.

If you install all dependencies, you then can toggle between Sway and Dwm using a new config entry. It will reboot the phone.

This commit also contains:
    * Make the modemmonitor bullet proof
    * various other smaller fixes

Signed-off-by: Stacy Harper <contact@stacyharper.net>
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2021-08-22 13:23:22 +02:00

171 lines
4.2 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"
POWERRTC="/sys/class/wakeup/wakeup5/active_count"
OLD_RTC_WAKECOUNT="$XDG_RUNTIME_DIR/wakeup.rtc.count"
OLD_MODEM_WAKECOUNT="$XDG_RUNTIME_DIR/wakeup.modem.count"
OLD_POWER_WAKECOUNT="$XDG_RUNTIME_DIR/wakeup.power.count"
saveAllEventCounts() {
#these help us determine the reason of the next wakeup
cat "$WAKEUPRTC" > "$OLD_RTC_WAKECOUNT"
cat "$MODEMUPRTC" > "$OLD_MODEM_WAKECOUNT"
cat "$POWERRTC" > "$OLD_POWER_WAKECOUNT"
# TODO: add logic for modem wakeup
}
whichWake() {
#attempt to find the reason why we woke up:
if [ "$(cat "$POWERRTC")" -gt "$(cat "$OLD_POWER_WAKECOUNT")" ] ; then
echo "usb power"
elif [ "$(cat "$MODEMUPRTC")" -gt "$(cat "$OLD_MODEM_WAKECOUNT")" ] ; then
echo "modem"
elif [ "$(cat "$WAKEUPRTC")" -gt "$(cat "$OLD_RTC_WAKECOUNT")" ] ; then
echo "rtc"
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() {
#get the current state of the lock
if sxmo_wm.sh inputevent | grep -q on ; then
printf "unlock" #normal mode, not locked
elif sxmo_wm.sh dpms | grep -q off; then
printf "lock" #locked, but screen on
else
printf "off" #locked, and screen off
fi
}
updateLed() {
#set the LED to reflect the current lock state
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" ] && [ "$1" != "updateLed" ]; then
d=$(date)
echo "sxmo_screenlock: transitioning to stage $1 ($d)" >&2
fi
if [ "$1" = "lock" ] ; then
#locked state with screen on
# always echo last state first so that user can use it in their hooks
# TODO: Document LASTSTATE
getCurState > "$LASTSTATE"
sxmo_wm.sh dpms off
sxmo_wm.sh inputevent off
killall lisgd
updateLed
# Do we want this hook after disabling all the input devices so users can enable certain devices?
sxmo_hooks.sh lock
exit 0
elif [ "$1" = "unlock" ] ; then
#normal unlocked state, screen on
getCurState > "$LASTSTATE"
sxmo_wm.sh dpms off
sxmo_wm.sh inputevent on
sxmo_hooks.sh lisgdstart &
echo 16000 > "$NETWORKRTCSCAN"
updateLed
sxmo_hooks.sh unlock
exit 0
elif [ "$1" = "off" ] ; then
#locked state with screen off
getCurState > "$LASTSTATE"
sxmo_wm.sh dpms on
sxmo_wm.sh inputevent off
killall lisgd
updateLed
sxmo_hooks.sh screenoff
exit 0
elif [ "$1" = "crust" ] ; then
getCurState > "$LASTSTATE"
# USER MUST USE sxmo_screenlock.sh rtc rather than using rtcwake directly.
echo 1 > "$REDLED_PATH"
echo 0 > "$BLUELED_PATH"
saveAllEventCounts
sxmo_hooks.sh presuspend
YEARS8_TO_SEC=268435455
if command -v mnc > /dev/null; then
#wake up 10 seconds before the next cron event
suspend_time="$(($(crontab -l | grep sxmo_rtcwake | mnc)-10))"
fi
if [ -z "$suspend_time" ] || [ "$suspend_time" -gt "$YEARS8_TO_SEC" ]; then
suspend_time="$YEARS8_TO_SEC"
fi
if [ "$suspend_time" -gt 0 ]; then
#The actual suspension to crust happens here, mediated by rtcwake
rtcwake -m mem -s "$suspend_time"
#We woke up again
UNSUSPENDREASON=$(whichWake)
else
UNSUSPENDREASON=rtc # we fake the crust for those seconds
fi
echo "$UNSUSPENDREASON" > "$UNSUSPENDREASONFILE"
echo "crust" > "$LASTSTATE"
updateLed
d=$(date)
echo "sxmo_screenlock: woke up from crust (reason=$UNSUSPENDREASON) ($d)" >&2
if [ "$UNSUSPENDREASON" != "modem" ]; then
echo 1200 > "$NETWORKRTCSCAN"
fi
#this will in turn invoke the postwake hook
sxmo_postwake.sh "$UNSUSPENDREASON"
exit 0
elif [ "$1" = "getCurState" ] ; then
getCurState
exit 0
elif [ "$1" = "updateLed" ] ; then
updateLed
exit 0
fi
echo "usage: sxmo_screenlock.sh [lock|unlock|off|crust|rtc|getCurState|updateLed]">&2