Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32821
  • 博文数量: 10
  • 博客积分: 472
  • 博客等级: 下士
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 12:43
文章分类

全部博文(10)

文章存档

2010年(10)

我的朋友
最近访客

分类: LINUX

2010-04-21 09:31:00

tslib 是一个用于触摸屏设备的函数库。通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来。为什么会出现这样的情况呢?因为触摸屏的坐标和液晶显示屏 之间的坐标并不是一一对应的, 所以,要让从触摸屏上得到的坐标正确转换为液晶显示屏上的坐标,需要经过一个转换过程。除此之外,tslib 还以插件的形式提供了一些附加的功能,比如去除点击触摸屏时的抖动等。
     
下面就先来看看 tslib 都提供了哪些接口。首先,tslib 中定义了两个结构体:
struct tsdev {
      int fd;
      struct tslib_module_info *list;
     };
struct ts_sample {
      int       x;
      int       y;
      unsigned int      pressure;
      struct timeval tv;
};
      struct tsdev
表示的是触摸屏设备,其中,fd 是打开的触摸屏设备的文件描述符,list 是一个链表,在这个链表中依次存放着指向 tslib 的插件的指针。
      struct ts_sample
用于存放按键消息,x y 表示按键的坐标位置,注意这两个坐标都是以液晶屏幕的坐标系为基准的,pressure 表示的是按键的轻重程度,tv 是一个 struct timeval类型的变量,表示按键发生的时间。
     
在基于 tslib 的程序中,所要用到的数据结构就只有上面这样两个。下面再看看 tslib 的函数,这里只列举后面将会用到的几个函数:
struct tsdev *ts_open(const char *dev_name, int nonblock);
int ts_config(struct tsdev *);
int ts_close(struct tsdev *);
int ts_fd(struct tsdev *);
int ts_read(struct tsdev *, struct ts_sample *, int);
      ts_open()
函数打开触摸屏设备, 第一个参数 dev_name 是要打开的触摸屏设备的文件名,第二个参数 nonblock 指明以何种方式读写触摸屏设备,如果 nonblock 0,则以非阻塞方式访问,如果 nonblock 0,则以阻塞方式访问。如果 ts_open()打开触摸屏设备成功,则返回一个 struct tsdev 类型的指针,否则返回 NULL
      ts_config()
函数的作用是读取触摸屏配置文件,并决定是否加载相关的插件。在作者所用的平台上,触摸屏配置文件为/etc/ts.conf,其内容如下:
module variance xlimit=50 ylimit=50 pthreshold=1
module dejitter xdelta=10 ydelta=10 pthreshold=1
module linear
     
上述内容表明 tslib 要加载三个插件模块,其作用分别是限定点击力度的方差、去除点击抖动、将触摸屏上的点击坐标转换成液晶屏幕上的坐标。variance 模块会采集四个采样点, 只有当这四个采样点在 x 轴和 y 轴方向上的方差都小于或等于模块参数 xlimit并计算其方差,和 ylimit 限定的范围时,这几个采样点才会被接受,否则 variance 模块将重新采集四个采样点计算。直到有符合要求的采样点才会将其递交给应用程序。dejitter 模块的作用是去抖动,其参数的含义用当前的采样点的坐标与前一个采样点的坐标求差值,    只有当差值小于或者等于 xdelta ydelta 限定的范围时,采样点的坐标值才有效。
     
如果正确加载了插值模块,ts_config()返回 0,否则返回-1
      ts_close()
的作用是释放触摸屏设备以及相关的资源。
      ts_fd()
返回打开的触摸屏设备的文件描述符。
      ts_read()
的作用是从触摸屏设备中读取采样点的坐标。第一个参数指向一个已经打开的触摸屏设备,第二个参数是一个 struct ts_sample 指针,从触摸屏设备读取到的值将填充到该指针指向的空间中,第三个参数指定了要读取多少个采样点。 有两个文件是与 tslib 密切相关的, ts.conf 指出了 MiniGUI、应该加载哪些插件模块。 这两个文件的位置是由当前环境变量指定的,详细请见下文中的有关Tslib的环境变量、配置文件等进行简要的介绍的 文章,需要注意的是这里的配置文件的路径必须放置正确,否则程序运行时将会报错。另一个文件是 pointercal,在这个文件中包含了触摸屏的校准数据(calibration ,正是由于该文件的存在,tslib 才能正确地在触摸屏坐标和液晶屏幕的坐标之间进行转换。在 tslib 的源代码中包含了工具 ts_calibrate,如果没有 pointercal 文件,那么可以用这个工具来产生 pointercal 文件中的校准数据。(首先运行它在目标板上产生pointercal文件)
阅读(1556) | 评论(0) | 转发(0) |
0

上一篇:SML

下一篇:.bash_profile和.bashrc有什么区别

给主人留下些什么吧!~~