blob: eb4071c5bc15d3d8cf5fe19e6b39acca0850cf27 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#!/bin/bash
SLEEP_SECS=600
WAKE_SECS=30
LOCK_DIR="/tmp/sleepwalk"
start_deep_sleep() {
led_sleep
echo mem > /sys/power/state 2>/dev/null
return $?
}
wait_for_notifications() {
secs=$WAKE_SECS
is_led_on=0
while [ $secs -ge 0 ]; do
sleep 1
if [ $is_led_on == 0 ]; then
led_wake
is_led_on=1
else
led_disable
is_led_on=0
fi
if is_screen_on_or_inhibitor_active; then
break
fi
secs=$(($secs-1))
done
led_disable
}
schedule_wake_time() {
rtcwake -m no --date "+${SLEEP_SECS}s" 2>&1 >/dev/null
}
reset_wake_time() {
led_wake
> /sys/class/rtc/rtc0/wakealarm
}
is_screen_on_or_inhibitor_active() {
INHIBITORS=$(systemd-inhibit --list --no-legend \
| grep -e '[[:space:]]sleep[[:space:]]' \
| grep -e 'lock$')
if [ "$INHIBITORS" != "" ]; then
return 0
fi
return "$(cat /sys/class/backlight/backlight/bl_power)"
}
led_sleep() {
echo 1 > /sys/class/leds/green\:indicator/brightness
echo 0 > /sys/class/leds/red\:indicator/brightness
echo 0 > /sys/class/leds/blue\:indicator/brightness
}
led_wake() {
echo 0 > /sys/class/leds/green\:indicator/brightness
echo 1 > /sys/class/leds/red\:indicator/brightness
echo 0 > /sys/class/leds/blue\:indicator/brightness
}
led_disable() {
echo 0 > /sys/class/leds/green\:indicator/brightness
echo 0 > /sys/class/leds/red\:indicator/brightness
echo 0 > /sys/class/leds/blue\:indicator/brightness
}
if [ $EUID -ne 0 ]; then
echo "Needs root" >&2
exit 1
fi
if [ -z "$1" ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
cat <<-EOF >&2
Usage: sleepwalk [start/stop]
Commands:
start Start sleep cycle
stop Stop sleep cycle
EOF
exit
fi
if [ "$1" == "start" ]; then
if [ -d "$LOCK_DIR" ] || ! mkdir "$LOCK_DIR"; then
echo "sleepwalk is already running - run 'sleepwalk stop' to stop it" >&2
exit 1
fi
trap "$0 stop" EXIT
while [ -d "$LOCK_DIR" ]; do
while is_screen_on_or_inhibitor_active; do
sleep 60
done
reset_wake_time
schedule_wake_time
while ! start_deep_sleep; do
reset_wake_time
echo "Failed going to sleep, try again in $WAKE_SECS seconds ..." >&2
wait_for_notifications
schedule_wake_time
if is_screen_on_or_inhibitor_active; then
break
fi
done
wait_for_notifications
done
elif [ "$1" == "stop" ]; then
reset_wake_time
led_disable
rmdir "$LOCK_DIR" 2>/dev/null
else
echo "Unknown command: $1" >&2
exit 1
fi
|