触模屏自动测试方法的实施

最近接到一个客户的测试任务,在车机的图片浏览界面,让图片自动进行播放。

接到这个任务的第一反应就是不知道怎么做,后来看到图片浏览界面上有上一张和下一张的button。我就想可不可以向touch screen设备中写入事件,并指定上一张和下一张的坐标,再利用一个循环来实现图片的自动播放。

于是,我近不及待的打开设备,来相找相关的内容。我首先可确定的是那个设备才是触摸屏。于是我执行了下面的操作:

  cd /dev/input

root@~:/dev/input# ls

y-path  event0

可以看到两个设备y-path 和event0。那不用想了肯定是event0。这个设备。如果在/dev/input下面有多个设备而你没有办法确定哪个设备是touch screen时,可以使用如下方法:

   cat /proc/bus/input/devices

会列出类似如下的信息:

    broot@~:~# cat /proc/bus/input/devices

I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="atmel_mxt_ts T100 touchscreen"                      注:N为设备的名字
P: Phys=i2c-1-004a/input0
S: Sysfs=/devices/44000000.ocp/48072000.i2c/i2c-1/1-004a/input/input1
U: Uniq=
H: Handlers=event0                                                            注:Handlers是/dev/input里面的设备名称
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=2e08000 3

其实我们只需要知道这个设备是touch screen 并且它在/dev/input/下面对应的名字是event0就可以了。

我们需要知道touch event里面有哪些信息,我首先想到的主是去找input.h这个头文件,于是我查看了input.h这个头文件。

里面关于input_event的定义如下:

struct input_event {
  struct timeval time;       注:时间
      __u16 type;                      类型
      __u16 code;                     代码
      __s32 value;                    对应的值
   }; 

可以知道了数据类型确不知道需要哪些数据来填充这个结构体。

当时就想把dev/input/event0 里面的数据读取出来,然后分析一下不就可以了,于是我执行了cat /dev/input/event0 命令执行失败。如果cat不行那用什么来读取呢?我上网找了一个资料,有人说用hexdump 可以并给出了dump出来的数据的具体解析:

hexdump /dev/input/event0

序号                  时间                        type     code     value 

00001e0    1559 50e3 f348 0006     0003    0039    000d 0000
00001f0     1559 50e3 f348 0006     0003    0035    0134 0000
0000200    1559 50e3 f348 0006     0003    0036    01b0 0000
0000210    1559 50e3 f348 0006     0001    014a    0001 0000
0000220    1559 50e3 f348 0006     0003    0000    0134 0000
0000230    1559 50e3 f348 0006     0003    0001    01b0 0000
0000240    1559 50e3 f348 0006     0000    0000    0000 0000
0000250    1559 50e3 4f88 0008     0003    0039    ffff ffff
0000260    1559 50e3 4f88 0008     0001    014a    0000 0000
0000270    1559 50e3 4f88 0008     0000    0000    0000 0000
每一点一下屏幕都会输出如上格式的信息。

这个信息与input_event的信息正好一一对应,那么接下来的思路就很清析了,打开/dev/input/event0 这个设备,

把填充好的input_event 结构体写回到event0中,就可实现自动点button的结果。

接下来要确定的是button的坐标,我用的方法是使用ts_print来输出对应的坐标转找成十六进制,然后再与hexdump命令输出的信息进行较,看哪些值是与坐标相关的。

刚开始的时候我以为只要找到与坐标相关的事件写入后就可以实现功能。可以经过偿试发现,必须把每点一次后hexdump输出的所有event全部回写才能实现功能。

对应的type 和code 可以在input.h中找到对应的宏,并且有些值也有相关的定义。这个需要一定的阅读代码的能力才能实现。

下面是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "linux/input.h"
int fd = 0;
int reportkey(int type ,int code,int value)
{
   int ret = 0;
   struct input_event event;
   ret = gettimeofday(&event.time,0);
   if(ret < 0)
   {
      perror("get time error\n");
      return -1;
   }
   event.type = type;
   event.code = code;
   event.value = value;
   ret = write(fd,&event,sizeof(struct input_event));
   if(ret < 0)
   {
      perror("write error\n");
      return -1;
   }
   return 0;

}
int openDevice()
{
   fd = open("/dev/input/event0",O_RDWR,0);
   if(fd < 0)
   {
      perror("open error\n");
      return -1;
   }
   return 0;

}
int autoTest(int NextX,int NextY)
{
   int ret = 0;
   ret = reportkey(EV_ABS,ABS_MT_TRACKING_ID,10);
   if(ret < 0)
   {
      perror("report ABS_MT_TRACKING_ID error\n");
   }
   ret = reportkey(EV_ABS,ABS_MT_POSITION_X,NextX);
   if(ret < 0)
   {
      perror("report NextX error\n");
      return -1;
   }
   ret = reportkey(EV_ABS,ABS_MT_POSITION_Y,NextY);
   if(ret < 0)
   {
      perror("Report NextY error\n");
   }
   ret = reportkey(EV_KEY,BTN_TOUCH,1);
   if(ret < 0)
   {
      perror("report Touch error\n");
   }
   ret = reportkey(EV_ABS,ABS_X,NextX);
   if(ret < 0)
   {
      perror("report ABS_X error\n");
   }
    ret = reportkey(EV_ABS,ABS_Y,NextY);
   if(ret < 0)
   {
      perror("report ABS_Y error\n");
   }
    ret = reportkey(EV_SYN,SYN_REPORT,0);
   if(ret < 0)
   {
      perror("report SYNC error\n");
   }
   ret = reportkey(EV_ABS,ABS_MT_TRACKING_ID,0xffffffff);
   if(ret < 0)
   {
      perror("report ABS_MT_TRACKING_ID error\n");
   }
   ret = reportkey(EV_KEY,BTN_TOUCH,0);
   if(ret < 0)
   {
      perror("report Touch error\n");
   }
    ret = reportkey(EV_SYN,SYN_REPORT,0);
   if(ret < 0)
   {
      perror("report SYNC error\n");
   }

   return 0;  
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值