网站设计的素材有哪些,免费网站下载直播软件,大学生网站建设例题答案,网站收录更新17. 使用 tslib 库 1. tslib 简介2. tslib 移植2.1 下载 tslib 源码2.2 编译 tslib 源码2.3 tslib 安装目录下的文件夹介绍2.4 在开发板上测试 tslib 3. tslib 库函数介绍3.1 打开触摸屏设备3.2 配置触摸屏设备3.3 读取触摸屏设备 4. 基于 tslib 编写触摸屏应用程序4.1 单点触摸… 17. 使用 tslib 库 1. tslib 简介2. tslib 移植2.1 下载 tslib 源码2.2 编译 tslib 源码2.3 tslib 安装目录下的文件夹介绍2.4 在开发板上测试 tslib 3. tslib 库函数介绍3.1 打开触摸屏设备3.2 配置触摸屏设备3.3 读取触摸屏设备 4. 基于 tslib 编写触摸屏应用程序4.1 单点触摸应用程序4.2 多点触摸应用程序 1. tslib 简介
tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库并且是开源。tslib 为触摸屏驱动和应用层之间的适配层 它把应用程序中读取触摸屏 struct input_event 类型数据这是输入设备上报给应用层的原始数据并进行解析的操作过程进行了封装向使用者提供了封装好的 API 接口。tslib 从触摸屏中获得原始的坐标数据 并通过一系列的去噪、去抖、坐标变换等操作来去除噪声并将原始的触摸屏坐标转换为相应的屏幕坐标。
2. tslib 移植
2.1 下载 tslib 源码
下载源码包git源码地址我下载的是 1.16
2.2 编译 tslib 源码
将上面下载的文件拷贝到系统根目录下。解压tar -xzf tslib-1.16.tar.gz在家目录下创建 tools/tslib 目录。 进入解压后的目录中使用source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi设置交叉编译工具./configure --hostarm-poky-linux-gnueabi --prefix/home/dnkrc/tools/tslib/ 执行配置注意将dnkrc替换为你的地址。然后 make再 make install 安装。
2.3 tslib 安装目录下的文件夹介绍 bin: 一些 tslib 提供的小工具用于测试触摸屏 etc: 有一个配置文件 ts.conf直接使用默认的就好 include: 只有一个头文件tslib.h包含一些结构体以及接口的声明 lib: 包含了编译 tslib 源码得到的库文件默认都是动态 share: 可忽略
2.4 在开发板上测试 tslib
将 tslib 目录下的一些文件拷贝到开发板系统目录下。
bin 目录下所有可执行文件拷贝到开发板 /usr/bin 目录下etc 目录下的配置文件 ts.conf 拷贝到开发板 /etc 目录下lib 目录下的所有库文件拷贝到开发板 /usr/lib 目录下 在开发板系统中还需要配置一些环境变量。
export TSLIB_CONSOLEDEVICEnone
export TSLIB_FBDEVICE/dev/fb0
export TSLIB_TSDEVICE/dev/input/event1
export TSLIB_CONFFILE/etc/ts.conf
export TSLIB_PLUGINDIR/usr/lib/ts如果想每次启动系统都能生效可以把这些命令放置在/etc/profile 脚本中执行
3. tslib 库函数介绍
3.1 打开触摸屏设备
#include tslib.h
struct tsdev *ts_open(const char *dev_name,int nonblock);
struct tsdev *ts_setup(const char *dev_name,int nonblock);
int ts_clock(struct tsdev *);上面两个函数都可以打开触摸屏设备 dev_name: 指定了触摸屏的设备节点对于 ts_setup 可以设备为 NULL会读取环境变量从而获取设备节点 nonblock: 为 0 表示阻塞方式不为 0 表示非阻塞方式
3.2 配置触摸屏设备
int ts_config(struct tsdev *ts);就是解析 ts.conf 文件中的配置信息
3.3 读取触摸屏设备
int ts_read(struct tedev *ts,struct te_sample *samp,int nr);
int ts_read_mt(struct tsdev *ts,struct ts_sample_mt **samp,int max_slots,int nr);参数 ts 指向一个触摸屏设备句柄参数 nr 表示对一个触摸点的采样数设置为 1 即可. ts_read()函数的 samp 参数是一个 struct ts_sample *类型的指针指向一个 struct ts_sample 对象 struct ts_sample 数据结构描述了触摸点的信息调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存中。struct ts_sample 结构体内容如下所示 ts_read_mt()函数的 samp 参数是一个 struct ts_sample_mt **类型的指针多点触摸应用程序每一个触摸点的信息使用 struct ts_sample_mt 数据结构来描述一个触摸点的数据使用一个 struct ts_sample_mt 对象来装载将它们组织成一个 struct ts_sample_mt 数组调用 ts_read_mt()时将数组地址赋值给 samp 参数。struct ts_sample 结构体内容如下所示
4. 基于 tslib 编写触摸屏应用程序
4.1 单点触摸应用程序
#include stdio.h
#include stdlib.h
#include tslib.hint main(int argc,char *argv[])
{struct tsdev *ts NULL;struct ts_sample samp;int pressure 0; // 保存上一次压力初始为 0表示松开tsts_setup(NULL,0);for(;;){ts_read(ts,samp,1);if(samp.pressure) {if(pressure) // 上一次按压力printf(移动(%d, %d)\n, samp.x, samp.y);elseprintf(按下(%d, %d)\n, samp.x, samp.y);}elseprintf(松开\n);pressuresamp.pressure;}ts_close(ts);return 0;
}压力大于 0则需要根据上一次压力判断状态。 编译代码时需要指定头文件、库文件的路径以及动态链接库文件名 ${CC} -I /home/dnkrc/tools/tslib/include -L /home/dnkrc/tools/tslib/lib -lts -o testApp testApp.c
4.2 多点触摸应用程序
int main(int argc, char *argv[])
{struct tsdev *ts NULL;struct ts_sample_mt *mt_ptr NULL;struct input_absinfo slot;int max_slots;unsigned int pressure[12] {0}; //用于保存每一个触摸点上一次的按压力,初始为 0,表示松开int i;/* 打开并配置触摸屏设备 */ts ts_setup(NULL, 0);if (NULL ts) {fprintf(stderr, ts_setup error);return -1;}/* 获取触摸屏支持的最大触摸点数 */ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), slot);max_slots slot.maximum 1 - slot.minimum;printf(max_slots: %d\n, max_slots);/* 内存分配 */mt_ptr calloc(max_slots, sizeof(struct ts_sample_mt));/* 读数据 */for ( ; ; ) {ts_read_mt(ts, mt_ptr, max_slots, 1);for (i 0; i max_slots; i) {if (mt_ptr[i].valid) //有效表示有更新{if (mt_ptr[i].pressure) //如果按压力0{if (pressure[mt_ptr[i].slot])//如果上一次的按压力0printf(slot%d, 移动(%d, %d)\n, mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);elseprintf(slot%d, 按下(%d, %d)\n, mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);}elseprintf(slot%d, 松开\n, mt_ptr[i].slot);pressure[mt_ptr[i].slot] mt_ptr[i].pressure;}}}ts_close(ts);free(mt_ptr);return 0;
}