eddy_em: (hram nauki)
[personal profile] eddy_em
Итак, в поисках возможных решений, как таки заставить ноутбук быть человечнее, я даже создал тему на ЛОРе и в ЖЖ ru_linux.
Помощь зала и гугла дала возможность еще кое-что добавить.

Во-первых, для того, чтобы парковать головки 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:
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 я пока так и не разобрался.

Date: 2012-11-26 07:49 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Откуда же мне знать?
Сейчас, правда, это не нужно (т.к. SSD), но скоро получу купленный на ибее проводок, удлиню его (короткий + каркас для HDD стоил 10 баксов, а длинный без каркаса - 20) и воткну бывший в ноутбуке жесткий диск. Тогда надо будет на всякий пожарный сделать автопарковку.

Date: 2012-11-26 08:25 am (UTC)
From: [identity profile] g3ar.livejournal.com
Нарыл вот такой ответ, который много где повторяется в разных интерпретациях. Что-то подобное слышал в универе и читал в литературе(к сожалению авторов и название не помню).

"Все жесткие диски снабжены механизмом автоматической парковки при выключении питания. Обычно автопарковка осуществляется за счет кинетической энергии вращения магнитных дисков. При отключении питания шпиндельный двигатель используется как генератор, и энергия, извлекаемая из его обмоток, используется для перемещения магнитных головок в парковочное положение до снижения скорости вращения ниже критической, при которой магнитные головки начинают касаться поверхности диска. После того, как головки окажутся в зоне парковки, происходит блокирование системы позиционирования магнитной защелкой (небольшим постоянным магнитом), и осуществляется плавная посадка головок на поверхность магнитного диска. В современных жестких дисках применяется альтернативный метод - вместо того, чтобы позволить магнитным головкам упасть на поверхность, головки полностью убираются с магнитных дисков на специальную парковочную площадку. При включении питания диски раскручиваются до необходимой скорости, после чего головки "слетают" с площадки на поверхность пластин, которая крутится с достаточно большой скоростью, чтобы не допустить касания головками магнитных пластин."

Потому не советовал бы пользоваться левым демоном для парковки. В лучшем случае - это просто лишняя сущность, в худшем - он может заводить головку в область на диске где, по удачному стечению обстоятельств, именно в твоей модели винта будет находиться не парковочная дорожка, а дорожка с данными.

Date: 2012-11-26 09:47 am (UTC)
From: [identity profile] eddy-em.livejournal.com
Этот демон по сути вызывает hdparm с приказом "парковаться", так что косяков быть не должно.
А парковка при падении нужна, чтобы головки не поцарапали поверхность диска. Сам диск не припаркует.

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 07:49 pm
Powered by Dreamwidth Studios