Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1298640
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4175
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: 嵌入式

2011-11-18 21:08:16

Andrew Huang 转载请注明作者及出处 (http://bluedrum.cnblog.cn)

为了演示开发板上嵌入式应用和Linux下一些概念的使用,我写了几个不同版本的坦克对战的小游戏,分别用VT100全屏,FrameBuffer绘屏,也有学生用SDL来实现。
  因为程序要在开发板的ARM-Liux上和PC机上运行。其中键盘输入采用输入子系统的的/dev/input/eventN.

 在具体的使用中,有一个头痛的问题就是不同环境下,键盘或者开发板上的按键对应的event结点不同。如果每次都直接修改程序相当麻烦,而且USB键盘还有一个问题是在不同环境下,因为驱动加载顺序不同。结点文件名也不一样。这样应用起来相当麻烦。

  因此我根据SDL类似代码,写了一个自动扫描所有输入设备结点,并且正确找出键盘对应的结点的通用函数。
  
  一.工作原理
 
   这个函数的功能是从/dev/input/event0 依次扫描到/dev/input/event254 各个结点。每个接点调用ioctl的 EVIOCGBIT命令取得输入驱动的事件支持列表和按键支持列表。如果支持EV_KEY事件,并且支持一些游戏所需要特殊健值,即可认为这个结点就是按键驱动文件.

  这个函数如果找到键盘,则在dev_name返回设备结点名字,并且返回值不是空指针。如果返回值为空表示系统中没有键盘
   
  1. #define test_bit(nr, addr) \
  2.     (((1UL << ((nr) % (sizeof(long) * 8))) & ((addr)[(nr) / (sizeof(long) * 8)])) != 0)
  3. #define NBITS(x) ((((x)-1)/(sizeof(long) * 8))+1)

  4. #define PRINT_INT(e) fprintf(stderr,"%s=%d\n",#e,e)

  5. char * scan_kbd_device(char * dev_name,int size)
  6. {
  7.    int i,fd;
  8.         int ret1,ret2;
  9.      

  10.        unsigned long evbit[NBITS(EV_MAX)] = {0};
  11.        unsigned long keybit[NBITS(EV_MAX)] = {0};

  12.     //fprintf(stderr,"evbit size %d,keybit size %d\n",sizeof(evbit),sizeof(keybit));

  13.    for(i=0; i<255;i++)
  14.        {
  15.       snprintf(dev_name,size,"/dev/input/event%d",i);

  16.        
  17.       fd = open(dev_name,O_RDWR);
  18.       if(fd == -1)
  19.            continue;

  20.  
  21.           ret1= ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit);
  22.           ret2= ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit);

  23.             close(fd);

  24.       if ( (ret1< 0) || (ret2 < 0) ) {
  25.                 
  26.          continue;
  27.     }
  28.                   
  29.       
  30.   
  31.             /* 检测是否支持按键和ENTER和ESC键*/
  32.  
  33.          if(test_bit(EV_KEY,evbit) && test_bit(KEY_ENTER,keybit)
  34.                    && test_bit(KEY_ESC,keybit) )
  35.                             {
  36.                               return dev_name;
  37.                            }

  38.        }
  39.        return NULL;
  40. }

  二。需要改进的地方
    这个程序在实际程序使用中相当方便,但是还是需要有一些改进。一是发现对于功能键如 KEY_UP/KEY_LEFT等怎么都是测试失败.

   二是需要对键值列表,应该用一个数组动态传入,以方便不同游戏的所需健的支的测试


阅读(2190) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~