嵌入式图形用户界面的改进

类别:软件工程 点击:0 评论:0 推荐:

嵌入式图形用户界面的改进

 

 

摘要: 介绍嵌入式图形用户界面(GUI)的定制和改进。

 

关键字: 嵌入式系统、图形用户界面,Qtopia。

 

Abstract: The customization and improvement of the Embedded System’s GUI are introduced.

 

Key words: Embedded System、GUI、Qtopia.

 

一.引言

 

    我们时常在PC机上看到WINDOWS图形用户界面,以及LINUX上的KDE、GNOME,这些图形用户界面美观且方便用户操作,功能全面。嵌入式系统经常有一些特殊的要求,而这些要求普通的PC机上的图形窗口系统是不能满足的。比如特殊的外观效果,控制提供给用户的函数,提高装载速度,特殊的低层图形或输入设备。因此,嵌入式系统必定要有自己的图形用户界面。嵌入式图形用户界面就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统。

当今世界,嵌入式系统正以它体积小、专用性等特点深入社会应用的各个层次。在某些嵌入式应用领域中,比如PDA、HandHeld PC、AutoPC等嵌入式系统中,图形用户界面的性能将直接影响整个系统的性能,是产品制造商和最终用户共同关注的问题。如何针对用户的需求,在已有的图形用户界面上,定制和改进出具有特定功能的图形用户界面,是嵌入式系统开发者共同关注的问题。本文主要针对嵌入式系统图形用户界面二次开发的改进和定制。

 

二.嵌入式图形用户界面的分类

 

嵌入式系统往往是一种定制设备,它们对图形用户界面的需求也各不相同。有的系统只要求一些图形功能,而有些系统要求完备的GUI 支持。因此很多嵌入式系统需要自己特定的嵌入式图形用户界面。下面是几种常用的嵌入式图形用户界面及它们的特点:

 

1.MiniGUI

MiniGUI 是在Linux 控制台上运行的多窗口图形用户界面支持系统,可以在以Linux 为基础的应用平台上提供一个简单可行的GUI 支持系统。“小”是MiniGUI 的特色,MiniGUI 可以应用在电视机顶盒、实时控制系统、掌上电脑等诸多场合。它是基于SVGA库和LinuxThread 库的。MiniGUI 使用类似于Win 32 的API 来获得简单的具有Win 98 风格的图形用户界面,接口完备。

 

2.Microwindows

   Microwindows 是一个开放源代码项目, 目前由美国一家公司在主持开发。该项目的开发非常活跃,国内也有人参与了其中的开发,并编写了 GB2312 等字符集的支持。它主要特色在于提供了比较完善的图形功能,包括一些高级的功能,比如 Alpha 混合,三维支持,TrueType 字体支持等。它使得那些只有在具有相当的硬盘和RAM 配置的高端Windows系统才能实现的窗口系统,如Microsoft Windows 和X2Windows ,可以在嵌入式这类设备上运行。Microwindows 能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。它拥有WIN32编程接口,便于熟悉Windows开发的用户进行开发,不过接口不够完善。

 

3.  OpenGUI

   OpenGUI 在 Linux 系统上存在已经很长时间了。最初的名字叫 FastGL,只支持 256 的线性显存模式。但目前也支持其他显示模式。这个库是用 C++ 编写的,只提供 C++ 接口。不过它的接口是私有的,它的特点是资源消耗小,不支持多进程,且只能运行于X86平台。

 

4.  QT/Embedded

   Qt/Embedded是一个完整的自包含GUI和基于Linux的嵌入式平台开发工具。Qt/Embedded,Qt的嵌入式Linux端口,是完整的自包含C++GUI和基于Linux的嵌入式平台开发工具。大范围的Qt/Embedded API可用于多种开发项目。Qt/Embedded可以开发市场上多种类型的产品和设备,从消费电器(移动电话、联网板和set top盒)到工业控制设备(如医学成像设备、移动信息系统等)。

 

三.嵌入式图形用户界面改进的目的和一般方法

 

一般来说,在嵌入式系统的开发中,图形用户界面在直接面对用户前,都会经过二次开发者的定制和改进,目的是为了满足最终用户的需求,比如将一个英文操作界面改成中文操作界面,或者增加某些特定的控制功能。所以,改进嵌入式图形用户界面的目的在于使嵌入式系统更专有化,更能满足最终用户的使用需求。

 

嵌入式图形用户界面一般根据用户的具体需求进行改进,图示如下:

 

 

l       嵌入式图形用户界面(GUI)一般基于操作系统之上,直接与用户打交道。

l       在嵌入式图形用户界面中存在着很多模块,如显示模块、安全模块等,这些模块彼此独立地完成特定的工作,向下与操作系统交互,向上则向应用层提供相应的接口。

l       改进的第一种方法,是根据用户的需求,添加新的功能模块。

l       改进的第二种方法,是根据用户的需求,删除不必要的模块。

l       改进的第三种模块,是通过种模块向应用层提供的接口,设计出相应的应用程序。

 

 

四.基于QT的Qtopia图形用户界面的改进

 

    Qtopia是Trolltech面向嵌入式Linux的综合应用平台。Qtopia包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。它基于QT/Embedded的C++类库,拥有统一的应用程序编程接口,支持多任务管理,实用性强。下面是针对几个有特定功能的点作的改进:

 

1、  SD卡控制管理界面

 

一般情况下,外部设备的热拔插体现到用户界面上就是用户必须能通过软件控制硬件的插入或拔出,或者知道硬件的状态。这里我们以SD卡的即插即用管理为对象,实现一个能够控制SD卡热拔插的用户控制界面。为了实现SD卡的即插即用,可以在Qtopia环境下增加了一个系统图标,该图标用来显示当前卡的状态,另外还提供给用户拔插卡的一个软件接口。当卡插入系统时,Qtopia环境的左下角会出现一个SD卡的标志,以提醒用户,当前卡的存在。当用户想要拔出卡的时候,用户需要点击图标,选择”Eject SD”。系统图标消失之后,用户就能直接拔掉SD卡而不用关闭电源。实现这个功能需要做两方面的工作:

1) 捕获硬件插入或拔出信号。

2) 接收信号后做适当的前台与后台处理。

对于信号的捕获,相当于CPU处理外部信号一样,软件也有相当于轮询和中断的两种方式。对于轮询,程序周期对某个变量进行判断,该方式需要浪费不必要的CPU资源。对于中断,程序对相应的信号量进行down操作。当硬件信号发生的时候,由中断服务程序对这个信号进行up操作。这个方法在多道操作系统中得到了广泛的应用。但是,对于Qtopia,它在Linux中仅仅是一个进程,而系统图标运行于Qtopia的程序空间,如果该进程空间执行down操作,将会挂起整个Qtopia环境。所以,在系统中使用类似于轮询的机制,使用SD卡底层提供的字符文件接口的IOCTL方法的RROB_IN,每隔两秒钟查看一次SD卡的状态。

 

当检测到卡存在的时候,就把SD卡的快设备驱动程序加载进内核,使用mount系统调用加载文件系统,然后对界面发出绘画信号,将SD卡图标显示出来。当用户选中SD卡图标的Eject SD时,首先对卸载文件系统,把块设备驱动程序卸载出内核,以释放系统的资源,然后对界面发送hide消息,将SD卡的图标抹除。

 

该功能利用已有模块的编程接口,编写了一个方便用户使用的中文拼音输入法,为嵌入式图形用户界面改进的第三种方法。

 

 

2、  中文拼音输入法

 

对于Qtopia来说,它提供了中文的内码字库,使得Qtopia能够支持中文的显示。但是,它并没有提供一个方便的从内码到外码转换的中文输入法。所以,为用户添加一个中文输入法是非常有必要的。Qtopia在输入方法方面提供了如下的接口:

 

struct InputMethodInterface : public QUnknownInterface

{

virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ) = 0;

                                          //返回该输//入法的画布信息

       virtual void resetState() = 0;

       virtual QPixmap *icon() = 0; //输入法图标,当使用输入法的时候,出现在系统栏

       virtual QString name() = 0; //输入法名字,出现在选择输入法的选项菜单上

       virtual void onKeyPress( QObject *receiver, const char *slot ) = 0;

};

 

只需要建立一个继承该接口的类,编译成动态链接库,放在系统的inputmethod目录,Qtopia就可以自动调用到这个输入法。输入法被启动并不表示就可以输入字符了。用户还必须在开发输入法时需要做的是将key(ushort,ushort,ushort,bool,bool)信号与拥有焦点的对象关联,然后在一个适当的时候发送这个信号。比如,如果用户想删除文本中的一个字符,需要在程序中这样发出如下信号:

 

int send=0x08;

int keycode=Qt::Key_Backspace;

#if defined(Q_WS_QWS) || defined(_WS_QWS_)

emit key(send,keycode,0,true,false);

#endif

 

输入法中的汉字储存,采用unicode标准编码,字库则采用CJK标准字库。当用户输入拼音里,字库里检索用户想要的汉字,如果有,则显示给用户选择,否则,返回一个空的字串。

此外,还需要在输入法程序中加入中文显示及字库支持,由于Qtopia支持多国语言,所以字库不需要另行添加.

 

该功能利用已有模块的编程接口,编写了一个方便用户使用的中文拼音输入法,为嵌入式图形用户界面改进的第三种方法。

 

3、  背光控制模块

 

无论是在嵌入式设备的使用或者开发过程中,功耗问题都十分重要,而液晶屏的背光占功耗的很大一部分,所以,有必要在Sitsang板处于空闲状态时让背关暗下,以节省功耗。虽然Qtopia提供对背光的管理,以节省电能,但是在Intel移植版本中并没有做这一个功能。因此,有必要为Qtopia重新编写了这个部分.

 

该部分程序并没有嵌入到Qtopia环境中,而是单独编写的一个守护进程。该程序在系统启动的时候自动启动,运行于后台。

   为了能够检测用户的动作,首先编写了一个内核模块,用来检测用户的输入动作。当用户有输入的时候,唤醒正在等待该动作的进程,然后把笔落信号置为有效。该内核模块还给应用程序做了一个接口,允许应用程序关闭该中断检测。此时,背光灯将不会被关闭,当上课的时候,不会因为突然背光的关闭而打扰到用户。

 

守护进程每秒检测一次是否有落笔中断。如果没有,则表示用户在这一秒没有动作。如果用户在15秒内始终没有动作,程序将背光调整到10%的亮度,以节省电能。如果检测到100秒没有动作,则将背光灯关闭到2%,这个时候液晶上仅仅能勉强的分辨图标。当用户有动作,系统会马上打开背光灯,为用户操作提供方便。

 

该模块向上为应用程序提供了编程接口,向下则与操作系统进行交互,为嵌入式图形用户界面改进的第一种方法。

 

五.小结

  

   在未来社会中,可以预见,随着电子、计算机等行业的高速发展,嵌入式系统将以它专用化、效率高的特性深入实际应用的每个领域。而对于嵌入式系统的用户来说,一个人性化的的图形用户界面是必不可少的。所以,嵌入式图形用户界面的发展绝不能滞后于嵌入式系统的发展,而应该在努力改进满足系统要求的同时,走出自己的特点。

 

 

 

 

 

 

本文地址:http://com.8s8s.com/it/it32811.htm