Я рад что кому-то моя идея пригодилась
Во истину волшебная коробочка
p.s.
/opt/usr/remote.pl & - да важно запускать в фоновом режиме
Пробуем управлять мышью.
Идея такова, что при нажатии на одну из пяти! кнопок выполнять определенные действия в системе. Конкретно в моем случае мне нужно управление проигрывателем радио(задолбало все время включать комп, кода хочется послушать радио).
В usb порт воткнут хаб в него винт, звуковая и получаем практически полноценный интернет радиоприемник, кому интересно вот ссылка где все доведено до ума. А у меня такой колхозный вариант - все в одном.
Итак сервер mpd запущен, пакет mpc установлен и с компьютера через консоль или при помощи QMPDClient1.1.2 все нормально управляется и работает.
Долго искал чем проще управлять именно с роутера и пока остановил выбор на обычной usb мышке (конечно вариант с пультом более приемлем, но под рукой нет нормального usb пульта, а заморачиваться с комовским самопальным не захотел) . Оказалось, что из нее без особых проблем можно читать аж пять кнопок (левая, правая, колесо нажать, колесо вперед, колесо назад).
Итак предварительно настраиваем систему, для этого подгружаем модули:
Создаем директорию modules в каталоге /opt/ и копируем туда три файла драйверов, возможно для мыши достаточно одного input.o . Затем командой insmod подключаем их к системе.
# установка драйверов
insmod /opt/modules/input.o
insmod /opt/modules/evdev.o
insmod /opt/modules/hid.o
Теперь можно смело втыкать мышь и в каталоге /dev/input/ появляется устройство event0, значит все нормально.
За основу я взял код andr128 из этой ветки и переделал все под себя.
В роутере у меня стоит Олеговская прошивка и сверху скриптом из Установки программ для чайника установлен только вэб сервер, микроперл и отображение статистики.
Первым делом нужно убедиться что программа читает коды из мыши.
У кого стоит Perl замените первую строчку программы.
Я создал файл с названием remote_sig_mous.pl и таким содержимым:
#!/opt/bin/microperl -w
#$fdev="/dev/usb/hid/hiddev0"; # IR Remote (ASUS)
$fdev="/dev/input/event0"; # Mouse
#$fdev="/opt/usr/mybin"; # My test file
open(REMOTE,$fdev) || die "!Error open file: $!\n";
binmode(REMOTE);
begin:
$df='';
$result = sysread(REMOTE, $df, 64); # $result - real read byte
$ascii = unpack("H*",$df); # convert bytes to view hex string
print "Read bytes: $result\n";
print " df: $ascii\n";
goto begin;
close(REMOTE);
Потом я перенес этот файл в каталог /opt/usr/ и запустил(все действия я делаю в МС).
Если все нормально то на экране будут появляться коды движения мыши и нажатия на кнопки. Мне сильно мешали коды движения, поэтому я разобрал мышь и убрал призму и заклеил отверстие непрозрачной изолентой. Теперь на экране отображаются только коды кнопок. В общем дальше просто проанализировав выводимые данные я нашел несколько значений которые не меняются, а принадлежат определенным действиям с кнопками.
При нажатии на кнопки мыша выдает последовательность значений, но они постоянно разные, пришлось вычислить часть которая совпадает всегда и отличается для каждой кнопки.
Итак я вычислил разницу возвращаемых значений при нажатии на кнопку.
Левая, правая, центр – выдают код при нажатии отпускании, а колесо вперед и назад только при нажатии.
Левая
df: 100101
df: 100100
Правая
df: 110101
df: 110100
Центр
df: 120101
df: 120100
Назад
df: 0800ff
Вперед
df: 080001
Программа считывает код нажатия, переводит его в текст и вырезает кусок с шестью символами начиная с 20 позиции:
$ascii = substr(unpack("H*",$df),20,6);
Дальше просто сравниваем с заранее записанными значениями и выполняем соответствующее действие. Кстати реакция на левую, правую и центральную кнопки нужна на отпускание, мне кажется так проще.
Теперь код основного файла remote.pl
Код программы:
#!/opt/bin/microperl -w
$k01 = "120100"; # centr
$k02 = "100100"; # left
$k03 = "110100"; # right
$k04 = "080001"; # up
$k05 = "0800ff"; # dn
#$fdev="/dev/usb/hid/hiddev0"; # IR Remote (ASUS)
$fdev="/dev/input/event0"; # Mouse
#$fdev="/opt/usr/mybin"; # My test file
open(REMOTE,$fdev) || die "!Error open file: $!\n";
binmode(REMOTE);
begin:
$df='';
sysread(REMOTE, $df, 64);
$ascii = substr(unpack("H*",$df),20,6);
#print "$ascii\n"; #for otladki
SWITCH:
{
if ($ascii eq $k01 ) { print " k01\n"; system "mpc play 1"; last SWITCH; } #start pleer list pos 1
if ($ascii eq $k02 ) { print " k02\n"; system "mpc play"; last SWITCH; }
if ($ascii eq $k03 ) { print " k03\n"; system "mpc stop";last SWITCH; }
if ($ascii eq $k04 ) { print " k04\n"; system "mpc next"; last SWITCH; }
if ($ascii eq $k05 ) { print " k05\n"; system "mpc prev";last SWITCH; }
}
goto begin;
close(REMOTE);
Этот файл копируем в /opt/usr/ и можем запускать с параметром &, тогда можно спокойно выключать комп и прога будет крутиться до перезагрузки роутера.
/opt/usr/remote.pl &
Да еще нужно создать свой плейлист, чтобы переключаться между радиостанциями.
Теперь при нажатии на левую кнопку включается радио, при прокрутке колеса вперед назад соответственно переходы по плейлисту, при нажатии на колесо переход на самую любимую радиостанцию (или просто на 1 позицию в плейлисте), ну и нажатие на правую кнопку выключает радио. Огромное спасибо andr128 за идею и опубликованный код для пульта ДУ мне даже не пришлось углубляться в изучение Perl .
Я рад что кому-то моя идея пригодилась
Во истину волшебная коробочка
p.s.
/opt/usr/remote.pl & - да важно запускать в фоновом режиме
Last edited by andr128; 19-05-2010 at 09:15.
DIR-320 / WL-500gPv2 / O'Play R1
[QUOTE=andr128;197852]Я рад что кому-то моя идея пригодилась
Во истину волшебная коробочка
Здравствуйте.Тут на форуме прочитал интересную идею alexcccp по поводу использования роутера в качестве сигнализации:
"подключить usb устройство к роутеру, например мышь и заставить следить за кнопкой мышары.
прикрепить к двери геркон и прикрутить его замес-то кнопки мышары
.....
при открывании двери геркон размыкается мышь сообщает роутеру о новом состоянии ее кнопки, а тот в свою очередь шлет смс."
Я так понимаю теперь это можно осуществить практически?Если да,то сажусь за парту.Может кините ссылочку с чего начать.Спастибо
по поводу подключить usb-девайс и поуправлять я тут предлагал ардуину (arduino).
http://wl500g.info/showthread.php?t=...E7%E0%F6%E8%FF
Возможностей побольше, но чуть сложнее получается.
Подскажите, собрался ставить Семерку. Совместим ли Asus WL-500g premium с этой ОС?
смысл совместимости не ясен, роутер это автономное устройство, со своими процессором, оперативкой, операционкой
Asus RT-N56U Firmware: 1.0.1.8d-p3
Сам по себе Asus WL-500g premium с Windows 7 не совместим - мало памяти, нет видеокарты, клавиатуры и мышки, несмотря на то, что энтузиасты цепляют к нему жесткие диски больших размеров.
Если стоит задача все таки сменить ПО Асуса, то рекомендую посмотреть в сторону прошивки от энтузиастов.
Onlime @ RTN66U
Megafon @ E392+WL500W
DOVADO TINY (работает с E392, но не так шустро)
А зачем забивать тупой вендовый топор в роутер с линухом ?
Память можно увеличить, клаву и мышь уже тоже цепляли ...
З.Ы. Ну а монитор по usb и так работает, даже без видюхи ...
См. > http://wl500g.info/showthread.php?p=204117#post204117
• Oleg's FAQ • Mini FAQ • Все об Asus RT-N16 • Все об Asus RT-N66U • VectorMM.net • Wiki-HUB.ru • WikiDevi • Wi-Cat.ru •
В общем взял за основу скрипт remote.pl только добавил свои коды.
Всё работало, но столкнулся с такой проблемой.
Из-за чего не понял, но происходит переподключение устройства или ещё что-то.
В результате /dev/input/event0 исчезает, зато появляется /dev/input/event1.
Сам скрипт такое дело отработать не может, но и не валится полностью, а зацикливается.
А реально он начинает пожирать ~90% cpu. :-(
Просьба, к тем, кто в состоянии доработать скрипт доработать следующию функциональность:
1. Реализовать автоматическое определение eventX. У меня его можно получить из /proc/bus/input/devices - строка H:
2. Отрабатывал ошибку чтения и при ошибке пытался снова определить eventX. Причем тут, наверно нужно вставить задержку, хотя бы на секунду.
Заранее спасибо всем откликнувшимся.
PS: К сожалению, я сам perl вижу в первый раз. А пользоваться такими удобствами, как включать, выключать, переходить к след. радио-станции - хочется. Поэтому и прошу помощи.
[ASUS wl-500gP (v1) 1.9.2.7-rtn-r7438M 128Mb 300MHz 2+2usb] + [2Гб USBFlash] + [USB-HDD] + [xinetd] + [samba3] + [Download Engine] + [rTorrent] + [3proxy] + [nShaper] + [mcabber] + [apcupsd] + [mpd]; Было: [openvpn&udhcpc]; [privoxy] + [polipo];
как исправить такое
insmod /opt/tmp/evdev.o
insmod: unresolved symbol __pollwait
и этот модуль не загружается.
• Oleg's FAQ • Mini FAQ • Все об Asus RT-N16 • Все об Asus RT-N66U • VectorMM.net • Wiki-HUB.ru • WikiDevi • Wi-Cat.ru •
Исправил) Прошивка от Vampika модули здесь брал, 2 из 3-х работали. Нашел скачать из другого места архим с модулями, от туда взял его заработало
А лампочками кто нибудь управлял на клавиатуре? у меня они не горят, как сделать чтоб горели?
Last edited by Omega; 27-01-2011 at 11:20. Reason: 2 post merged
DIR-320 / WL-500gPv2 / O'Play R1