Comments 17
Добавьте еще маленький скриптик который генерирует ir.conf или что-то подобное, где хранится mapping кодов кнопки пульта на их hex код.
Имеете в виду конкретный пульт, и его кнопки, если не указаны в /etc/mylirc/buttom_avermedia.php? То по сути программа в логи напишет что была нажата кнопка, у которой не назначено действие
Я думал о том чтобы разграничить пульты. Но практическая необходимость в этом не потребовалась.
По сути, для определения нажатий клавиш достаточно запустить
if(!$l){ //Если клавиша нажата, но в файле настроек не прописана:
if($log){exec("echo not buttom $button $key >> $log");}
}
Я думал о том чтобы разграничить пульты. Но практическая необходимость в этом не потребовалась.
По сути, для определения нажатий клавиш достаточно запустить
/usr/sbin/mylirc --device=/dev/input/event1 --log=/var/log/log_lirc_but
И нажимать по порядку клавиши на пульте, получите список кодов клавиш в том же порядке в файле /var/log/log_lirc_butДа, я имел ввиду нечно подобное, но я преставлял скрипт генерирующий конфигурацтионный файл. Нечто вроде pastebin.com/rdp2gJCF, готорый создаст файл вроде pastebin.com/XVLrsN9B. Но, наверное, это все-таки вне вашей статьи.
Понял. Чуть позже добавлю, действительно, будет полезен такой скрипт.
Как и обещал, скрипт, для создания файла настроек «на лету», по Вашему предложению. Спасибо за идею!
Скрипт создания файла настроек для программы mylirc
#!/usr/bin/php5
<?php
declare(ticks = 1);
pcntl_signal(SIGINT, "signal_handler");
function signal_handler($signal){
global $f,$out;
if($signal==SIGINT){
fclose($f);
exec('echo ?\> >> '.$out);
exit("\n$out create!\n");
}
}
function AccessFile($file,$access){
if(file_exists($file)){ //файл существует!
if($f=@fopen($file,$access)){fclose($f);}else{exit("not have access to $file\n");}
}else{
return "$file not found (may not have access to the folder)\n";
}
}
$dev="";
$out="";
if(count($argv)==1){
exit("Use ".dirname( __FILE__ )."/".basename($_SERVER['SCRIPT_FILENAME'])." --device=device --out=config.php\n");
}else{
for($i=1;$i<count($argv);$i++){
$cmd=explode("=",$argv[$i]);
switch($cmd[0]){
case "--device": $dev=$cmd[1]; echo AccessFile($cmd[1],"rb"); break;
case "--out": $out=$cmd[1]; echo AccessFile($cmd[1],"w"); break;
}
}
}
if(($dev=="")||($out=="")){
exit("Use ".dirname( __FILE__ )."/".basename($_SERVER['SCRIPT_FILENAME'])." --device=device --out=config.php\n");
}
echo "press [Ctrl]+[C] to stop and press any button on the remote\n";
$f=fopen($dev, 'rb');
if($f){
exec('echo \<?php > '.$out);
exec('echo " \$command=array();" >> '.$out);
$i=0;
$j=1;
while (!feof($f)){
$b=fread($f,32);
$b=bin2hex($b);
$b=substr($b,18,8);
$button =substr($b,0,4);
$key =substr($b,4);
$i=$i+($j++)%2; //Нумерация кнопок
$but='$command[]=array("'.$i.'", "'.$button.'","'.$key.'",""); // #'.$i;
exec('echo \' '.$but.'\' >> '.$out);
echo $but."\n"; //Выводим и на экран, чтобы понимать, что кнопки нажимаются и все работает
}
}
?>
Какая хорошая критика, все по пунктам, отлично!
Итак, мои оправдания и/или объяснения:
1) Согласен, если напичкать программу другими возможностями, то вполне возможно будет менее затратным в плане ресурсов способ, хотя тут именно в том и дело, что только читать event, и ничего лишнего.
2) Полностью согласен! Но я не описывал настройку PHP, который урезан по минимуму в системе, ровно как nginx, им не позволительно отдавать много ресурсов.
3) Это в идеале, да, хотелось бы добиться такого же.
4)Ну если утрировать, то да. Изначально хотел сделать нечто такое, что работает только по нажатию кнопки. К примеру зачем гонять систему когда я уехал из дома на выходные, пульт коту оставить? :-)
5) Мне Ваша статья очень понравилась! Жаль только что я на неё наткнулся уже после того как написал решение изложенное в статье. Я собственно хотел в комментариях к Вашей статье описать свой подход, но к сожалению (или наоборот во благо) не мог на тот момент оставлять комментарии, тем самым решил изложить материал отдельной статьей.
6) Продолжаю разбираться с этой крохой, думаю будет продолжение статей.
7) Спасибо!
Итак, мои оправдания и/или объяснения:
1) Согласен, если напичкать программу другими возможностями, то вполне возможно будет менее затратным в плане ресурсов способ, хотя тут именно в том и дело, что только читать event, и ничего лишнего.
2) Полностью согласен! Но я не описывал настройку PHP, который урезан по минимуму в системе, ровно как nginx, им не позволительно отдавать много ресурсов.
3) Это в идеале, да, хотелось бы добиться такого же.
4)Ну если утрировать, то да. Изначально хотел сделать нечто такое, что работает только по нажатию кнопки. К примеру зачем гонять систему когда я уехал из дома на выходные, пульт коту оставить? :-)
5) Мне Ваша статья очень понравилась! Жаль только что я на неё наткнулся уже после того как написал решение изложенное в статье. Я собственно хотел в комментариях к Вашей статье описать свой подход, но к сожалению (или наоборот во благо) не мог на тот момент оставлять комментарии, тем самым решил изложить материал отдельной статьей.
6) Продолжаю разбираться с этой крохой, думаю будет продолжение статей.
7) Спасибо!
Да, я рассматривал такой вариант, но тут беда,
Кто то из этого конвейера врет! То есть переменная $c так и не обретает данные, и последующий код просто не выполняется.
Проблема его в том, что на экране появляется «start» и все. что бы я не нажал, чтобы не сотворил, тишина, только [Ctrl]+[C], увы.
cat event0 | hexdump | awk {'print $6'}
Кто то из этого конвейера врет! То есть переменная $c так и не обретает данные, и последующий код просто не выполняется.
Вот Ваш код, немного дописанный
#!/bin/bash
while [ 1=1 ];do
echo "start"
c=`cat /dev/input/event1 | hexdump | awk {'print $6'}`;
echo "good"
echo $c;
if [[ "$c" = "0001" ]];then
echo "Нажата кнопка А";
fi;
if [[ "$c" = "0002" ]];
then echo "Нажата кнопка Б";
fi;
done
Проблема его в том, что на экране появляется «start» и все. что бы я не нажал, чтобы не сотворил, тишина, только [Ctrl]+[C], увы.
:-) И так я тоже пытался сделать, там вероятно причина в том, что система генерирует не строковую информацию, а awk и tail ждут именно конца строки, чего собственно нет.
Хотя странно, hexdump то генерирует строку…
В общем до идеи с PHP я копал в эту сторону, Даже пытался сокеты организовать на bash, но мне не понравилось, то что приходилось именно сливать данные в другой файл и уже его перечитывать.
В общем до идеи с PHP я копал в эту сторону, Даже пытался сокеты организовать на bash, но мне не понравилось, то что приходилось именно сливать данные в другой файл и уже его перечитывать.
Может, нужно отключить буфферизацию пайпа между hexdump и awk? Это можно сделать через stdbuf.
Можете привести пример? В описании программы вроде бы понятно, но ничего не происходит :(
… hexdump | stdbuf -i 0 -o 0 -e 0 | awk …
Вероятно у вас опечатка, stdbuf помимо команд что то по итогу должна выполнить, то есть конвейера после нет, awk должно выполнится через stdbuf, по крайней мере так гласит man.
Вчера пытался разобраться с stdbuf, но толком ничего не получилось. Все так и зависло, переменная $c так и не получает никаких данных.
Тут ведь дело не только в буфере. По моему предположению тут не подходит программа cat, она ведь при выводе файла ждет eof, а event не заканчивается.
Но спасибо за полезную информацию в сторону stdbuf, не знал что буфер можно сменить «на лету».
Вчера пытался разобраться с stdbuf, но толком ничего не получилось. Все так и зависло, переменная $c так и не получает никаких данных.
Тут ведь дело не только в буфере. По моему предположению тут не подходит программа cat, она ведь при выводе файла ждет eof, а event не заканчивается.
Но спасибо за полезную информацию в сторону stdbuf, не знал что буфер можно сменить «на лету».
Sign up to leave a comment.
Cubieboard A10. Учимся управлять системой с пульта дистанционного управления