linux红外远程控制驱动(二)
时间:2007-04-18 来源:ilttv.cn
5、编写LIRC的客户端应用
有两种类型的LIRC应用,一种为发送IR命令的应用,比如xrc、irsend等,另一种为接收IR命令的应用,比如irexec, irxevent 和 irpty等。它们都将通过位于/dev/lircd的socket连接到lircd后台,通信的数据为普通的可读格式。
无论什么时候lircd接收到一个IR信号,它将广播下面的字符串到每个客户端(client):
<code> < repeat count > <button name> <remote control name>
code是IR信号的64位编码。repeat count表示用户按下按键的时间,每当接收到一个新的IR信号时,它将增加1。button name和remote control name在lircd的配置文件里定义。
如果你仅仅希望使自己的应用接收IR命令,可以使用lirc_client库,通常是/usr/lib/liblirc_client.a。可以使用它编写LIRC的客户端应用,要记得包含lirc/lirc_client.h文件。lirc_client库比较重要的函数有:
l int lirc_init(char *prog,int verbose)
库的初始化,它连接lircd后台做一些内部的初始化。prog与.lircrc中的prog项对应,verbose表示是否打印错误信息到stderr,0表示不打印,1表示打印。返回值为连接到lircd的socket描述符,有错误发生时返回-1。
l int lirc_readconfig(char *file,struct lirc_config **config,int (check)(char *s))
读取配置文件。file表示配置文件名称,NULL表示使用默认的.lircrc,也可以进行多次调用加载多个配置文件。config表示配置文件数据结构(struct config)的指针,将在函数内部填充,lirc_code2char函数将需要它。check函数指针指向一个对file进行解析的用户自定义函数。
l int lirc_nextcode(char **code)
阻塞直到socket上有数据可用。可以在程序的主循环里使用。如果有错误发生返回-1,否则返回0和指向数据流里下一个字符串的指针code,注意code必须使用free函数释放。此函数使得code中获得prog对应的配置信息,若无按键信息则阻塞进程。
l int lirc_code2char(struct lirc_config *config,char *code,char **string)
获得配置文件里与按键对应的配置字符串。config和code分别由是前面两个函数填充的,string中将被.lircrc中的config域值填充。
l void lirc_freeconfig(struct lirc_config *config)
释放config结构。
l int lirc_deinit()
lirc销毁函数。
下面是LIRC项目主页上的一个简单示例
/* $Id: technical.html,v 1.26 2005/12/10 22:12:02 lirc Exp $ */
/****************************************************************************
** irexec.c ****************************************************************
****************************************************************************
*
* irexec - execute programs according to the pressed remote control buttons
*
* Copyright (C) 1998 Trent Piepho <[email protected]>
* Copyright (C) 1998 Christoph Bartelmus <[email protected]>
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lirc_client.h"
char *progname;
int main(int argc, char *argv[])
{
struct lirc_config *config;
progname=argv[0];
if(argc>2)
{
fprintf(stderr,"Usage: %s <config file>\n",progname);
exit(EXIT_FAILURE);
}
if(lirc_init("irexec",1)==-1) exit(EXIT_FAILURE);
if(lirc_readconfig(argc==2 ? argv[1]:NULL,&config,NULL)==0)
{
char *code;
char *c;
int ret;
while(lirc_nextcode(&code)==0)
{
if(code==NULL) continue;
while((ret=lirc_code2char(config,code,&c))==0 &&
c!=NULL)
{
#ifdef DEBUG
printf("Execing command \"%s\"\n",c);
#endif
system(c);
}
free(code);
if(ret==-1) break;
}
lirc_freeconfig(config);
}
lirc_deinit();
exit(EXIT_SUCCESS);
}