Úvod
Možná před rokem jsem si trochu hrál s LIRCem. Stále mám v desktopu TV kartu ke které byl dálkový ovladač. Využil jsem ho pro ovládání TVTime, Mplayeru a MPD. Pak z jádra 2.6.22 Linus vyškrtl funkce životně důležité pro moje dálkové ovládání a přešel jsem opět na druhou klávesnici vedle postele. Nyní mě lenost donutila zase oprášit LIRC a rozjet ho, jak potřebuji.
Nejdříve štěstí nepřálo. GPIO funkce z jader 2.6.21 a níže měly být nahrazeny pomocí /dev/input. Jenže to nefungovalo tak jako dřív. Polovina tlačítek na ovladači se kódy shodovala a jako na potvoru nebyl ani jeden funkční blok vcelku. Tím mám na mysli třeba šipky nebo ovládání přehrávání. Nakonec jsem přišel na to, jak dostat plnou funkcionalitu na omezené množství tlačítek, ale o tom níže.
Bádání pokračovalo a dostala se mi do ruky satelitní karta. Ta obsahovala dálkové ovládání a přijímač pro sériový port. Náhodou se mi také podařilo sehnat USB IR receiver přesně pro tento ovladač. Výsledky byly dobré. Ovladač má snad shodné jen šipky s tlačítky na ovládání hlasitosti a přepínání programů, jinak jsou všechny kódy jedinečné.
Po několika dnech se mi podařilo optimalizovat svázání tlačítek s funkcemi a dodnes jsem velmi spokojený. Další pokusy se týkaly emulace klávesnice a myši. U myši jsem skončil dřív než jsem začal, protože můj ovladač vysílá kód při držení tlačítka pouze jednou. Všechno mi ale fungovalo, takže si ukážeme postup. Klávesnice mi dala zabrat trochu víc. Nejdříve mi fungovaly jen šipky a enter ani náhodou. Když jsem se k tomu po týdnu vrátil, fungovalo vše, jak má na původních konfiguracích, a tak tomu je do dnes. Netuším, kde bylo co špatně. Asi se nějak nepohodla Xka s irxevent daemonem.
Teď mohu říct, že mi funguje prakticky vše co jsem potřeboval, až na ovládání stolní lampy. To je ale otázka času.
LIRC jako takový je balík několika návodů a ovladačů (ve smyslu těch systémových), které dohromady dávají nástroj na ovládání vašeho počítače skrze prakticky jakékoli dálkové ovládání. Princip je následující: daemon lircd komunikuje se samotnými ovladači a další daemoni se připojují k lircd a získají z něj informace o zmáčknutých tlačítkách. Sami pak otevírají soubor lircrc a podle něj reagují.
Když se nám nakonec vše povede, tak výsledek může být třeba takový:
Co najdeme v /dev/input
Než se pustíme do samotné konfigurace, řekneme si co najdeme ve zmíněném adresáři /dev/input. LIRC pracuje s řadou zařízení. Těch je opravdu hodně, ale když máme k dispozici ovladač, který je součástí TV nebo satelitní karty, je možné, že ho najdeme právě v /dev/input. Kromě ovladače se tam bude krčit také myš, klávesnice a další polohovací zařízení, které k počítači připojíme. LIRC s tím počítá a díky podpoře /dev/input může být dálkovým ovladačem jakákoli klávesnice.
Na kterém event zařízení leží náš ovladač zjistíme nejjednodušeji přes symlinky vytvořené z identifikace zařízení. Ty můžeme také použít kdekoli kde uvádím při konfiguraci nebo nahazování eventX.
cx@delorean:~ $ ls -l /dev/input/by-id
celkem 0
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-USB_IR_Receiver_USB_IR_Receiver-event-mouse -> ../event5
lrwxrwxrwx 1 root root 9 1. bře 02.58 usb-04f3_PS_2+USB_Mouse-event-mouse -> ../event4
lrwxrwxrwx 1 root root 9 1. bře 02.58 usb-04f3_PS_2+USB_Mouse-mouse -> ../mouse0
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-099a_EL_USB_Keyboard-event-kbd -> ../event2
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-099a_EL_USB_Keyboard-event-mouse -> ../event3
Můj ovladač je na prvním místě.
Jak získat /etc/lircd.conf
V /etc/lircd.conf najdeme definice našich ovladačů. Když máme třeba dva ovladače, tak později si ukážeme, jak každý z nich použít pro jinou aplikaci. Mě by se něco podobného asi neosvědčilo, protože ztrácím i ten jeden.
Součástí LIRC stránek jsou konfigurační soubory pro opravdu velkou hromadu ovladačů. Pokud ale použijeme zařízení z /dev/input tak na ni rovnou můžeme zapomenou. Tyto zařízení se liší od toho na co je LIRC zvyklý a nebudou fungovat. Jednou z cest je vytvořit si konfigurační soubor svůj, třeba pomocí irrecord. Postup to není zrovna pohodlný a nakonec pravděpodobně skončíme s hexdump, abychom získali všechny tlačítka.
Dáme enter a mačkáme tlačítka, co to dá. Pak přestaneme a s trochou štěstí se dostaneme k volbě jednotlivých tlačítek.
Irrecond je fajn na vytvoření konfiguračního souboru se základními parametry, ale v mém případě nedá dohromady právě tlačítka.
Je tedy čas na hexdump.
Určení kódu tlačítka se ze začátku může zdát těžké, ale když budete sledovat čísla která se mění, tak se ke kódům dostanete. Na obrázku byly zmáčknuty tlačítka 1 až 4 a poslední bylo OK.
Kódy pak doplníme do předgenerovaného lircd.conf souboru. Výsledek může vypadat třeba takhle:
begin remote
name satelite
bits 32
eps 30
aeps 100
one 0 0
zero 0 0
gap 133005
toggle_bit_mask 0x80050036
begin codes
MUTE 0x00010032
1 0x00010002
2 0x00010003
3 0x00010004
[...]
STOP 0x00010019
EXT 0x0001002f
end codes
end remote]
Našim úkolem je vyplnit jméno dálkového ovladače a doplnit tlačítka. Tlačítka se uvádějí mezi „begin codes“ a „end codes“. Prvním parametrem je název tlačítka. S tím budeme pracovat po zbytek konfigurace. Druhým je samotný kód. Dbejte na počet nul. 0× označuje, že se jedná o šestnáctkovou soustavu, tedy přesně to co vypadlo z hexdump. Je možné, že irrecord vám dá přesně to co potřebujete a tak hexdump můžete brát jen jako malé zpestření článku.
Pokud také vlastníte ovladač k satelitní kartě Technisat, tak můžete vyžít již vytvoření lircd.conf.
lircd
Od teď již bude práce příjemnější. Začneme nahozením daemona lircd, který se bude starat o naše dálková ovládání a umožní ostatním programům s nimi pracovat. Po spuštění se vytvoří virtuální zařízení /dev/lircd, přes které se tyto programy připojují.
O nahození lircd se starají init skripty distribuce. V Gentoo najdeme jejich konfiguraci v /etc/conf.d/lircd. Tam vyplníte pouze parametry které si hned ukážeme na příkladu.
Lircd spustíme na příkazové řádce jako root takto:
lircd -n -H dev/input -d /dev/input/event5
Parametr -n říká, že se nemá lircd forkovat do pozadí, -H určuje, jaký ovladač (ve smyslu systémového ovladače) se má použít. Posledním parametrem -d říkáme lircd, kde najde zařízení ovladače. Pokud vše šlape dobře, můžeme si zkusit jestli nám dálkové ovládání reaguje. Nejlepším pomocníkem je program irw. Ten vypíše zmáčknutá tlačítka.
Na obrázku vidíme, že se irw připojil k lircd a získával z něj informace o zmáčknutých tlačítkách.
Pokud jsme se dostali až sem, tak už nám pravděpodobně pojede základní funkčnost LIRCu a můžete pro něj začít svazovat tlačítka s funkcemi. Než se dostaneme k této části, vyzkoušíme si lircmd pro emulaci myši.
lircmd
Lircmd je daemon, který vytvoří zařízení /dev/lircm a poté tam na základě kódů z ovladače posílá vše, co má správná virtuální Xková myš mít. Konfigurační soubor vypadá třeba takhle:
PROTOCOL IMPS/2
ACCELERATOR 1 30 1
BUTTON1_CLICK * RED
BUTTON3_CLICK * BLUE
TOGGLE_ACTIVATE * 6
MOVE_N * UP
MOVE_S * DOWN
MOVE_E * RIGHT
MOVE_W * LEFT
Možností je ale daleko víc, hlavně pokud jde o směry. Možná vás už napadlo, že N, S, E a W znázorňují světové strany. Kromě těchto čtyřech můžeme použít také NE, SE a další. Více informací najdete třeba v příkladu na fedoranews.
Na řádcích, kde se definují směry znamená první parametr identifikátor směru, druhý je název ovladače a třetí tlačítko, jenž směr reprezentuje. Na dalších řádcích nastavujeme akceleraci, protokol a tlačítko, kterým se vypne nebo případně zapne naše virtuální myš. U akcelerace značí první číslo, o kolik se má posunout kurzor na začátku, druhé číslo označuje maximální posun a třetí je násobitel. Jak už jsem zmínil výše, tak lircmd je použitelný pouze, pokud váš ovladač posílá při stlačení tlačítka kódy pořád dokola a přestane až po uvolnění.
Zbývá jenom říci X serveru, kde má hledat naši novou virtuální myš:
Section "InputDevice"
Identifier "LIRC-Mouse"
Driver "mouse"
Option "Device" "/dev/lircm"
Option "Protocol" "IMPS/2"
Option "SendCoreEvents"
Option "Buttons" "2"
Option "ZAxisMapping" "4 5"
EndSection
Input sekce je prakticky stejná, jako když se jedná o normální myš, pouze nasměrujeme X server na /dev/lircm.
Nakonec přidáme myš do:
Section "ServerLayout"
[...]
InputDevice "LIRC-Mouse"
[...]
EndSection
Myš bude fungovat, pouze pokud spustíme lircmd před startem X serveru. Lircmd by měl mít stejně jako další daemoni svůj init skript a priority spouštění by měl řešit vývojový tým distribuce. Občas je tomu potřeba pomoci.
irexec
Dalším velmi užitečným daemonem, který je na rozdíl od lircmd důležitou součástí základní funkčnosti, je irexec. Jeho úkolem je naslouchat zmáčknutým tlačítkům a jako reakci spouštět další programy. Je to daemon, který dělá LIRC tak silný. Dokáže totiž využít potenciál linuxu. Grafické programy lze ovládat přes dbus nebo dcop, na MPD použijeme mpc.
Některé programy, jako třeba mplayer, mají podporu pro LIRC v sobě, a tak není potřeba se opírat o irexec a můžeme využít rovnou příkazů konkrétního programu.
Konfigurační soubor najdeme buď v ~/.lircrc nebo v /etc/lircrc.
irxevent
Dcop, dbus a podobné věci nedokáží nahradit kouzlo samotné klávesnice, pro takovéto případy tu máme irxevent. Je to také daemon a také se konfiguruje přes .lircrc. Kouzlo spočívá v tom, že jedné aplikaci můžeme jako reakci na zmáčknutí tlačítka ovladače poslat signál s tím, že se zmáčkla nějaká klávesa na klávesnici nebo rovnou klávesová zkratka. Osobně používám irxevent pro ovládání krusaderu a pomocí virtuálních šipek si vybírám, co si pustím. Také se mi osvědčil při používání mplayeru. Ten nemá ve svém portfóliu LIRC funkcí třeba roztahování obrazu, i přes to, že to bývá důležité u 4:3 videí na 16:10 monitoru.
Co je dobré vědět při problémech
Než se přesunu ke konfiguračnímu souboru, na jehož základě konečně uvidíme výsledky naší práce, ještě uvedu postup, jak najít co nejrychleji, kde je problém.
- Pomocí hexdump zjistíme jestli se na /dev/input/event* něco děje.
- Spustíme lircd v příkazové řádce a sledujeme výstup.
- Pomocí irw zjistíme, jestli lircd reaguje na tlačítka.
- Pokud lircd nereaguje a nic nehlásí, je problém v /etc/lircd.conf.
- Pokud irw jede a tlačítka, která jsme nakonfigurovali, ne, tak si ověříme, jestli běží daemoni irexec a irxevent.
.lircrc
Prvotní motivace pro rozchození LIRCu nebyla nějak velká. Stačilo mi v mplayeru zastavit přehrávání, když někdo přijde, a ovládat hlasitost. Dálkové ovládání se zdálo nejlepší, protože je jednoduší na něm něco najít potmě a už jsem měl průpravu z televize a dalších zařízení. Nakonec to vše skončilo u mnohem mocnějšího nastavení, které zpohodlní práci s multimédii ještě víc.
Konfigurační soubor .lircrc v sobě nezahrnuje nic záludného. Najdeme v něm definice pro jednotlivá tlačítka, kde můžeme nastavit, co se má udělat po zmáčknutí jakého tlačítka a případně opakování.
Tyto definice si pak můžeme rozdělit do několika módů a každý mód spouštět jiným tlačítkem. V praxi to pak funguje tak, že si třeba na tlačítko „1“ nastavíme zapnutí mplayer módu, na tlačítko „2“ zase mpd módu atd. Poté můžeme stejnými tlačítky na ovladači ovládat oba dva programy, aniž bychom museli hledat, které že tlačítko to máme ještě volné, a složitě si zapamatovávat, co dělá co. Módy zvyšují kapacitu tlačítek, obzvláště těch populárních jako jsou šipky, enter případně play, stop, next atd.
Jak nastavit tlačítko
Otevřeme si soubor ~/.lircrc a do něj vložíme následující řádky:
begin
prog = irexec
remote = *
button = DOWN
repeat = 0
config = amixer set PCM 5%-
end
Nastavení každého tlačítka začíná begin a končí end. Řádky mezi začátkem a koncem obsahují některé více či méně důležité informace. To, co vidíte v ukázce, je asi to nejdůležitější, a tyto hodnoty by měla obsahovat přibližně většina sekcí tlačítek. V parametru prog nastavíme, jaký má být cílový program, remote označuje ovladač, na kterém se má hledat zmáčknutí tlačítka, v button nastavíme, o které tlačítko se jedná, repeat označuje opakování, kde 0 znamená, že se má daná akce provést jen jednou, tedy neopakovat. V posledním parametru nastavíme, co se má poslat vybranému programu, pokud bude tlačítko zmáčknuto. Config může být v u každého tlačítka i vícekrát. Pokud chceme, aby se akce opakovala, když držíme tlačítko zmáčknuté, tak nastavíme parametr repeat na číslo větší než nula, kde nastavené číslo označuje, kolikátý signál z vygenerovaných má být brán v potaz.
Více informací o tom co můžeme do konfiguračního souboru napsat najdeme v dokumentaci.
Druhou věcí, o které jsem se zmiňoval, jsou módy. Změna módu jako reakce na tlačítko může vypadat třeba tahle:
begin
prog = irexec
remote = *
button = 1
repeat = 0
delay = 0
mode = mplayer
end
Kromě parametru mode se tu setkáváme i dalším parametrem, a to delay. Ten můžeme použít i v předchozím případě a označuje, kolik opakovaných signálů se má vynechat, než se začnou brát potaz. Zabraňuje to občasnému dvojitému spuštění akce při použití opakování. Parametr mód nastaví pomyslnou proměnnou módu. V našem případě to je mplayer, ale název je čistě na uživateli.
Mód máme nastavený, teď je potřeba vytvořit podmínku, na kterou bude lircd hledět při hledání, ke kterému tlačítku patří jaká akce.
begin mplayer
include ~/.lircd/mplayer
end mplayer
V našem příkladě si oddělíme sekce tlačítek pro mplayer do dalšího souboru. Nic nám ale nebrání psát je rovnou podmínky nebo spíše sekce s mplayerem.
Kromě umístění na ~/.lircrc se může tento soubor nacházet také v /etc/lircrc. Větší prioritu má ten, který je uložený v home adresáři.
Můj .lircrc
Stejně jako s /etc/lircd.conf, tak i s .lircrc si uvedeme pár příklad. K dispozici dávám následující konfigurační soubory, které definují ovládání níže zmíněných vlastností programů mplayer, mpd, tvtime a nemůžeme zapomenout ani na Xka resp. na šipky a enter v aktuálním okně.
mplayer
- Stop
- Přehrát
- Pauza
- Přetočit dopředu
- Přetočit dozadu
- Upravit šířku obrazu
- Posunovat titulky
- Hlasitost
- Celá obrazovka
X
- Šipky
- Enter
mpd
- Stop
- Přehrát
- Výběr písničky
- Pauza
- Hlasitost
tvtime
- Výběr kanálu
- Hlasitost
- Celá obrazovka
- Spuštění
Závěr
Já jsem velmi minimalistický uživatel. Nemám proto zkušenosti s větší sortou programů, než které jsem uvedl. LIRC ale podporuje velké množství linuxových aplikací, takže stačí jen hledat. Podpora pro LIRC byla obsažena také v KDE 3, ale v KDE 4 jsem na nic podobného nenašel. Ovládání prostředí proto zůstane v rukou lircmd nebo irxevent.
Nastavení LIRCu se může zdát trochu komplikované, možná až geekovské. Pokud se ale rozhodnete postavit si třeba IR přijímač vlastní, ten by měl v LIRC, hlavně s irrecord, fungovat lépe.
S LIRCem jsem velmi spokojený a ta námaha s jeho konfigurací za to stála. Během té doby se většinou nedařilo vše na poprvé, často jsem některé postupy získal starým, ale dobrým stylem pokus/omyl. Pokud by se vám z nějakého důvodu nedařilo, pomůže dokumentace na stránkách projektu.
Jaké máte zkušenosti s LIRCem vy?