tslib 入门学习

来源:互联网 发布:ubuntu退出文件夹命令 编辑:程序博客网 时间:2024/04/30 09:19

struct tsdev {      int fd;      struct tslib_module_info *list;     };struct ts_sample {      int       x;      int       y;      unsigned int      pressure;      struct timeval tv;};

tslib 是一个用于触摸屏设备的函数库。通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来。为什么会出现这样的情况呢?因为触摸屏的坐标和液晶显示屏 之间的坐标并不是一一对应的, 所以,要让从触摸屏上得到的坐标正确转换为液晶显示屏上的坐标,需要经过一个转换过程。除此之外,tslib 还以插件的形式提供了一些附加的功能,比如去除点击触摸屏时的抖动等。下面就先来看看 tslib 都提供了哪些接口。首先,tslib 中定义了两个结构体:

 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文件)

原创粉丝点击