数码相框项目之触摸屏模块

简介:

触摸屏驱动程序我在这篇文章有讲解:请点击这里!   有些朋会很奇怪,你这个驱动程序不是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 */


目录
相关文章
|
8月前
|
人工智能 自然语言处理 数据可视化
校企合作|TsingtaoAI携手潍坊学院,共建AI驱动的党建信息化系统
TsingtaoAI与潍坊学院近日达成合作,正式签署《人工智能党建信息化系统开发》技术开发合同,计划在未来两年内联合开发一套集党员教育、党务管理、党建活动智能化以及数据可视化于一体的智能党建系统。本次合作将充分结合TsingtaoAI在AI大模型领域的技术优势和潍坊学院的学术资源,为推动党建工作的数字化、智能化和高效化注入新的动力。
174 10
|
11月前
|
存储 数据采集 数据安全/隐私保护
商汤、清华、复旦等开源百亿级多模态数据集,可训练类GPT-4o模型
商汤科技、清华大学和复旦大学等机构联合开源了名为OmniCorpus的多模态数据集,规模达百亿级,旨在支持类似GPT-4级别的大型多模态模型训练。该数据集包含86亿张图像和1696亿个文本标记,远超现有数据集规模并保持高质量,具备广泛来源和灵活性,可轻松转换为纯文本或图像-文本对。经验证,该数据集质量优良,有望促进多模态模型研究,但同时也面临存储管理、数据偏见及隐私保护等挑战。
470 61
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
AI时代下的个人发展之路:通过多栈变革实现跨越式成长
随着人工智能(AI)技术的飞速发展,企业和个人面临着前所未有的机遇和挑战。在AI时代,多栈变革成为推动企业和个人发展的关键。对企业而言,AI不仅促进了数据驱动的决策和智能自动化,还推动了产品创新和业务流程优化。而对于个人,AI的崛起提供了通过跨界学习、掌握多项技能及使用AI工具提升效率的机会。本文探讨了AI如何通过多栈变革推动企业和个人的全方位发展,同时也分析了面临的挑战与未来展望。在这个智能化、数据化的时代,只有不断学习与适应的企业和个人,才能抓住AI带来的机遇,迎接更加智能化的未来。
|
10月前
|
供应链 区块链
深入探索区块链技术在供应链管理中的应用
本文通过分析区块链的基本概念、技术特性及其在供应链管理中的创新应用,探讨了区块链技术如何提高供应链的透明度、效率和安全性。文章首先介绍了区块链的定义及工作原理,随后详细阐述了区块链在供应链中的具体应用场景,包括数据共享、货物追踪、合同执行等方面。最后,文章讨论了区块链技术面临的挑战和未来发展趋势,为供应链管理领域提供了新的视角和技术解决方案。
|
12月前
|
Python
Python量化炒股的获取数据函数—get_security_info()
Python量化炒股的获取数据函数—get_security_info()
187 1
|
人工智能 测试技术
真相了!大模型解数学题和人类真不一样:死记硬背、知识欠缺明显,GPT-4o表现最佳
【8月更文挑战第15天】WE-MATH基准测试揭示大型多模态模型在解决视觉数学问题上的局限与潜力。研究涵盖6500题,分67概念5层次,评估指标包括知识与泛化不足等。GPT-4o表现最优,但仍存多步推理难题。研究提出知识概念增强策略以改善,为未来AI数学推理指明方向。论文见: https://arxiv.org/pdf/2407.01284
185 1
|
安全 搜索推荐 网络安全
智能家居系统的安全性分析与防护措施
在数字化时代,智能家居系统以其便捷性和高效性受到越来越多家庭的青睐。然而,随着技术的快速发展,安全性问题亦逐渐凸显。本文深入探讨了智能家居系统中存在的安全风险,包括数据泄露、设备劫持和网络攻击等形式,并提出了相应的防护措施,旨在增强用户对智能家居安全的认识,促进更安全的智能家居环境构建。
|
机器学习/深度学习 人工智能 搜索推荐
探索人工智能在医疗健康领域的革新应用
本文将深入探讨人工智能(AI)技术在医疗健康领域的创新应用,从智能诊断系统、个性化治疗计划的制定到患者监护与健康管理,揭示AI如何提高医疗服务的效率和质量。通过分析具体案例,如AI辅助癌症检测和遗传病风险评估,本文旨在展现AI技术在现代医疗体系中扮演的关键角色,以及其对未来医疗保健的潜在影响。
|
云安全 弹性计算 小程序
阿里云赊呗开通、额度及还款常见问题解答FAQ
赊呗是蚂蚁集团旗下商诚融资担保有限公司为买卖双方在赊购交易中提供的担保服务。您在阿里云采购云产品时,可以使用赊呗额度先行支付,无需立即支付现金,享受先采购后付款的上云体验。
1173 0
阿里云赊呗开通、额度及还款常见问题解答FAQ