实现针对触摸屏的输入引擎移植解析方案
3.嵌入式GUI研究
3.1基于嵌入式Linux的GUI系统底层实现基础
一个能够兼容多硬件平台的嵌入式GUI系统,应至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层 GAL(Graphic Abstract Layer)和基于输入设备(如键盘,触摸屏等)的输入抽象层 IAL(Input Abstract Layer)[3]。抽象层的概念类似Linux内核虚拟文件系统的概念,它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口上,而用于实现该抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序,这实际是一种面向对象的程序结构。利用该抽象接口,嵌入式GUI可以非常方便的移植到其他POSIX系统上,只需要根据抽象层接口实现新的引擎即可。
3.2嵌入式GUI基本性能需求
嵌入式GUI应在基于操作系统的基础上,为用户提供丰富的图形编程接口,使其能够方便快速的编制界面友好的应用程序。
GUI模块的性能指标为单位时间实例化个数,如下所列:
基本图形绘制速度,即点、线、框、块、圆、弧、椭圆等图形单元绘制速度。在显示设备可见范围内任意位置产生随机大小的基本图形。量化指标为单位时间内绘制的个数,并以较长测试时间中取得的单位时间平均值为准。
窗口创建速度。在显示设备可见范围内任意位置创建随机大小的窗口。量化指标为单位时间内成功创建及绘制完毕的窗口个数,并以较长测试时间中取单位时间平均值为准。
控件创建速度。在显示设备可见范围内任意位置创建随机大小、包含随机内容的窗口。量化指标为单位时间内成功创建及绘制完毕的控件个数,并以较长测试时间中取单位时间平均值为准。
事件驱动机制反应速度。针对窗口及不同控件的典型事件及耗时事件,测试其完成时间。窗口及控件的大小、复杂程度随机产生。量化指标为单位时间内成功处理完毕的事件数,并以较长测试时间中取单位时间平均值为准。
3.3输入引擎移植
在基于Linux的嵌入式系统中,输入设备可能只有触摸屏和为数不多的按键,相对图形引擎来说,输入设备的处理没有统一接口,在此情况下,提供一个抽象的输入层,显得尤为重要。
这里我们参考MiniGUI,并结合实际工程机械控制系统来实现输入引擎的移植工作。MiniGUI简单可分为三层,最顶层为API,即编程接口;中间层是 MiniGUI的核心层,其中包括了窗口系统必不可少的各个模块,如消息事件处理模块、图形设备接口等;而最底层则是GAL和IAL。
该实际工程机械控制系统拟采用触摸屏作为主要的输入设备,需要编写自己的输入引擎。首先定义一个结构体用来从触摸屏设备(/dev/ts)中接受数据,结构体定义如下:
typedef struct
{
unsigned short b; //触摸屏状态(是否被点击)
unsigned short x; //触摸屏x坐标
unsigned short y; //触摸屏y坐标
unsigned short pad; //32位填充域,无实际意义
} POS;
接下来定义输入引擎的初始化函数,该函数打开触摸屏设备文件:/dev/ts,类似PC上的/dev/psaux设备。在成功打开设备文件后,该函数通过 mouse_getxy和mouse_getbutton等函数将获得的状态信息通过INPUT结构体传递给GUI应用程序。
BOOl InitPADInput (INPUT*input,const char*mdev,const char*mtype)
{
ts = open(“/dev/ts”, O_RDONLY);
if (ts0) {
fprintf (stderr, “PAD:Can not open touch screen! ”);
return FALSE;
}
……
input->get_mouse_xy=mouse_getxy;
input->get_mouse_button=mouse_getbutton;
……
}
static void mouse_getxy(int* x, int* y)
{
*x=mousex;
*y=mousey;
}
static int mouse_getbutton(void)
{
return pos.b;
}
评论