当前位置: 代码迷 >> 综合 >> tslib 的 API 接口
  详细解决方案

tslib 的 API 接口

热度:47   发布时间:2023-10-18 09:58:48.0





作者的想法是通过
tslib 来构建
MiniGUI 的输入引擎。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文件);