You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.2 KiB
171 lines
4.2 KiB
#!/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
|
|
|