资源描述
ucGUI中触摸屏操作在S3C2410上的实现
赵瑞芳 唐炎 吴倚龙
摘 要:本文就UCGUI中触摸屏操作实现给与一种实现方法,并总结出了在其实现过程中的重点与难点,同时就在移植过程中关键部分给以详细介绍,最后在描述触摸屏消息驱动机制的基础上给出一个测试范例以验证触摸屏在S3C2410上的成功实现。
关键词 嵌入式操作系统;触摸屏; uCGUI;uC/OS-II;
The realization of Touch Screen’s operation in ucGUI on S3C2410
1 前言
一般来说,一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体,嵌入式系统最大的特点就是其目的性与针对性,即每一个嵌入式系统的开发都有其特定的功能,这些功能的实现不仅与嵌入式处理器及软件系统密切相关,硬件系统中合理精简的外设也是必不可少的。一般的嵌入式系统配置有存储器,I/O设备,通信模块等必要外设;目前,随着嵌入式系统在人们生活中的广泛使用,对嵌入式系统得要求越来越人性化的需求,嵌入式系统图形界面的要求与触摸屏技术得到飞速的发展与应用。触摸屏是目前最简单、方便、自然的而且又适用于中国多媒体信息查询国情的输入设备,它具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。触摸屏技术被认为是未来人机交互科技的主流方向之一,相关的产业及其产品的应用也正在成为一个热点。
本文探讨了触摸屏技术与ucGUI在S3C2410上的整合实现,使用的软件平台是由ucos和ucgui组成的,其中使用的uCGUI版本为3.90试用版,uC/OS-II为2.52版本。应该后面论述的重点由以下几个部分组成,第一部分介绍触摸屏在S3C2410上底层驱动的实现,第二部分介绍ucGUI中整合触摸屏需要的相关操作,最后在分析触摸屏消息在ucGUI中驱动相关控件机制基础上给出一个测试用例,用于验证触摸屏操作在S3C2410上的实现。
2 触摸屏底层驱动实现
触摸屏是一种被广泛使用的计算机输入设备,正因为它使用操作简单方便,人们也更加青睐这种技术。从技术层面讲,触摸屏是一套透明的绝对寻址系统,这就要求触摸屏一方面是透明的,另外还要有绝对寻址的特性,还要可以识别手指的触摸动作。目前就识别手指触摸动作的不同原理,可以将触摸屏分为表面声波屏、电容屏、电阻屏和红外屏几种。其中基于电阻技术的触摸屏由于价格低廉,亦可满足绝大多数应用。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层,它的内表面也有一个ITO涂层,在它们之间有许多细小的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点的位置就有了接触,控制点侦测到这一接触点并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。
S3C2410支持触摸屏接口,S3C2410内置1个8信道的10bit模数转换器(ADC),该ADC能以500KSPS的采样资料将外部的模拟信号转换为10bit分辩率的数字量。同时ADC部分能与CPU的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。绝对地址包括两个部分,分别是x轴和y轴,其取值范围均为0~1024(0-210),这对应于触摸屏的分辨率,与LCD分辨率是不一样的,如果要体现LCD坐标位置,还需要在程序中进行转换,本文使用的ucgui内部已经实现了触摸屏到LCD的尺寸转换,用户只需配置相关宏定义即可。这部分仅涉及触摸屏底层驱动实现,对于尺寸转换和与底层整合将在下一部分展开。触摸屏底层驱动实现过程如下:
首先触摸屏控制器初始化,选择ADC转换模式,转换模式有Separate X/Y和Auto X/Y模式,这里选择Separate X/Y模式;其次设置触摸屏接口模式,触摸屏接口模式有以下四种:Normal转换模式,Separate X/Y转换模式,Auto X/Y转换模式以及等待中断模式,这里设置为等待中断模式;然后捕获中断,激活Separate X/Y中断模式;最后在中断服务例程里面获取X/Y坐标值,同时返回等待中断模式。这里说明的是触摸屏中断触发,有两种方式:一种是触摸屏按下触发,另一种是触摸屏弹出触发,弹出与按下中断状态可以通过判断寄存器ADCTSC的bit8置1或清零来实现,对于每一种中断状态,其x轴和y轴相应的值都应该返回。
3 在ucGUI中整合触摸屏
ucGUI本身支持键盘,鼠标,触摸屏等外设,并在源码级对其消息进行了响应,为使得触摸屏正常工作,用户除实现触摸屏底层驱动以外,还必须对其相应配置文件的修改和添加一些相关函数。
GUIConf.h文件中将宏GUI_SUPPORT_TOUCH定义为1。
GUITouchConf.h文件包括触摸屏矫正时使用的一些宏定义,我们需要根据目标板的具体配置设置具体的值,笔者使用的是广州友善之臂的SBC-2410套餐,其中触摸板和液晶屏都是8.4’’,修改后相应的值如下:
#define GUI_TOUCH_AD_LEFT 60 #define GUI_TOUCH_AD_RIGHT 970
#define GUI_TOUCH_AD_TOP 50 #define GUI_TOUCH_AD_BOTTOM 980
#define GUI_TOUCH_SWAP_XY 1 #define GUI_TOUCH_MIRROR_X 1
#define GUI_TOUCH_MIRROR_Y 1
理论上来说,GUI_TOUCH_AD_RIGHT 与GUI_TOUCH_AD_LEFT的取值或者为0,或者为1024(这是S3C2410内置的AD决定的),两者只取其一,GUI_TOUC_AD_BOTTOM与GUI_TOUCH_AD_TOP的取值同样遵守上述规定,但是在实际操作中往往不会如此设置,均会根据具体情况灵活处理,进行校准操作,诸如windowsCE等其它嵌入式系统中使用触摸屏时同样也需要进行触摸屏校准操作,触摸屏的校正是在触摸屏底层驱动的基础上实现的,通过点击触摸板上边界点位置,经由串口打印的坐标值判断上述宏的取值。我们只取左上角和右下角两点坐标作为校正标准,经过多次试验左上角坐标大约为(50,60), 右下角位置相应的值为(970,980), 故而确定相应宏的取值。余下几个宏均属于开关量,取值视相应情况而定。
在uCGUI框架基础上再增加一个文件,GUI_X_Touch.c,该文件中增加四个函数:
void GUI_TOUCH_X_ActivateX(void){} void GUI_TOUCH_X_ActivateY(void) {}
int GUI_TOUCH_X_MeasureX(void) {} int GUI_TOUCH_X_MeasureY(void){}
其中前面两个函数可以不予理会,只需在后面两个函数中返回测量值即可。这里测量值来源于触摸屏驱动返回的x, y值。
4 ucGUI中触摸屏消息驱动机制
ucGUI是一种嵌入式应用中的图形支持系统.它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。
在UCGUI当中有专门的接收外设输入的接口,这些接口针对鼠标,键盘,和触摸屏的,这些外设的输入,均以消息的形式发送给当前窗体的回调函数进行处理。触摸屏消息传递的实质就是通过一个全局变量_State记载和更新,这个全局变量有三个成员变量:消息发生点的屏幕X和Y坐标,滑动外设按下与否的操作状态。ucGUI中外设输入消息统一称为WM_TOUCH,函数WM_HandlePID()用于专门处理这种消息,该函数位于WMTOUCH.C文件中,其处理的流程如下:
1.通过GUI_PID_GetState获取一个GUI_PID_STATE结构的WM_TOUCH消息,消息的获取比较简单,在GUI\Core\GUI_PID.C文件当中处理,这个文件提供的是指针输入设备的输入消息处理。
2.将新获取的消息与函数内静态的旧消息变量进行比较,包括该消息发生点的屏幕坐标及外设操作状态(是否按下)。
3.如果支持图形鼠标,则根据新消息屏幕位置设置当前使用的鼠标位置,如果此处不进行这个设置,则在打开MOUSE支持后,MOUSE是无法移动的,在触摸屏当中一般不要求画出图形鼠标,但是为能够观察操作触摸屏的状态,这里我们使能了该功能。
4.当新旧消息的操作状态比较发生变化时处理该消息(通过将消息中的外设按下与否的状态相或的值是否为1来判断,为1则表示状态改变),否则发送WM_MOUSEOVER消息。在状态发生变化时,将操作状态的变化( 即新旧消息中的是否按下不相等时 )作为一个独立的消息WM_PID_STATE_CHANGED来发送,然后才将WM_TOUCH消息发送。
5.构造WM_TOUCH消息所需用要的数据,首先要获取到当前焦点窗体句柄,当前焦点窗体是用WM__hCapture的全局变量记载,如果为0则调用函数WM_Screen2hWin()根据消息发生点的屏幕坐标来获取WM_TOUCH消息的对应的窗体句柄。
6.比较新旧焦点窗体变量,初始旧焦点窗体变量值为0,每当处理消息后,如果是按下状态的WM_TOUCH消息,则会将当前焦点窗体句柄更新到旧焦点窗体变量中保存;如果不是按下状态的WM_TOUCH消息,则会在处理完消息后将旧焦点窗体变量赋为0值。
7.向当前焦点窗体发送消息,然后根据对于按下状态的消息更新旧焦点窗体变量值为当前焦点窗体,否则置其值为0。
8.更新当前消息到旧消息变量中,结束本次消息处理。
触摸屏经发送WM_TOUCH消息后,经由函数WM_HandlePID()处理,可能会产生以下三种消息之一,WM_MOUSEOVER和WM_PID_STATE_CHANGED和WM_TOUCH,其各自代表的实质如上所述,通常情况下发送触发最多的是WM_TOUCH消息,从而更新全局变量的值。上述消息发送以后,怎样去捕获和处理该消息,用户自己可以在当前焦点窗体回调函数中去处理,然而对于ucGUI 一些常用的控件,如Button按钮,已经在其回调函数中对相关消息(WM_PID_ STATE_CHANGED和WM_TOUCH)进行了处理,在button.c文件中可以找到相关的实现函数,如在BUTTON_Callback中对WM_TOUCH消息的处理函数_OnTouch(),其主要功能就是当用触摸屏或者鼠标点击该按钮时发送以下三种消息之一:WM_NOTIFICATION_MOVED_ OUT,WM_NOTIFICATION_RELEASED,WM_NOTIFICATION_PRESSED,之后可以在该按钮的父窗口捕获并处理该消息,在后面给出的测试例程中,就是捕获WM_NOTIFICATION_RELEASED消息,实现文本框字符显示功能的。
5 测试例程
为了能够更直观的观测到结果,在笔者已经实现的ucOS和ucGui的平台上,运用平台的多任务机制建立一个测试案例,这个案例由三个任务构成:Start_Task,Main_Task, GUI_Task, 它们优先级分别为7,8,9。具体实现的主要程序内容如下所示:
Start_Task:用于执行GUI_TOUCH_Exec()函数,更新触摸点状态,该任务主要代码如下:
while (1) {
GUI_TOUCH_Exec();
OSTimeDly(20);
}
MainTask:用于设置背景窗口的回调函数和建立前景窗口同时设置其回调函数,该任务快中代码流程如下:
1)建立前景窗口,同时设置其回调函数
2)增加最大化,最小化,关闭按钮
4)增加ok按钮,cancel按钮
3)设置鼠标显示
5) while (1) {
WM_Invalidate(WM_HBKWIN);
GUI_Delay(20);
}
GUI_Task:由于使用了视窗管理的回调机制,该任务必须实现,并且要定期的调用 。
while(1){
GUI_Exec();
GUI_X_ExecIdle();
}
cbBkWindow:背景窗口的回调函数,uCGUI是采用消息驱动的,其消息驱动响应是在特定窗口的回调函数当中实现的,该回调函数中只是实现了WM_PAINT消息,用于绘制背景桌面。
case WM_PAINT:
GUI_DrawBitmap(&bmGUI3,0,0); //绘制桌面背景
_cbFrame: 前景窗口的回调函数,并对窗口回调函数中的WM_NOTIFY_PARENT消息里面完成按钮点击消息进行相应,该部分代码如下:
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode=pMsg->Data.v;
switch (NCode){
case WM_NOTIFICATION_RELEASED:
hItem=WM_GetDialogItem(hWin,GUI_ID_EDIT0);
if (Id = = GUI_ID_OK) {
EDIT_SetText(hItem,"Start...");
}
if (Id= =GUI_ID_CANCEL){
EDIT_SetText(hItem,"End...");
}
break;
}
整个程序按照以流程运行:1)在Start_Task任务中,更新触摸点状态,放弃对cpu的占用,系统调度将对cpu的占用权交由MainTask;2)在MainTask任务中将桌面窗口句柄与其回调函数关联,建立前景窗口并设置与其回调函数关联,由WM_InvalidateWindow函数致使桌面背景窗口区域无效,从而发送WM_PAINT消息至背景窗口回调函数cbBkWindow是的背景图片重画,然后MainTask任务放弃对cpu的占用,系统调度将对cpu的使用权交由GUI _Task任务 3)在任务GUI _Task中进行一些背景处理和窗口更新工作,之后系统又开始新一轮的调度,在三个任务的while语句块中按照优先级的高低往复运行。需要说明的是这里的当前窗口上按钮放松的Click消息也会在MainTask的while循环中得到相应。将该测试案例烧写进目标版,目标版采用的是广州友善之臂的SBC-2410,液晶屏也是才用该公司的640*480像素的TFT型液晶屏幕。图三为测试案例在目标版上的运行结果,其中a为点击start按钮时的运行结果,此时文本框里面将打印”start…”字符串,b为点击start按钮时的运行结果,此时文本框里面将打印”end…”字符串。
a b
图 程序运行结果
6 结论
UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它能够很好的支持触摸屏等外设的使用。本文介绍了在S3C2410上移植ucos操作系统地基础上成功实现了ucgui中触摸屏操作的方法,实现了操作系统、图形界面系统以及外设触摸屏接口在S3C2410上的完美结合,为相关产品的设计研究提供了范例,特别是对ucugi初学者有良好的借鉴作用。
参考文献:
[1] JEAN J, LABROSSE.uC/OS-II源码公开的实时嵌入式操作系统[M]. 邵贝贝, 译. 北京: 中国电力出版社, 2001.
[2] user’s manual of s3c2410x
[3] UCGUI窗体管理及消息处理机制分析 ucgui专业论坛技术文档
[4] user’s manual of uC/GUI(3.24)
展开阅读全文