zed.0xff.me

ibm x40 и китайская батарейка :: часть 2 - solution

часть 1 – описание проблемы и скрипт-логгер

результат

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
# grep STARTUP /var/log/battery.log -B1 | grep -v - --

Thu Jul  2 16:25:01 YEKST 2009 :: 14365 mW 15620 mWh 14266 mV
============== STARTUP =============
Thu Jul  2 23:15:01 YEKST 2009 :: 12227 mW 34750 mWh 14893 mV
============== STARTUP =============
Fri Jul  3 06:25:01 YEKST 2009 :: 13117 mW 19380 mWh 14227 mV
============== STARTUP =============
Fri Jul  3 21:15:01 YEKST 2009 :: 13208 mW 23190 mWh 13933 mV
============== STARTUP =============
Mon Jul  6 09:15:01 YEKST 2009 :: 18701 mW 32780 mWh 14168 mV
============== STARTUP =============
Mon Jul  6 20:40:01 YEKST 2009 :: 18523 mW 34460 mWh 13462 mV
============== STARTUP =============
Tue Jul  7 07:25:01 YEKST 2009 :: 17194 mW 39810 mWh 14187 mV
============== STARTUP =============
Wed Jul  8 11:20:01 YEKST 2009 :: 13261 mW 55910 mWh 15657 mV
============== STARTUP =============
Fri Jul 10 11:20:01 YEKST 2009 :: 13829 mW 19030 mWh 14481 mV
============== STARTUP =============
Sun Jul 12 21:45:01 YEKST 2009 :: 13559 mW 21810 mWh 13600 mV
============== STARTUP =============
Thu Jul 16 00:15:01 YEKST 2009 :: 12913 mW 23040 mWh 14364 mV
============== STARTUP =============
Tue Jul 21 07:15:01 YEKST 2009 :: 15477 mW 14800 mWh 14344 mV
============== STARTUP =============
Sat Jul 25 17:45:01 YEKST 2009 :: 6650 mW 17680 mWh 14090 mV
============== STARTUP =============
Fri Aug  7 23:05:01 YEKST 2009 :: 14131 mW 13170 mWh 13854 mV
============== STARTUP =============

получаем список минимальных напряжений батареи,
при которых ноут может самопроизвольно выключиться
в течение следующих 5 минут:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# grep STARTUP /var/log/battery.log -B1|grep mV | awk '{print $12}' | sort -n

13462
13600
13854
13933
14090
14168
14187
14227
14266
14344
14364
14481
14547
14893
15657

выделяем отсюда два некоторых средних значения,
соответствующие уровням “осталось мало заряда” и “осталось КРИТИЧЕСКИ мало заряда” :)
и забиваем их в скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
grep -wq discharging /proc/acpi/battery/BAT0/state
if [ $? = 0 ]; then
        # discharging
        echo -n "`date` :: " >> /var/log/battery.log
        grep -oE "[0-9]+ .*" /proc/acpi/battery/BAT0/state | xargs >> /var/log/battery.log

        VOLTAGE=`cat /proc/acpi/battery/BAT0/state | grep -o "[0-9]* mV" | awk '{print $1}'`
        if [ $VOLTAGE -lt 14600 ]; then
                echo "0 blink" > /proc/acpi/ibm/led
                if [ $VOLTAGE -lt 14400 ]; then
                        echo "1 blink" > /proc/acpi/ibm/led
                fi
        else
                echo "0 off" > /proc/acpi/ibm/led
        fi
else
        # charging / charged
        echo "0 on" > /proc/acpi/ibm/led
        true
fi

в данном случае скрипт будет:
а) моргать зеленым светодиодом “питание от сети” (led 0) при низком уровне заряда
б) моргать зеленым и оранжевым (led 1) диодами при критическом уровне

а дальше – либо втыкаем блок питания и контроллер перехватывает управление диодами, либо заряд совсем кончается и питание аварийно отключается.