PDA

Показать полную графическую версию : Подскажите как допилить скриптик для телефона


kiralex
29-09-2012, 01:06
Доброго времени суток.

Прощу подсказать как еще можно оптимизировать(или лучше переписать) sh скрипт для телефона Desire Z на Android.
Гдето в интернете видел ролик, где загружается HTC Desire телефон на андроиде и при этом у него мигает лампочка зарядки как HDD LED.
Захотелось себе сделать также, но беглый поиск не принес отдельной программы для Android имеющей данный функционал.
Решил делать своими силами, а самое простое это скрипт запускающийся из init.d и работающий в фоне.

Погуглив на тему лампочек я решил использовать зеленую лампочку зарядки.
/sys/devices/platform/leds-microp/leds/green/brightness , если в него записать 1 диод зажигается, 0 выключается.

Также в интернете нашел скрипт который делает почти то что нужно(изначально мигал светодиодом на клавиатуре) и немного его переписал.

Запускаю скрипт так.
#!/system/bin/sh

/system/bin/led.sh >/dev/null 2>&1 &
renice 20 `pidof led.sh`

Сам скрипт
#!/system/bin/sh

CHECKINTERVAL=0.3

getVmstat()
{
cat /proc/vmstat|egrep "pgpgin|pgpgout"
}

led_on()
{
echo "1" > /sys/devices/platform/leds-microp/leds/green/brightness
}

led_off()
{
echo "0" > /sys/devices/platform/leds-microp/leds/green/brightness
}

# initialise variables
NEW=$(getVmstat)
OLD=$(getVmstat)

while [ 1 ] ; do
sleep $CHECKINTERVAL
NEW=$(getVmstat)
if [ "$NEW" = "$OLD" ]; then
led_off
else
led_on
fi
OLD=$NEW
done

Несмотря на работу с виртуальными фс proc и sys, а также задержку скрипт жрет много процессорного времени и не дает сбрасывать частоту, в итоге батарейка тает на глазах.
CPU: 20.1% usr 63.2% sys 0.0% nic 16.5% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 2.44 2.44 2.42 2/464 18764
←[7m PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND←[0m
1220 1 0 S 760 0.2 0 12.1 {led.sh} /system/bin/sh /system/bi
5 2 0 SW 0 0.0 0 0.6 [rcu_kthread]
10434 9171 1000 S 206m 55.8 0 0.4 system_server
11297 9171 1000 S 131m 35.7 0 0.4 {ndroid.systemui} com.android.syst
2769 9171 10087 S 100m 27.2 0 0.2 com.fd.httpd

kiralex
29-09-2012, 02:22
Я вот тут еще подумал и немного переделал скрипт. Sleep делает меньшую задержку чем хотелось бы, а переменная $STATE нужна для того, чтобы лишний раз не писать в файл одно и тоже. Еще не знаю насколько шустрый egrep, но раз можно эту задачу решить обычным грепом думаю так будет лучше.


#!/system/bin/sh

# Renice this
renice 19 $$

getVmstat()
{
cat /proc/vmstat | grep "pgpg"
}

# initialise variables
CHECK=50000
STATE="0"
NEW=$(getVmstat)
OLD=$(getVmstat)

while [ 1 ] ; do
usleep $CHECK;
NEW=$(getVmstat);
if [ "$NEW" = "$OLD" ]; then
if [ "$STATE" = "1" ]; then
STATE="0";
echo "0" > /sys/devices/platform/leds-microp/leds/green/brightness;
fi
else
if [ "$STATE" = "0" ]; then
STATE="1";
echo "1" > /sys/devices/platform/leds-microp/leds/green/brightness;
fi
fi
OLD=$NEW
done

А можно выполнять включать и выключать диод только тогда когда состояние изменилось без циклов? Ну чтото вроде sleep_until_state_change();
Что еще можно сделать?




© OSzone.net 2001-2012