lirc, usando el mando a distancia en GNU/Linux

24/05/2006

Lirc Logo
LIRC (Linux Infrared Remote Control) es un paquete que te permite decodificar y enviar señales infra-rojas de los controles remotos más comunmente utilizados (entre ellos el que acompaña a la sintonizadora de TV Avermedia TVCapture 98 que poseo).

La parte más importante de LIRC es el demonio lircd que decodifica las señales IR recibidas por los drivers del dispositivo y envía la información a un socket para que esté disponible para que otras aplicaciones la consuman. También aceptará comandos para enviar señales IR si el hardware lo soporta (aunque esto último no lo comentaré aquí).

Por otra parte están los clientes, que leen los comandos que envía el servidor al socket y realizan acciónes en función de estos. Entre estos, los más importantes son irexec e irxevent que, respectivamente, ejecutan comandos o envian eventos a las aplicaciones X en ejecución.

Obteniendo e instalando lirc

Estos son los pasos que debemos seguir:

  1. Instalamos las fuentes del kernel y paquetes para compilarlas (en mi caso para el kernel 2.6.12)

    $ sudo apt-get install linux-source-2.6.12 build-essential gcc-3.4

    no es suficiente con instalar las kernel-headers ya que Lirc hace uso de archivos adicionales no incluidos en el paquete de las headers.

  2. También necesitamos las librerías de desarrollo para X

    $ sudo apt-get install xlibs-dev

    de otro modo solamente se compilarán e instalarán las utilidades de lirc que no dependen del entorno gráfico (tendremos, por ejemplo irexec pero no irxevent).

  3. Descomprimimos las fuentes del kernel y creamos un enlace simbólico para evitar tener que indicar parámetros adicionales a la hora de compilar lirc

    $ cd /usr/src
    $ sudo tar xvfj linux-source-2.6.12.tar.bz2
    $ sudo ln -s linux-source-2.6.12 linux

  4. Copiamos el archivo de configuración del kernel que tenemos instalado (en mi caso el 2.6.12-10-k7)

    $ cd /usr/src/linux
    $ sudo cp /boot/config-2.6.12-10-k7 .config

  5. Descargamos la ultima versión de lirc de su página (en mi caso lirc-0.8.0.tar.bz2) y la descomprimimos

    $ sudo cp ~/lirc-0.8.0.tar.bz2 /usr/src
    $ cd /usr/src/
    $ sudo tar xvfj lirc-0.8.0.tar.bz2

  6. Creamos un enlace a las fuentes de los drivers del kernel en el directorio de drivers de lirc

    $ cd /usr/src/lirc-0.8.0/drivers
    $ ln -s /usr/src/linux/drivers drivers

    este punto no lo he encontrado documentado en ninguna parte, pero si no creo dicho enlace la compilación falla porque no encuentra las cabeceras de otros drivers sobre los que se apoya (en concreto bttv).

  7. Ahora configuramos e instalamos lirc.

    $ cd /usr/src/lirc-0.8.0
    $ ./setup.sh

    Captura del setup.sh de lirc

    Aquí seleccionamos (ya que yo voy a utilizar el mando de la Avermedia):

    • 1 Driver configuration
    • 5 TV Card
    • 6 AverMedia TV card (TVCapture98, TVPhone98)

    Salimos del setup con la opcion “Save configuration & run configure”. Nos aparecerá al final de la configuración el modulo que necesitamos cargar para que funcione el lirc

    $ make
    $ sudo make install

Qué ha ocurrido tras ejecutar make install?

  • Se ha creado el dispositivo /dev/lirc
  • Se ha copiado los siguietes drivers a /lib/modules/2.6.12-10-k7/misc/:
    lirc_dev.ko, lirc_gpio.ko
  • Se ha copiado el demonio /usr/local/bin/irrecord
  • Se ha creado el socket /dev/lircd
  • Se ha creado la cola fifo /dev/lircm
  • Se ha copiado los siguientes demonios al directorio /usr/local/sbin/:
    lircd, lircmd
  • Se ha crado el archivo de configuración /etc/lircd.conf con la configuración específica para la tarjeta seleccionada (en mi caso para la Avermedia, a partir del archivo lircd.conf.avermedia98)
  • Se ha copiado el archivo de enlace /usr/local/lib/liblirc_client.la
  • Se ha copiado el archivo /usr/local/lib/liblirc_client.a
  • Se ha copiado la librería /usr/local/lib/liblirc_client.so.0.1.0
  • Se han creado los enlaces /usr/local/lib/liblirc_client.so y /usr/local/lib/liblirc_client.so.0 apuntando a /usr/local/lib/liblirc_client.so.0.1.0
  • Se ha copiado las siguiente utilidades a /usr/local/bin/:
    irw, irpty, irexec, ircat, mode2, irsend, lircrcd, irxevent, xmode2
  • Se ha copiado el archivo de cabeceras /usr/local/include/lirc/lirc_client.h
  • Se han copiado las siguiente página de la sección 1 del manual a /usr/local/man/man1:
    irexec.1, ircat.1, irpty.1, irrecord.1, irw.1, irxevent.1, lircrcd.1, mode2.1, smode2.1, xmode2.1, irsend.1
  • Se han copiado las siguietes páginas de la sección 8 del manual a /usr/local/man/man8/:
    ircd.8, lircmd.8

La salida exacta de make install sería esta:

Making install in drivers
make[1]: Entering directory `/usr/src/lirc-0.8.0/drivers’
Making install in lirc_dev
make[2]: Entering directory `/usr/src/lirc-0.8.0/drivers/lirc_dev’
make[3]: Entering directory `/usr/src/lirc-0.8.0/drivers/lirc_dev’
test -c /dev/lirc || (/bin/sh ../../mkinstalldirs /dev && /bin/mknod /dev/lirc c 61 0)
/bin/sh ../../mkinstalldirs /lib/modules/2.6.12-10-k7/misc
/usr/bin/install -c -m 644 lirc_dev.ko /lib/modules/2.6.12-10-k7/misc/lirc_dev.ko
/sbin/depmod -a
make[3]: Leaving directory `/usr/src/lirc-0.8.0/drivers/lirc_dev’
make[2]: Leaving directory `/usr/src/lirc-0.8.0/drivers/lirc_dev’
Making install in lirc_gpio
make[2]: Entering directory `/usr/src/lirc-0.8.0/drivers/lirc_gpio’
make[3]: Entering directory `/usr/src/lirc-0.8.0/drivers/lirc_gpio’
test -c /dev/lirc || (/bin/sh ../../mkinstalldirs /dev && /bin/mknod /dev/lirc c 61 0)
/bin/sh ../../mkinstalldirs /lib/modules/2.6.12-10-k7/misc
/usr/bin/install -c -m 644 lirc_gpio.ko /lib/modules/2.6.12-10-k7/misc/lirc_gpio.ko
/sbin/depmod -a
make[3]: Leaving directory `/usr/src/lirc-0.8.0/drivers/lirc_gpio’
make[2]: Leaving directory `/usr/src/lirc-0.8.0/drivers/lirc_gpio’
make[2]: Entering directory `/usr/src/lirc-0.8.0/drivers’
make[3]: Entering directory `/usr/src/lirc-0.8.0/drivers’
test “” = “” || test -L /dev/lirc || (/bin/sh ../mkinstalldirs /dev && cd `dirname ` && ln -s `basename ` lirc)
test “avermedia98” != “mediafocusI” || test -c /dev/lirc || (/bin/sh ../mkinstalldirs /dev && /bin/mknod /dev/lirc c 61 0)
make[3]: No se hace nada para `install-data-am’.
make[3]: Leaving directory `/usr/src/lirc-0.8.0/drivers’
make[2]: Leaving directory `/usr/src/lirc-0.8.0/drivers’
make[1]: Leaving directory `/usr/src/lirc-0.8.0/drivers’
Making install in daemons
make[1]: Entering directory `/usr/src/lirc-0.8.0/daemons’
make[2]: Entering directory `/usr/src/lirc-0.8.0/daemons’
/bin/sh ../mkinstalldirs /usr/local/bin
/bin/sh ../libtool –mode=install /usr/bin/install -c irrecord /usr/local/bin/irrecord
/usr/bin/install -c irrecord /usr/local/bin/irrecord
test -e /dev/lircd || (/bin/sh ../mkinstalldirs /dev && /bin/mknod /dev/lircd p)
test -e /dev/lircm || (/bin/sh ../mkinstalldirs /dev && /bin/mknod /dev/lircm p)
/bin/sh ../mkinstalldirs /usr/local/sbin
/bin/sh ../libtool –mode=install /usr/bin/install -c lircd /usr/local/sbin/lircd
/usr/bin/install -c lircd /usr/local/sbin/lircd
/bin/sh ../libtool –mode=install /usr/bin/install -c lircmd /usr/local/sbin/lircmd
/usr/bin/install -c lircmd /usr/local/sbin/lircmd
test “avermedia/lircd.conf.avermedia98” = “” || test -e /etc/lircd.conf || (/bin/sh ../mkinstalldirs /etc && /usr/bin/install -c -m 644 ../remotes/avermedia/lircd.conf.avermedia98 /etc/lircd.conf)
test “avermedia/lircmd.conf.avermedia98” = “” || test -e /etc/lircmd.conf || (/bin/sh ../mkinstalldirs /etc && /usr/bin/install -c -m 644 ../remotes/avermedia/lircmd.conf.avermedia98 /etc/lircmd.conf)
make[2]: Leaving directory `/usr/src/lirc-0.8.0/daemons’
make[1]: Leaving directory `/usr/src/lirc-0.8.0/daemons’
Making install in tools
make[1]: Entering directory `/usr/src/lirc-0.8.0/tools’
make[2]: Entering directory `/usr/src/lirc-0.8.0/tools’
/bin/sh ../mkinstalldirs /usr/local/lib
/bin/sh ../libtool –mode=install /usr/bin/install -c liblirc_client.la /usr/local/lib/liblirc_client.la
/usr/bin/install -c .libs/liblirc_client.so.0.1.0 /usr/local/lib/liblirc_client.so.0.1.0
(cd /usr/local/lib && rm -f liblirc_client.so.0 && ln -s liblirc_client.so.0.1.0 liblirc_client.so.0)
(cd /usr/local/lib && rm -f liblirc_client.so && ln -s liblirc_client.so.0.1.0 liblirc_client.so)
/usr/bin/install -c .libs/liblirc_client.lai /usr/local/lib/liblirc_client.la
/usr/bin/install -c .libs/liblirc_client.a /usr/local/lib/liblirc_client.a
ranlib /usr/local/lib/liblirc_client.a
chmod 644 /usr/local/lib/liblirc_client.a
PATH=”$PATH:/sbin” ldconfig -n /usr/local/lib
———————————————————————-
Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR’
flag during linking and do at least one of the following:
– add LIBDIR to the `LD_LIBRARY_PATH’ environment variable
during execution
– add LIBDIR to the `LD_RUN_PATH’ environment variable
during linking
– use the `-Wl,–rpath -Wl,LIBDIR’ linker flag
– have your system administrator add LIBDIR to `/etc/ld.so.conf’

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
———————————————————————-
/bin/sh ../mkinstalldirs /usr/local/bin
/bin/sh ../libtool –mode=install /usr/bin/install -c irw /usr/local/bin/irw
/usr/bin/install -c irw /usr/local/bin/irw
/bin/sh ../libtool –mode=install /usr/bin/install -c irpty /usr/local/bin/irpty
/usr/bin/install -c .libs/irpty /usr/local/bin/irpty
/bin/sh ../libtool –mode=install /usr/bin/install -c irexec /usr/local/bin/irexec
/usr/bin/install -c .libs/irexec /usr/local/bin/irexec
/bin/sh ../libtool –mode=install /usr/bin/install -c ircat /usr/local/bin/ircat
/usr/bin/install -c .libs/ircat /usr/local/bin/ircat
/bin/sh ../libtool –mode=install /usr/bin/install -c mode2 /usr/local/bin/mode2
/usr/bin/install -c mode2 /usr/local/bin/mode2
/bin/sh ../libtool –mode=install /usr/bin/install -c irsend /usr/local/bin/irsend
/usr/bin/install -c irsend /usr/local/bin/irsend
/bin/sh ../libtool –mode=install /usr/bin/install -c lircrcd /usr/local/bin/lircrcd
/usr/bin/install -c .libs/lircrcd /usr/local/bin/lircrcd
/bin/sh ../libtool –mode=install /usr/bin/install -c irxevent /usr/local/bin/irxevent
/usr/bin/install -c .libs/irxevent /usr/local/bin/irxevent
/bin/sh ../libtool –mode=install /usr/bin/install -c xmode2 /usr/local/bin/xmode2
/usr/bin/install -c xmode2 /usr/local/bin/xmode2
/bin/sh ../mkinstalldirs /usr/local/include/lirc
/usr/bin/install -c -m 644 lirc_client.h /usr/local/include/lirc/lirc_client.h
make[2]: Leaving directory `/usr/src/lirc-0.8.0/tools’
make[1]: Leaving directory `/usr/src/lirc-0.8.0/tools’
Making install in doc
make[1]: Entering directory `/usr/src/lirc-0.8.0/doc’
Making install in man
make[2]: Entering directory `/usr/src/lirc-0.8.0/doc/man’
make[3]: Entering directory `/usr/src/lirc-0.8.0/doc/man’
make[3]: No se hace nada para `install-exec-am’.
/bin/sh ../../mkinstalldirs /usr/local/man/man1
/usr/bin/install -c -m 644 ./irexec.1 /usr/local/man/man1/irexec.1
/usr/bin/install -c -m 644 ./ircat.1 /usr/local/man/man1/ircat.1
/usr/bin/install -c -m 644 ./irpty.1 /usr/local/man/man1/irpty.1
/usr/bin/install -c -m 644 ./irrecord.1 /usr/local/man/man1/irrecord.1
/usr/bin/install -c -m 644 ./irw.1 /usr/local/man/man1/irw.1
/usr/bin/install -c -m 644 ./irxevent.1 /usr/local/man/man1/irxevent.1
/usr/bin/install -c -m 644 ./lircrcd.1 /usr/local/man/man1/lircrcd.1
/usr/bin/install -c -m 644 ./mode2.1 /usr/local/man/man1/mode2.1
/usr/bin/install -c -m 644 ./smode2.1 /usr/local/man/man1/smode2.1
/usr/bin/install -c -m 644 ./xmode2.1 /usr/local/man/man1/xmode2.1
/usr/bin/install -c -m 644 ./irsend.1 /usr/local/man/man1/irsend.1
/bin/sh ../../mkinstalldirs /usr/local/man/man8
/usr/bin/install -c -m 644 ./lircd.8 /usr/local/man/man8/lircd.8
/usr/bin/install -c -m 644 ./lircmd.8 /usr/local/man/man8/lircmd.8
make[3]: Leaving directory `/usr/src/lirc-0.8.0/doc/man’
make[2]: Leaving directory `/usr/src/lirc-0.8.0/doc/man’
make[2]: Entering directory `/usr/src/lirc-0.8.0/doc’
make[3]: Entering directory `/usr/src/lirc-0.8.0/doc’
make[3]: No se hace nada para `install-exec-am’.
make[3]: No se hace nada para `install-data-am’.
make[3]: Leaving directory `/usr/src/lirc-0.8.0/doc’
make[2]: Leaving directory `/usr/src/lirc-0.8.0/doc’
make[1]: Leaving directory `/usr/src/lirc-0.8.0/doc’
make[1]: Entering directory `/usr/src/lirc-0.8.0′
make[2]: Entering directory `/usr/src/lirc-0.8.0′
make[2]: No se hace nada para `install-exec-am’.
make[2]: No se hace nada para `install-data-am’.
make[2]: Leaving directory `/usr/src/lirc-0.8.0′
make[1]: Leaving directory `/usr/src/lirc-0.8.0′

Probando la instalación con irw

irw es una utilidad incluida en el paquete lirc que se conecta aun socket Unix y envia a la salida estándar los datos que recibe. Si no se especifican ningún nombre de socket como argumento, se conectará a //dev/lircd (que es precisamente en el que escribe lircd).

Nosotros utilizaremos esta utilidad para comprobar el correcto funcionamiento de lirc.

Lo primero que debemos hacer es cargar el módulo indicado por el configure, en mi caso el lirc_gpio.

$ sudo modprobe lirc_gpio

Arrancamos el demonio que proporciona los comandos al resto de aplicaciones “cliente” (que, recordemos que será el encargado de escribir los comandos en //dev/lircd)

$ sudo lircd

Y ahora arrancamos irw que nos muestra los “comandos” que se van recibiendo

$ sudo irw

Llegados a este punto debemos pulsar teclas del mando a distancia y ver si aparecen líneas, mas o menos así:

0000000040bf00ff 00 POWER TVPhone98

Todo correcto, salimos de irw:

Ctrl+C

y matamos el lircd para continuar con el proceso.

$ sudo killall -9 lircd

Arrancando automáticamente lircd

Para automatizar el arranque del demonio lircd en el inicio del sistema haremos lo siguiente:

  • Configuramos el módulo para que se arranque automáticamente

    $ echo "alias char-major-61-* lirc_gpio" | sudo tee /etc/modprobe.d/lirc

    NOTA: En la documentación pone como alias “char-major-61” pero he visto que poniéndolo así no funciona (un modinfo de lirc_dev -módulo del que depende lirc_gpio- mostraba el alias “char-major-61-*” así que utilicé este también para lirc_gpio y ¡¡bingo!!).

  • Creamos el archivo “/etc/init.d/lirc”

    $ sudo geedit /etc/init.d/lirc

    e introducimos el siguiente contenido:

    #! /bin/sh
    #
    # This is an init script for Debian Sid
    # Copy it to /etc/init.d/lirc and type
    # > update-rc.d lirc defaults 20
    #

    test -f /usr/local/sbin/lircd || exit 0

    case “$1” in
    start)
    # in case your lirc dev points are not created automatically, the next
    # line will create them.
    test -c /dev/lirc || (mkdir -p — . /dev && /bin/mknod /dev/lirc c 61 0)
    echo -n “Starting lirc daemon: lircd”
    start-stop-daemon –start –quiet –exec /usr/local/sbin/lircd — –device=/dev/lirc
    echo “.”
    ;;
    stop)
    echo -n “Stopping lirc daemon: lircd”
    start-stop-daemon –stop –quiet –exec /usr/local/sbin/lircd
    echo “.”
    ;;
    reload|force-reload)
    start-stop-daemon –stop –quiet –signal 1 –exec /usr/local/sbin/lircd
    ;;
    restart)
    echo -n “Stopping lirc daemon: lircd”
    start-stop-daemon –stop –quiet –exec /usr/local/sbin/lircd
    sleep 1
    echo -n “Starting lirc daemon: lircd”
    start-stop-daemon –start –quiet –exec /usr/local/sbin/lircd — –device=/dev/lirc
    echo “.”
    ;;
    *)
    echo “Usage: /etc/init.d/lircd {start|stop|reload|restart|force-reload}”
    exit 1
    esac

    exit 0

  • Le damos permiso de ejecución

    $ sudo chmod +x /etc/init.d/lirc

  • Y lo configuramos para que arranque automáticamente en el nivel 2 (nivel de ejecución por defecto de Ubuntu)

    $ sudo ln -s /etc/init.d/lirc /etc/rc2.d/S50lirc

lircrc

El archivo lircrc es el archivo de configuración para varias de las aplicaciones “cliente” de lirc. Puede ir, o bien en el directorio home del usuario con el nombre ./lircrc, o bien en /etc/ con el nombre lircrc en cuyo caso servirá de configuración global.

Además de los programas “cliente” que incluye lirc existen otros que también tienen soporte para lirc incluido (como por ejemplo Xine o MPlayer, si han sido compilados con la opción correspondiente) y, por tanto, también podrán ser configurados del mismo modo que irexec o irxevent en el fichero lircrc.

Para aquellos programas que no soportan lirc directamente es para los que nos apoyaremos en irexec y en irxevent para ejecutarlos (irexec) y enviarles pulsaciones de teclado y ratón (irxevent), aunque algunos también se pueden controlar únicamente con irexec ya que incorporan programas de línea de comando que “controlan” la aplicación principal.

El archivo de configuración para las herramientas de Lirc consiste en una o más construcciones como la siguiente:

begin
prog = …
remote = …
button = …
repeat = …
delay = …
config = …
mode = …
flags = …
end

que indica qué programa (prog) debería hacer qué (config, mode, flags) si pulsas un cierto botón (remote, button) durante un periodo específico (repeat, delay).

  • prog
    proporciona el nombre del programa que debería recibir la cadena de configuración indicada en config.
  • remote, button
    especifica la tecla de un control remoto que lanza la acción. Las secuencias de teclas e pueden especificar proporcionando más de una cadena remote/button. El caracter ‘*’ se puede utilizar como comodín para remote o button. El valor por defecto para remote es ‘*’. El nombre del control remoto siempre se debe especificar antes que su botón correspondiente. Cuando se utilizan secuencias de teclas un mando será válido por todos los botones que lo siguien hasta que se especifique otro mando.
  • repeat
    indica al prógrama qué ocurrira si se repite una tecla. Un valor de cero indica al programa que ignore la repetición de teclas. Cualquier otro valor positivo ‘n’ indica al programa que pase la cadena config a la aplicación correspondiente cada ‘n’ tiempo, cuando se repite una tecla. El valor por defecto para repeat es cero.
  • delay
    indica al programa que ignore un número específico de repeticiones de tecla antes de utilizar la directiva de configuración “repeat” de arriba. Esto se utiliza para evitar el lanzamiento duplicado de eventos cuando se utiliza un ratio de repetición rápido. Un valor de cero, el valor por defecto, desabilita la función delay.
  • config
    es la cadena que se envía a la aplicación cuando lircd recibe la secuencia de teclas especificada. Si se especifica más de una cadena config, las cadenas config se pasarán a la aplicación en turno. Con esta característica se pueden implementar, por ejemplo, interruptores. Es decir, por ejemplo, si tenemos:

    # Toggle button example
    begin
    prog = irexec
    remote = remoteA
    button = buttonA
    config = play_command
    config = pause_command
    repeat = 0
    end

    la primera vez que se reciba la pulsación del buttonA desde el mando remoteA, se ejecutará el comando play_command. La segunda vez que se reciba la pulsación del buttonA, se ejecutará el pause_command y así sucesivamente, una vez cada comando por pulsación de botón.

  • mode
    indica al programa que entre en un modo especial. Se puede agrupar varias configuraciones incluyendolas en lo siguiente, donde mode indica el modo en el que estas configuraciones deberían estar activas:

    begin mode

    end mode

    Si mode coincide con el nombre de una aplicación cliente esta aplicación siempre arrancará en este modo.

    Esto quiere decir que si hay un modo llamado mplayer en .lircrc y arrancas el programa mplayer, con un cliente LIRC, entonces se entra automáticamente en modo mplayer y solamente los botones mapeados que existen dentro de ese modo son funcionales.

Siendo además, las flags válidas:

  • once
    esta solamente está permitida en conjunción con la directiva mode. La cadena config solamente se pasa a la aplicación la primera vez que se entra en el modo o si se ha salido explicitamente de este modo. Es util para arrancar una aplicación cuando se entra en un modo especial.
  • quit
    normalmente todas las configuraciones se examinan para ver si han de ser ejecutadas. Puedes detener el examen inmediatamente mediante esta marca.
  • mode
    esta solamente está permitida dentro de un bloque mode. Indica al programa que avandone este modo.
  • startup_mode
    indica al programa que se inicie en el modo indicado en la palabra mode. El siguiente ejemplo indica al programa que arranque en modo browser

    begin
    flags = startup_mode
    mode = browser
    end

Además es posible el archivo de configuración en varios archivos utilizando el comando include que indica al analizador que lea un archivo especifico antes de continuar con el actual:

include ~/.lirc/xawtv

Si el archivo especificado comienza por “~/”, “~” se sustituirá por el contenido de la variable de entorno HOME. El nombre del archivo también puede ir entre <> y “” pero, al contrario de lo que ocurre con el preprocesador de C, no tienen ningún significaddo especial.

Por ejemplo, con el siguiente archivo de configuración:

begin
remote = Avermedia
button = POWER
prog = irexec
repeat = 0
config = echo “Hola mundo!”
end

salvado como .lircrc en tu directorio home, inicia irexec. Pulsa el botón indicado en la línea button= (en este caso el botón de encendido, POWER) de tu mando a distancia indicado en remote= (en este caso el de la Avermedia, porque podrías tener configurados más mandos) y verás un “Hola mundo!” en la pantalla. Como puedes ver irexec es un sencillo lanzador de programas. Pero, por supuesto puedes hacer mucho más que arrancar programas.

irexec

irexec es un util programa incluido en lirc. Permite la ejecución de comandos arbitrarios en respuesta a las señales IR decodificadas por lircd, el demonio de LIRC. Recibe como parámetro el nombre de un archivo de configuración válido. Si no recibe ningún parámetro irexec lee el archivo de configuración por defecto que normalmente es ~/.lircrc.

Cuando irexec ejecuta un programa, espera hasta que éste finalice. Si no deseamos este comportamiento, podemos añadir un ‘&’ al final de la linea de comandos.

Ejemplo de entrada en lircrc:

begin
prog = irexec
button = TV/FM
config = tvtime &
end

Donde la línea config contiene el comando a ejecutar al pulsar el botón indicado.

irexec se debería ejecutar con el usuario que ejecutará el programa en cuestión y se puede arrancar con la opción “- -daemon” para que se ejecute en background.

Lo mejor, para conseguir esto, es ir a:

“Sistema” –> “Preferencias” –> “Sesiones” –> “Programas al inicio”

y añadimos el “Comando de inicio”:

irexec – -daemon

irxevent

irxevent es otro de los programas incluidos en lirc. Como dijimos anteriormente, éste solamente estará disponible si en el momento de compilar las fuentes de lirc, estában disponibles los paquetes de desarrollo de X. Este programa se encarga de enviar pulsaciones de botones y de teclas a aplicaciones X en función de las teclas pulsadas en el control remoto. Puedes controlar tu reproductor favorito de CD/MP3 o tu sintonizadora de TV o cualquier aplicación que responda a entradas de ratón o teclado.

irxevent utiliza el mismo archivo de configuración que irexec, ~/.lircrc.

Ejemplo de entrada en .lircrc:

begin
prog = irxevent
button = CH_UP
config = Key k tvtime
end

Donde la línea config admite:

LINE = "config =" <KEY|BUTTON|XYKEY> <TARGET> | "config =" <KEY|BUTTON|XYKEY> "Focus" <TARGET>

XYKEY = "xy_Key" <x_position> <y_position> <MOD><KEYSPEC>

KEY = "Key" <MOD><KEYSPEC>

MOD = ["shift-"]["numlock-"]["ctrl-"]["alt-"]["meta-"] ["numlock-"]["mod3-"]["mod4-"]["scrlock-"]

KEYSPEC = Keyname | "KeySym:"KeySym | "KeyCode:"KeyCode

BUTTON = "Button" <1..5> <x_position> <y_position>

TARGET = Windowname | "WindowID" id | "CurrentWindow" | "RootWindow"

Siendo:

  • Keyname:

    es el símbolo de tecla declarado en X windows. Por ejemplo “Up” se refiere a la tecla de cursor que apunta hacia arriba. “KP_Add” es el símbolo de suma que aparece en el teclado numérico (key pad). Echale un ojo al archivo irxevent.keys (en el directorio de la documentación) si no estás seguro de los nombres de símbolos.

  • KeySym:

    número devuelto por XStringToKeysym(3x).

  • KeyCode:

    múmero devuelto por XKeysymToKeycode(3x).

  • Windowname:

    pueden ser los primeros caracteres del nombre de la ventana mostrada por el administrador de vantanas o el nombre que acompaña al icono. Algunos programas utilizan el nombre mostrado por el administrador de ventanas para mostrar un montón de información de estado pero no cambian el nombre del icono (como xawtv). Otros añaden información al nombre de la ventana (“GQmpeg – kill_windooz.mp3”). Si ni el nombre de la ventana ni el nombre del icono coinciden con la información Windowname proporcionada se comprobará XClassHint(3x).

  • CurrentWindow:

    se refiere a la ventana activa tal como es devuelta por XGetInputFocus(3x). La mayoría de las veces es la ventana que tiene el cursor del ratón.

  • RootWindow:

    se refiere a la ventana inicial tal cual devuelta por RootWindow(3x). Puedes necesitar esto para enviar eventos al administrador de ventanas.

  • WindowID id:

    se refiere a la ventana con identificador de ventana id. id será un número decimal. Es util cuando irxevent no puede encontrar la ventana deseada de otro modo.

  • Focus:

    enviará el evento especificado a la ventana indicada únicamente si tiene el foco. Obviamente esto no tiene mucho sentico cuando se combina con CurrentWindow.

Al igual que el irexec, el irxevent también se debería ejecutar con el usuario que ejecutará el programa a controlar.

De nuevo vamos a:

“Sistema” –> “Preferencias” –> “Sesiones” –> “Programas al inicio”

y añadimos el “Comando de inicio”:

irxevent &

Ejemplos de configuración

Poner el monitor en ahorro de energía al pulsar el botón DISPLAY:

begin
prog = irexec
remote = TVPhone98
button = DISPLAY
# Power off monitor
config = xset dpms force off
# Power on monitor
config = xset dpms force on
end

Avermedia TVCapture 98, tvtime y lirc, convierte tu Ubuntu en una TV
Controlando Totem con el mando a distancia

Algunos enlaces de interés

http://www.lirc.org/
http://chumy.net/?p=11
http://www.raoul.shacknet.nu/2006/01/10/how-to-configure-and-use-lirc/

2 Responses to “lirc, usando el mando a distancia en GNU/Linux”

  1. suco Says:

    Para aquellos a los que no se les ejecute correctamente la orden,
    “make” en el directorio de lirc-8.. es necesario compilar los módulos antes. Esto se hace estando en el directorio /src/linux y ejecutando “sudo make modules”.

  2. EDU Says:

    Hola, excelente artículo.

    Te cuento que a mi me funciona hasta la parte de probar con irw me detecta todos los botones que le he añadido.

    El problema que tengo es que no me interpreta el archivo .lircrc ni aun cuando lo pongo en /etc/.lircrc

    Seguire intentando


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: