Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   Подскажите как допилить скриптик для телефона (http://forum.oszone.net/showthread.php?t=243598)

kiralex 29-09-2012 01:06 1996442

Подскажите как допилить скриптик для телефона
 
Доброго времени суток.

Прощу подсказать как еще можно оптимизировать(или лучше переписать) 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 1996457

Я вот тут еще подумал и немного переделал скрипт. 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();
Что еще можно сделать?


Время: 14:57.

Время: 14:57.
© OSzone.net 2001-