Продолжаю постигать свой ноутбук
Nov. 8th, 2012 11:40 pmИтак, в поисках возможных решений, как таки заставить ноутбук быть человечнее, я даже создал тему на ЛОРе и в ЖЖ ru_linux.
Помощь зала и гугла дала возможность еще кое-что добавить.
Во-первых, для того, чтобы парковать головки HDD при падении, надо поставить демон hpfall. Настраивается он в файле /etc/conf.d/hpfall, в котором указано, на каких HDD (/dev/sdX) парковать головки при падении. Вроде работает.
Во-вторых, на просторах БХ найден скрипт, позволяющий менять ориентацию экрана при наклоне ноутбука:
Итак, в первом приближении мне надо использовать угол в плоскости ZY. После некоторого количества проб и ошибок, я родил такой скрипт:
Кручу-верчу ноутбук, а ориентация экранчика остается удобочитаемой. Класс!!!
Запихал этот скрипт в автостарт IceWM. Все отлично!
В-третьих, заставить веб-камеру работать в нормальном режиме можно (как я об этом сразу не подумал):
Вот с управлением питания wifi у меня вышла незадача. Напрямую — ругается:
В общем, с wifi я пока так и не разобрался.
Помощь зала и гугла дала возможность еще кое-что добавить.
Во-первых, для того, чтобы парковать головки HDD при падении, надо поставить демон hpfall. Настраивается он в файле /etc/conf.d/hpfall, в котором указано, на каких HDD (/dev/sdX) парковать головки при падении. Вроде работает.
Во-вторых, на просторах БХ найден скрипт, позволяющий менять ориентацию экрана при наклоне ноутбука:
while true; do
sleep 2
POS=`cat /sys/devices/platform/lis3lv02d/position | sed -e 's/(\([-0-9]\+\).*/\1/'`
if [ $POS -ge 500 ]; then
xrandr --output LVDS --rotate left
elif [ $POS -le -500 ]; then
xrandr --output LVDS --rotate right
else
xrandr --output LVDS --rotate normal
fi
done
Помониторив /sys/devices/platform/lis3lv02d/position, я обнаружил, что система координат датчика — правовинтовая. Ось X смотрит влево, Y — на тебя, Z — вверх. Сначала я подумал, что координаты ориентации есть проекции некоторого вектора на эти оси. Длина этого вектора непостоянна (видимо, квантователь велик), но примерно она составляет 1150. Вектор этот ориентирован строго перпендикулярно клавиатуре. Таким образом, теоретически даже можно определить угол наклона бука.
ОК, пробуем. А поможет в этом как всегда Octave.
Вот так можно вытащить системные данные в переменные X, Y, Z:
А вот эта функция измеряет углы наклона ноутбука в плоскостях ZY и ZX относительно вертикали (положительное направление — как обычно, против часовой стрелки в сторону положительного направления оси Y или X):
Помониторив вот такой строчкой:
ОК, пробуем. А поможет в этом как всегда Octave.
Вот так можно вытащить системные данные в переменные X, Y, Z:
function [X Y Z] = AccelCoords()
% [X Y Z] = AccelCoords()
% возвращает координаты с акселерометра
%
[st out] = system("cat /sys/devices/platform/lis3lv02d/position | sed -e 's/(//' -e 's/)//' -e 's/,/ /g'");
if(st == 0)
coords = sscanf(out, "%d %d %d");
X = coords(1);
Y = coords(2);
Z = coords(3);
else
X = nan; Y = nan; Z = nan;
endif
endfunction
А вот эта функция измеряет углы наклона ноутбука в плоскостях ZY и ZX относительно вертикали (положительное направление — как обычно, против часовой стрелки в сторону положительного направления оси Y или X):
function [ZY ZX] = AccelAngle() % [ZY ZX] = AccelAngle() % возвращает углы наклона бука в плоскостях ZY и ZX % [X Y Z] = AccelCoords(); if(isnan(X)) ZY = nan; ZX = nan; else ZY = atan2(Y, Z) * 180. / pi; ZX = atan2(X, Z) * 180. / pi; endif endfunction
Помониторив вот такой строчкой:
i=0;while(i++<60);[a b]=AccelAngle();printf("ZY=%g,ZX=%g\n",a,b);fflush(1);endwhile
я обнаружил, что определяется положение довольно сносно, с точностью около 1°. Вот, что получается, когда бук просто стоит:
ZY = 0, ZX = 0.924045 ZY = 0, ZX = -0.924045 ZY = 0, ZX = 1.84761 ZY = 0, ZX = 1.84761 ZY = 0, ZX = 0.939191 ZY = -0.924045, ZX = 0 ZY = 0.924045, ZX = 0 ZY = 1.84761, ZX = 0 ZY = 0.924045, ZX = 0.924045 ZY = 0.90938, ZX = 0.90938 ZY = 0, ZX = 0 …Т.е., судя по всему, АЦП у акселерометра восьмибитный, а шумит он (акселерометр) довольно прилично.
Итак, в первом приближении мне надо использовать угол в плоскости ZY. После некоторого количества проб и ошибок, я родил такой скрипт:
#!/bin/bash while true; do sleep 1 cat /sys/devices/platform/lis3lv02d/position | sed -e 's/(//' -e 's/)//' -e 's/,/ /g' | while read x y z; do echo "x=$x, y=$y, z=$z" if [ "$z" -ge 0 ]; then if [ "$y" -ge 800 ]; then xrandr --output LVDS1 --rotate right elif [ "$y" -le -800 ]; then xrandr --output LVDS1 --rotate left else xrandr --output LVDS1 --rotate normal fi elif [ "$z" -ge -600 ]; then if [ "$y" -le 800 ]; then xrandr --output LVDS1 --rotate left elif [ "$y" -ge -800 ]; then xrandr --output LVDS1 --rotate right fi else xrandr --output LVDS1 --rotate inverted fi done done
Кручу-верчу ноутбук, а ориентация экранчика остается удобочитаемой. Класс!!!
Запихал этот скрипт в автостарт IceWM. Все отлично!
В-третьих, заставить веб-камеру работать в нормальном режиме можно (как я об этом сразу не подумал):
mplayer tv:// -tv driver=v4l2:width=1280:height=720
Вот с управлением питания wifi у меня вышла незадача. Напрямую — ругается:
iwconfig wlan0 power off
Error for wireless request "Set Power Management" (8B2C) :
SET failed on device wlan0 ; Operation not supported.
Установил rfkill. Похоже, при помощи него можно делать "софтовую блокировку". Правда, я не понял: отключает ли она питание. Судя по выхлопу iwconfig, питание не отключается: происходит то же самое, что и при вызове iwconfig wlan0 txpower off, т.е. только лишь отключается питание на передачу.В общем, с wifi я пока так и не разобрался.
no subject
Date: 2012-11-26 07:49 am (UTC)Сейчас, правда, это не нужно (т.к. SSD), но скоро получу купленный на ибее проводок, удлиню его (короткий + каркас для HDD стоил 10 баксов, а длинный без каркаса - 20) и воткну бывший в ноутбуке жесткий диск. Тогда надо будет на всякий пожарный сделать автопарковку.
no subject
Date: 2012-11-26 08:25 am (UTC)"Все жесткие диски снабжены механизмом автоматической парковки при выключении питания. Обычно автопарковка осуществляется за счет кинетической энергии вращения магнитных дисков. При отключении питания шпиндельный двигатель используется как генератор, и энергия, извлекаемая из его обмоток, используется для перемещения магнитных головок в парковочное положение до снижения скорости вращения ниже критической, при которой магнитные головки начинают касаться поверхности диска. После того, как головки окажутся в зоне парковки, происходит блокирование системы позиционирования магнитной защелкой (небольшим постоянным магнитом), и осуществляется плавная посадка головок на поверхность магнитного диска. В современных жестких дисках применяется альтернативный метод - вместо того, чтобы позволить магнитным головкам упасть на поверхность, головки полностью убираются с магнитных дисков на специальную парковочную площадку. При включении питания диски раскручиваются до необходимой скорости, после чего головки "слетают" с площадки на поверхность пластин, которая крутится с достаточно большой скоростью, чтобы не допустить касания головками магнитных пластин."
Потому не советовал бы пользоваться левым демоном для парковки. В лучшем случае - это просто лишняя сущность, в худшем - он может заводить головку в область на диске где, по удачному стечению обстоятельств, именно в твоей модели винта будет находиться не парковочная дорожка, а дорожка с данными.
no subject
Date: 2012-11-26 09:47 am (UTC)А парковка при падении нужна, чтобы головки не поцарапали поверхность диска. Сам диск не припаркует.