Sunday, September 8, 2013

Kindle digital photo frame part 3: Changing screensavers every 3 hours

Getting the Kindle to change its screensaver is as simple as running /usr/bin/powerd_test -p twice. The script to do so:

/usr/bin/powerd_test -p
sleep 3
/usr/bin/powerd_test -p
view raw gistfile1.txt hosted with ❤ by GitHub

I wanted the screensaver to be changed every 3 hours, excluding nighttime. It's a matter of appending to /etc/crontab/root:

0 9 * * * /mnt/us/changeSS.sh
0 12 * * * /mnt/us/changeSS.sh
0 15 * * * /mnt/us/changeSS.sh
0 18 * * * /mnt/us/changeSS.sh
0 21 * * * /mnt/us/changeSS.sh
view raw gistfile1.txt hosted with ❤ by GitHub

Then I ran into a pesky problem. The screensaver changer works if I ran it manually. It doesn't work via the cron job. Or rather, I discovered that the Kindle goes to sleep after 1 minute in screensaver mode.

After fiddling with /usr/bin/powerd_test -s for quite some time I discovered the following. The Kindle has 4 power levels: Active, Screen Saver, Ready to suspend, and sleep. Active stays on for 10 minutes, Screen Saver stays on for 1 minute, and Ready to suspend stays on for 5 seconds. This is my log:

[root@kindle root]# /usr/bin/powerd_test -s
Powerd state: Active
Remaining time in this state: 581.725642
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s
Powerd state: Screen Saver
Remaining time in this state: 56.331120
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s
Powerd state: Screen Saver
Remaining time in this state: 0.984457
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s
Powerd state: Ready to suspend
Remaining time in this state: 4.947582
defer_suspend:0
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
view raw gistfile1.txt hosted with ❤ by GitHub

I can wake up my Kindle via the command "lipc-set-prop com.lab126.powerd wakeUp 1" provided it is in one of those 3 states. To try and suspend my Kindle in the "ScreenSaver" or "Ready to suspend" state for as long as possible, I investigated the seemingly useless property, deferSuspend, from com.lab126.powerd. When you run it, it gives the error:

com.lab126.powerd failed to set value for property deferSuspend (0x8 lipcErrNoSuchProperty)

I discovered that the property can only be set DURING THE READY TO SUSPEND STATE. That means after 11 minutes of leaving the Kindle alone I have a 5 second window to change the time left in "Ready to Suspend" state. See my logs:

csuspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
com.lab126.powerd failed to set value for property deferSuspend (0x8 lipcErrNoSu chProperty)
[root@kindle root]# /usr/bin/powerd_test -s; lipc-set-prop com.lab126.powerd def
erSuspend 1000
^[[APowerd state: Screen Saver
Remaining time in this state: 0.124960
defer_suspend:0
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
com.lab126.powerd failed to set value for property deferSuspend (0x8 lipcErrNoSu chProperty)
[root@kindle root]# /usr/bin/powerd_test -s; lipc-set-prop com.lab126.powerd def
erSuspend 1000
Powerd state: Ready to suspend
Remaining time in this state: 4.070775
defer_suspend:0
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s; lipc-set-prop com.lab126.powerd def
erSuspend 1000
Powerd state: Ready to suspend
Remaining time in this state: 999.684285
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s; lipc-set-prop com.lab126.powerd def
erSuspend 3000000
Powerd state: Ready to suspend
Remaining time in this state: 995.529458
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]# /usr/bin/powerd_test -s; lipc-set-prop com.lab126.powerd def
erSuspend 3000000
Powerd state: Ready to suspend
Remaining time in this state: 2999997.991570
defer_suspend:1
suspend_grace:0
prevent_screen_saver:0
drive_mode:unknown
Battery Level: 88%
Last batt event at: 88%
Charging: No
batt_full=0
Battery logging: On
[root@kindle root]#
view raw gistfile1.txt hosted with ❤ by GitHub

My screensaver changing script ended up as:

lipc-set-prop com.lab126.powerd wakeUp 1
sleep 3
/usr/bin/powerd_test -p
a=0
while [ $a -lt 50 ]
do
lipc-set-prop com.lab126.powerd deferSuspend 86400
sleep 2
a=`expr $a + 1`
done
view raw gistfile1.txt hosted with ❤ by GitHub

1 comment: