数码相框项目之触摸屏模块
首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
触摸屏驱动程序我在这篇文章有讲解:请点击这里! 有些朋会很奇怪,你这个驱动程序不是jz2440的,内核用的版本也不一样,我想说的是你都开始做项目了,如果连这个小问题都不能解决的,我劝你还是赶快回去从头开始学习。还是那句老话,我只提供思路和框架,万变不离其中这个道理你应该明白吧。如果你一味的去追求别人全部跟你做好了,你只是copy上去,编译成功。你学到多少呢?扯远了。
如果你驱动移植成功了,可以点击这里用tslib来测试,校验,查看打印坐标位置,我们后面用的到,测试触摸屏按下和松开两点的举例时候会用的到,所以这个tslib必须测试吧,编译的时候还会用到tslib库。tslib测试请点击这里!
下面就开始上代码touchScreen.c文件如下:
#include <config.h>
#include <input_manager.h>
#include <stdlib.h>
#include <tslib.h> /* tslib里面的头文件,在次强调一定要安装tslib */
#include <draw.h>
/* 参考tslib里的ts_print.c */ /* 可以打印两点的距离 */
static struct tsdev *g_tTSDev;
static int giXres;
static int giYres;
static T_InputOpr g_tTouchScreenOpr; /* 定义T_InputOpr类型的结构体,这个结构体定义在input_manager.h中 */
/* 注意: 由于要用到LCD的分辨率, 此函数要在SelectAndInitDisplay之后调用 */
static int TouchScreenDevInit(void) /* 初始化TouchScreen */
{
char *pcTSName = NULL;
if ((pcTSName = getenv("TSLIB_TSDEVICE")) != NULL ) /* 获取环境变量,在测试tslib时候指定的 */
{
g_tTSDev = ts_open(pcTSName, 1);
}
else
{
g_tTSDev = ts_open("/dev/event0", 1); /* 没有指定环境变量就打开/dev/event0 */
}
if (!g_tTSDev) {
DBG_PRINTF("ts_open error!\n");
return -1;
}
if (ts_config(g_tTSDev)) { /* 目前我也不知道是干嘛用的 ,猜测是做一些初始化工作,或者配置之类的*/
DBG_PRINTF("ts_config error!\n");
return -1;
}
if (GetDispResolution(&giXres, &giYres)) /* 获得lcd的分辨率 */
{
return -1;
}
g_tTouchScreenOpr.iFd = ts_fd(g_tTSDev); /* 获得这个文件的句柄,后面调用select函数监测 */
return 0;
}
static int TouchScreenDevExit(void)
{
return 0;
}
static int isOutOf500ms(struct timeval *ptPreTime, struct timeval *ptNowTime) /* 延时500ms,防止触摸屏不停的操作 */
{
int iPreMs;
int iNowMs;
iPreMs = ptPreTime->tv_sec * 1000 + ptPreTime->tv_usec / 1000;
iNowMs = ptNowTime->tv_sec * 1000 + ptNowTime->tv_usec / 1000;
return (iNowMs > iPreMs + 500);
}
static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent) /* 从触摸屏获取数据 */
{
struct ts_sample tSamp;
int iRet;
static struct timeval tPreTime;
iRet = ts_read(g_tTSDev, &tSamp, 1); /* 把读取到的值存放在tSamp这个结构体中 */
if (iRet < 0) {
return -1;
}
/* 处理数据 */
if (isOutOf500ms(&tPreTime, &tSamp.tv))
{
/* 如果此次触摸事件发生的时间, 距上次事件超过了500ms */
tPreTime = tSamp.tv;
ptInputEvent->tTime = tSamp.tv;
ptInputEvent->iType = INPUT_TYPE_TOUCHSCREEN; /* 触摸屏类型,不是串口终端或者按键, */
if (tSamp.y < giYres/3)
{
ptInputEvent->iVal = INPUT_VALUE_UP; /* 向上翻页 */
}
else if (tSamp.y > 2*giYres/3)
{
ptInputEvent->iVal = INPUT_VALUE_DOWN; /* 想下翻页 */
}
else
{
ptInputEvent->iVal = INPUT_VALUE_UNKNOWN; /* 点击中间部分就是没反应 */
}
return 0;
}
else
{
return -1;
}
return 0;
}
static T_InputOpr g_tTouchScreenOpr = { /* 给这个类型的结构 赋值,定义在头文件中定义*/
.name = "touchscreen",
.DeviceInit = TouchScreenDevInit,
.DeviceExit = TouchScreenDevExit,
.GetInputEvent = TouchScreenGetInputEvent,
};
int TouchScreenInit(void) /* 和上篇的lcd是一样的 */
{
return RegisterInputOpr(&g_tTouchScreenOpr);
}
input_manager.c文件如下:/* 不详细讲解了,和lcd框架是一模一样 */
#include <config.h>
#include <input_manager.h>
#include <string.h>
#include <sys/select.h>
static PT_InputOpr g_ptInputOprHead;
static fd_set g_tRFds;
static int g_iMaxFd = -1;
int RegisterInputOpr(PT_InputOpr ptInputOpr)
{
PT_InputOpr ptTmp;
if (!g_ptInputOprHead)
{
g_ptInputOprHead = ptInputOpr;
ptInputOpr->ptNext = NULL;
}
else
{
ptTmp = g_ptInputOprHead;
while (ptTmp->ptNext)
{
ptTmp = ptTmp->ptNext;
}
ptTmp->ptNext = ptInputOpr;
ptInputOpr->ptNext = NULL;
}
return 0;
}
void ShowInputOpr(void) /* 显示链表中有哪些成员 */
{
int i = 0;
PT_InputOpr ptTmp = g_ptInputOprHead;
while (ptTmp)
{
printf("%02d %s\n", i++, ptTmp->name);
ptTmp = ptTmp->ptNext;
}
}
int AllInputDevicesInit(void) /* 调用链表中结构体里面的初始化函数 */
{
PT_InputOpr ptTmp = g_ptInputOprHead;
int iError = -1;
FD_ZERO(&g_tRFds);
while (ptTmp)
{
if (0 == ptTmp->DeviceInit())
{
FD_SET(ptTmp->iFd, &g_tRFds); /* 这里还是为了select函数做的一些初始化操作 */
if (g_iMaxFd < ptTmp->iFd)
g_iMaxFd = ptTmp->iFd;
iError = 0;
}
ptTmp = ptTmp->ptNext;
}
g_iMaxFd++;
return iError;
}
int GetInputEvent(PT_InputEvent ptInputEvent)
{
/* 用select函数监测stdin,touchscreen,
有数据时再调用它们的GetInputEvent或获得具体事件
*/
PT_InputOpr ptTmp = g_ptInputOprHead;
fd_set tRFds;
int iRet;
tRFds = g_tRFds;
iRet = select(g_iMaxFd, &tRFds, NULL, NULL, NULL); /* 没数据读的时候就阻塞 */
if (iRet > 0)
{
while (ptTmp)
{
if (FD_ISSET(ptTmp->iFd, &tRFds))
{
if(0 == ptTmp->GetInputEvent(ptInputEvent)) /* 在链表中区找tTmp->iFd这个ID的结构体中的出读取函数 */
{
return 0;
}
}
ptTmp = ptTmp->ptNext;
}
}
return -1;
}
int InputInit(void) /* 初始化。仅仅是放进链表中 */
{
int iError;
iError = StdinInit();
iError |= TouchScreenInit();
return iError;
}
input_manager.h文件如下:
#ifndef _INPUT_MANAGER_H
#define _INPUT_MANAGER_H
#include <sys/time.h>
#define INPUT_TYPE_STDIN 0
#define INPUT_TYPE_TOUCHSCREEN 1
#define INPUT_VALUE_UP 0
#define INPUT_VALUE_DOWN 1
#define INPUT_VALUE_EXIT 2
#define INPUT_VALUE_UNKNOWN -1
typedef struct InputEvent {
struct timeval tTime;
int iType; /* stdin, touchsceen */
int iVal; /* */
}T_InputEvent, *PT_InputEvent;
typedef struct InputOpr {
char *name;
int iFd;
int (*DeviceInit)(void);
int (*DeviceExit)(void);
int (*GetInputEvent)(PT_InputEvent ptInputEvent);
struct InputOpr *ptNext;
}T_InputOpr, *PT_InputOpr;
int InputInit(void);
int RegisterInputOpr(PT_InputOpr ptInputOpr);
void ShowInputOpr(void);
int AllInputDevicesInit(void);
int GetInputEvent(PT_InputEvent ptInputEvent);
int StdinInit(void);
int TouchScreenInit(void);
#endif /* _INPUT_MANAGER_H */
浏览人工智能教程
数码相框项目之触摸屏模块相关推荐
- JZ2440 数码相框项目 扩展项目(一) 多文件图标 (二) 显示png
文章目录 链接 扩展项目一 1.目标 2.分析 3.实现 4.效果 扩展项目二 1.目标 2.分析 3.实现 a.分配注册子类结构体 b.判断文件是否为png c.获取png文件格式 4.效果 链接 ...
- 项目中的模块剥离成项目_使用MCEBuddy 2从电视录制中剥离广告
项目中的模块剥离成项目 One of the great things about time-shifting your television viewing is that you are able ...
- IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)
文章目录 IDEA 如何获取项目的模块数据 从项目源中选择模块加入当前项目中 如何移除项目中的模块 方式一,选择模块的根目录(Content Root),鼠标右键 Remove 方式二,打开[项目结构 ...
- python画画需要什么模块_python实战练手项目---使用turtle模块画奥运五环
python实战练手项目---使用turtle模块画奥运五环 2020年将举办东京奥运会,本篇实践文章将带你使用turtle模块画一个五环图,先来看效果图 1. 定义一个类继承Turtle class ...
- java多站点项目_java-在多模块项目构建期间模块之间的Maven...
为了清楚起见,您从多模块项目运行此命令时注意到了此行为: mvn clean test 但是您将具有相同的行为,即:无需在运行任何阶段的情况下就将模块之间的依赖关系解析并可用,而无需事先将它们安装在本 ...
- IDEA使用技巧 - 修改项目名称和模块名称
修改项目名称 步骤1:File->Project Structure->Project 修改Project name即可修改项目名称 修改模块名称
- IDEA搭建单模块springboot-web项目、多模块springboot-web项目
目录 1. 开发工具以及教程 2. 创建单个springboot项目 3. 创建多个模块的springboot项目 (1)创建父maven工程 (2)创建maven模块 (3)创建springboot ...
- 仿牛客社区项目笔记-帖子模块(核心)
仿牛客社区项目笔记-帖子模块(核心) 1. 帖子模块 1.1 过滤敏感词 1.2 发布帖子 1.3 帖子详情 1.4 显示评论 1.5 添加评论 1.6 私信列表 1.7 发送私信 1. 帖子模块 分 ...
- django-happy-shop一个可以快速集成到任何django项目的商城模块
django-haapy-shop 单看其名称就可以看出,他是一个跟django相关的商城,中间加了一个happy的单词,首先是因为pypi没有与这个重名的包,便于打包上传到pypi:其次,也是非常重 ...
最新文章
- 牛!Python 也能实现图像姿态识别溺水行为了!
- 清华天才王垠受邀面试阿里P9,被阿里P10赵海平面跪,整个事件回顾...
- optee内核中栈的介绍(一)
- 你以为的论文答辩,实际的论文答辩,看着看着就哭系列
- 分类算法——决策树算法及其R实现
- javac手动编译servlet
- 传统反病毒软件厂商学会新把戏
- android小游戏模版—重力感应
- Labview对mysql查询的数据进行展示
- Ubuntu中启用关闭Network-manager网络设置问题! 【Server版本】
- LINUX下载编译libgsm
- LINUX下使用scp命令与其他机器远程交换文件
- HTML是由____构成的____文件,JSP填空题
- 异数OS谈发展国产操作系统的问题
- 网页设计成品DW静态网页Html5自应式css3——动漫设计响应式(10页) HTML+CSS+JavaScript 动漫设计制作 简单静态HTML网页作品 动漫设计作业成品 学生个人网站模板
- [转] 教师的备课主要解决哪些问题?
- web前端三大主流框架是什么?
- Git学习之旅--撤销与删除
- 接了个变态需求:生成 Excel + PDF 导出,用 Java 怎么实现?
- 计算机专业免费电子书下载列表List of freely available programming books