Skip to content

LV045-tslib的工具和api

一、有哪些工具?

我们在编译输出目录会看到许多工具:

image-20240922151739790

它提供了单点触摸测试工具(ts_print、 ts_test)和多点触摸测试工具(ts_print_mt、 ts_test_mt),ts_print 和 ts_print_mt 可以在终端打印触摸点信息,而 ts_test 和 ts_test_mt 则支持在 LCD 上画线。

1. ts_print

我们在移植的时候已经配置了环境变量,可以直接在终端执行:

shell
ts_print
image-20240922151956017

执行 ts_print 命令之后,在触摸屏上滑动、或按下、松开触摸屏将会在终端打印出相应的信息。

2. ts_print_mt

我们直接在终端执行即可:

shell
ts_print_mt
image-20240922152108000

二、API 函数

使用 tslib 库函数需要在我们的应用程序中包含 tslib 的头文件 tslib.h 。使用 tslib 编程其实非常简单,基本步骤如下所示:

(1)打开触摸屏设备;

(2)配置触摸屏设备;

(3)读取触摸屏数据。

1. 打开与关闭触摸屏设备

1.1 ts_open

使用 tslib 提供的库函数 ts_open 打开触摸屏设备,其函数原型如下所示:

c
#include "tslib.h"
struct tsdev *ts_open(const char *dev_name, int nonblock);

参数 dev_name 指定了触摸屏的设备节点;

参数 nonblock 表示是否以非阻塞方式打开触摸屏设备,如果 nonblock 等于 0 表示阻塞方式,如果为非 0 值则表示以非阻塞方式打开。

调用成功返回一个 struct tsdev *指针, 指向触摸屏设备句柄;如果打开设备失败,将返回 NULL。

1.2 ts_setup

除了使用 ts_open() 打开设备外,还可以使用 ts_setup() 函数,其函数原型如下所示:

c
#include "tslib.h"
struct tsdev *ts_setup(const char *dev_name, int nonblock);

参数 dev_name 指定触摸屏的设备节点,与 ts_open() 函数中的 dev_name 参数意义相同; 但对于 ts_setup()来说,参数 dev_name 可以设置为 NULL,当 dev_name 设置为 NULL 时, ts_setup() 函数内部会读取 TSLIB_TSDEVICE 环境变量, 获取该环境变量的内容以得知触摸屏的设备节点。

参数 nonblock 表示是否以非阻塞方式打开触摸屏设备,如果 nonblock 等于 0 表示阻塞方式,如果为非 0 值则表示以非阻塞方式打开。

ts_setup()相比 ts_open(),除了打开触摸屏设备外,还对触摸屏设备进行了配置。

1.3 ts_close

关闭触摸屏设备使用 ts_close()函数:

c
int ts_close(struct tsdev *);

2. 配置触摸屏设备

调用 ts_config() 函数进行配置,其函数原型如下所示:

c
#include "tslib.h"
int ts_config(struct tsdev *ts);

参数 ts 指向触摸屏句柄。成功返回 0,失败返回-1。所谓配置其实指的就是解析 ts.conf 文件中的配置信息,加载相应的插件。

3. 读取触摸屏数据

读取触摸屏数据使用 ts_read()或 ts_read_mt()函数,区别在于 ts_read 用于读取单点触摸数据,而 ts_read_mt 则用于读取多点触摸数据。

3.1 ts_read

其函数原型如下所示:

c
#include "tslib.h"
int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr);

参数 ts 指向一个触摸屏设备句柄。

samp 参数是一个 struct ts_sample *类型的指针,指向一个 struct ts_sample 对象, struct ts_sample 数据结构描述了触摸点的信息; 调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存中。 struct ts_sample 结构体内容如下所示:

c
struct ts_sample {
    int x; // X 坐标
    int y; // Y 坐标
    unsigned int pressure; // 按压力大小
    struct timeval tv; // 时间
};

参数 nr 表示对一个触摸点的采样数,设置为 1 即可。

3.2 ts_read_mt

其函数原型如下所示:

c
#include "tslib.h"

int ts_read_mt(struct tsdev *ts, struct ts_sample_mt **samp, int max_slots, int nr);

参数 ts 指向一个触摸屏设备句柄。

samp 参数是一个 struct ts_sample_mt **类型的指针, 多点触摸应用程序, 每一个触摸点的信息使用 struct ts_sample_mt 数据结构来描述; 一个触摸点的数据使用一个 struct ts_sample_mt 对象来装载,将它们组织成一个 struct ts_sample_mt 数组,调用 ts_read_mt()时, 将数组地址赋值给 samp 参数。struct ts_sample 结构体内容如下所示:

c
struct ts_sample_mt {
    /* ABS_MT_* event codes. linux/include/uapi/linux/input-event-codes.h
     * has the definitions.
     */
    int x; //X 坐标
    int y; //Y 坐标
    unsigned int pressure; //按压力大小
    int slot; //触摸点 slot
    int tracking_id; //ID
    int tool_type;
    int tool_x;
    int tool_y;
    unsigned int touch_major;
    unsigned int width_major;
    unsigned int touch_minor;
    unsigned int width_minor;
    int orientation;
    int distance;
    int blob_id;
    struct timeval tv; //时间
    /* BTN_TOUCH state */
    short pen_down; //BTN_TOUCH 的状态
    /* valid is set != 0 if this sample
     * contains new data; see below for the
     * bits that get set.
     * valid is set to 0 otherwise
     */
    short valid; //此次样本是否有效标志 触摸点数据是否发生更新
};

max_slots 参数,表示触摸屏支持的最大触摸点数, 应用程序可以通过调用 ioctl()函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息 。

参数 nr 表示对一个触摸点的采样数,设置为 1 即可。