APP下载

基于Qt/Embedded的嵌入式数字监控系统控制界面的实现

2011-06-06于帮伟邓华秋

电视技术 2011年24期
关键词:视窗控件键盘

于帮伟,邓华秋

(华南理工大学 理学院,广东 广州 510640)

0 引言

在监控系统中,屏幕显示(On Screen Display,OSD)是实现人机对话的基础。目前为止,在简单的硬件平台上实现OSD主要有两种途径:一种实现方法是提取视频的行场同步信号,并以此控制字符发生电路,通过开关在原视频信号中嵌入字符信号,这种实现方法比较复杂,而且稳定性差;第二种方法是通过OSD专用集成芯片实现,这种方法相对于前一种实现较简单,但是会增加系统的成本[1]。对于嵌入式系统来说,成本是必须考虑的重要方面。本文在以S3C6410为主控芯片的Linux嵌入式平台上,在没有增加硬件外设的条件下,利用Qt/Embed⁃ded4.5.3实现了人机交互界面,能够准确响应自定义键盘信号。

1 系统介绍

S3C6410是一款16/32位RISC微处理器,以ARM1176JZF-S为核心,提供了强大的视频处理能力和丰富的内部设备。操作系统为Linux2.6.24,作为稳定的开源系统,Linux为开发工作提供了很强的自主性和便利性。

界面开发工具是诺基亚公司提供的开源工具包Qt/Embedded4.5.3,使用C++作为开发语言。Qt/Embedded为界面开发提供了丰富的控件类、界面修饰工具和字体库。Qt/Embedded的应用程序还可以直接写内核缓冲帧。同时,作为嵌入式平台专用库,Qt/Embedded提供了自定义键盘和鼠标驱动接口,占用资源较少,裁剪方便,随着更高版本的推出,移植到嵌入式平台也越来越简单,开发人员有更多的精力集中在界面的设计和优化上。Qt代码可以一次编写,多次编译实现跨平台应用,基本界面调试在PC上就可以进行,提高开发效率。系统整体框架如图1所示。

2 视频窗口叠加的实现

选择在S3C6410上实现控制界面功能,在于S3C6410可以同时输出5层视频窗口,最终的视频输出是5层视频窗口通过α叠加和Color Key综合作用的结果,叠加方式是可编程的[2]。本文通过设置Color Key寄存器实现控制界面的隐藏和显示。

在实际的显示中,最外层视窗0(window0)显示Qt/Embedded界面,视窗1(window1)显示RGB565格式的视频。视窗0和视窗1通过Color Key的叠加过程如图2所示。

具体操作从硬件寄存器的设置和Linux应用程序两个方面来说明。

2.1 Color Key的主要功能寄存器

在硬件层面主要是通过设置window1的Color Key控制寄存器W1KEYCON0实现的,W1KEYCON0的功能位如表1所示。

表1 window1的Color Key控制寄存器[2]

KEYBLEN位选择是否使用alpha叠加功能叠加非关键区域,在使用Color Key实现叠加功能时,该位保持默认值。KEYEN_F是Color Key的开关位;实验证明DIR⁃CON位是叠加效果控制位,当DIRCON为1时,window0中RGB值与COMPKEY相匹配的视频数据将被window1中相应位置的视频数据叠加掉;当DIRCON设置为0时,window0中的内容将被视window1完全叠加掉,相当于隐藏了视窗0中的内容,这时操作界面将隐藏。系统主要通过改变DIRCON的值来实现控制界面的隐藏与显示。COMPKEY是window0中将被叠加掉的RGB值。

2.2 软件实现

在Linux操作系统中,主要通过Linux内核提供的系统调用函数ioctl()实现对W1KEYCON0的设置[3],其原型为int ioctl(int handle,int cmd,[int*argdx,int argcx])。

ioctl是对设备进行简单操作的方法。其中,参数ar⁃gcx一般为控制设备的参数指针。随S3C6410一起发布的Linux内核在Frame Buffer的驱动中实现了ioctl()函数接口,在用户层通过系统调用函数ioctl()即可实现对W1KEYCON0的设置,从而实现视窗的叠加。其中,ioctl()设置寄存器W1KEYCON0的参数是如下结构体变量:

其中,direction用来设置W1KEYCON0中的DIRCON值。3个颜色分量用来设置COMPKEY的值。为了便于COMPKEY的设置,控制界面除有效区域外都设置成黑色。因此,COMPKEY 3个RGB分量应都为0。由于Col⁃or Key的颜色分量默认为RGB888格式的视频格式,而文中使用的是RGB565格式的视频,所以,在设置COMP⁃KEY时,红色分量compkey_red和蓝色分量compkey_blue的低3位需置位,绿色分量compkey_green的低2位需置位。

因此,显示操作界面的Color Key的成员变量如下:

关闭或隐藏操作界面的结构体变量初始化如下:

3 界面的实现

本文所采用的平台要求通过带有4个方向键和回车键的键盘实现控制界面的操作。然而,默认情况下Qt/Embedded只支持个人PC的键盘模式,并且操作也不能完全由5个按键来完成,因此,需要子类化用到的控件类,得到自定义的控件组,使Qt/Embedded控件更适用于当前的嵌入式硬件系统。最后,为了实现与视频信号叠加,需要对界面作一定的修饰。

3.1 实现正确的键盘响应

3.1.1 使Qt/Embedded响应自定义键盘信号

在内核层,键盘驱动通过每个按键的中断处理函数产生一个唯一的16进制数表示的键值,定义的键值与5个按键的对应关系为:回车(0x1),上(0x2),下(0x3),右(0x4)和左(0x5),通过驱动程序的read()将该键值发送到Linux用户层。

在Qt/Embedded中有自定义键盘接口类QWSKey⁃boardHandler,通过子类化该类可以让Qt响应自定义键盘信号。实现自定义键盘用到的另一个关键类是QSocketNotifier。QSocketNotifier对象可以监听Linux中的文件描述符,当关于该文件的指定事件发生时,QWS⁃KeyboardHandler对象将发送activated()信号,通过Qt的信号槽机制可以将Qt以外的事件整合到Qt事件循环队列中[4],从而实现响应外部事件的效果。

通过在QWSKeyboardHandler子类的构造函数中创建QSocketNotifier对象,可以监听键盘驱动的输出信号,当检测到键盘文件有输出信号时,要做的工作如图3所示[5]。

图3 键盘信号处理流程

QWSKeyboardHandler的子类实现之后,便成功定义了Qt键盘驱动。调用上述键盘驱动,需要使用Qt服务进程管理类QWSServer。QWSServer可以封装一个Qt服务进程,这里通过QWSServer::setKeyboardHandler(QWS⁃KeyboardHandler*)封装上面的Qt键盘驱动。程序运行时,QWSServer将初始化键盘设备;当键盘产生中断时,QWSServer读取其中的键盘事件,并且将键盘事件传送给相应的应用程序,从而实现Qt/Embedded应用程序响应自定义键盘信号。

3.1.2 让Qt/Embedded控件正确响应键盘信号

得到Qt可以识别的键盘信号之后,要求使用这5个按键信号完成所有必要的操作。然而,默认情况下,Qt/Embedded中的控件只能响应典型的PC键盘信号。可以通过重定义Qt/Embedded控件类中的键盘事件响应函数keyPressEvent(QKeyEvent*event)来改变控件对键盘信号的响应[4],这是一个继承于QWidget的虚函数,主要实现控件对键盘事件的响应。控制界面的多数工作是通过QComoboBox显示和完成的,重定义后的QComoboBox的成员函数keyPressEvent(QKeyEvent*event)关键代码如下:

其中,OSD_open为标示OSD界面显示与否的全局变量,当OSD正在显示时,OSD_open=1,否则OSD_open=0,这里QComboBox分两种情况响应键盘事件:

1)当OSD_open=1时,可以控制图像化的OSD界面。按下左右键,QComboBox中的文本元素循环显示。通过控制上下键,主界面循环改变聚焦的控件,相当于PC上的Tab键的功能。

2)当OSD_open=0时,控制界面已经被视频数据完全叠加,说明当前输出的视频没有控制界面,但是仍能够正常响应键盘事件,当回车键按下时,调用Display Con⁃troller的ioctl()函数可以重新显示控制界面。

3.2 控制功能的实现

对其他应用程序的控制是通过Qt/Embedded的信号槽机制实现的。信号和槽是一种高级接口,应用于对象之间的通信,是Qt的核心特性,也是Qt区别于其他工具包的重要之处[6]。控件接收正确的键盘信号后,将发送信号,之后与该信号通过connect()函数建立连接的槽函数被执行,控制工作在槽函数中完成。例如本文的监控系统能够实现视频的黑白和彩色两种输出模式,之间的转换通过信号槽机制实现如下:

connect(displaymode_combobox,SIGNAL(currentIndexChanged(int)),this,SLOT(displaymode(int)));

其中,displaymode_combobox为选择黑白或彩色的QComboBox对象,当通过左右键改变它的文本元素时,displaymode_combobox的信号currentIndexChanged(int)将被发送,该信号将触发与其建立连接的槽函数display⁃mode(int),在该槽函数中实现黑白彩色的转换。

3.3 控制界面的修饰

操作界面显示时应尽量不影响视频的显示效果,尽量只显示与控制相关的字符信息,因此,需要对界面进行必要的修饰。为了便于视频窗的叠加,将主窗口的颜色设置为黑色:

pal.setColor(QPalette::Window,QColor(0x00,0xff,0x00,0x00));

widget->setPalette(pal);

同时,Qt/Embedded4.5.3在嵌入式Linux中默认的背景颜色为绿色,为了便于图层叠加,将背景颜色设置为黑色,通过QWSServer来实现的。通过该类,将背景颜色设置为黑色的语句为:

QBrush*BackColor=new QBrush(QColor(0,0,0));

QWSServer::setBackground(*BackColor);

可以通过setStyleSheet()函数进一步对界面的细节进行修饰,以美化界面。

3.4 中英文显示

为了满足不同用户的需要,界面实现了中英文显示,并且能够手动切换。英语作为Qt/Embedded的默认语言,只需要系统的字体库就可以正常显示。Qt/Embedded提供了大量的国际化工具[6],可以方便地生成自己的翻译文件(.qm文件)。默认情况下,翻译文件会在Qt/Em⁃bedded安装目录的/lib/fonts/下寻找对应的字体库,只要将汉语字体库放入该文件夹下,就可以通过翻译文件实现中英文双语显示。

4 实验验证

得益于S3C6410的视频叠加功能和Linux操作系统的支持,本文在S3C6410 Linux嵌入式平台上使用Qt/Embedded 4.5.3,成功实现了视频监控系统的控制界面功能,同时,利用自制的键盘流畅的控制界面。本文所述功能已经在监控摄像机中得到应用。效果如图4所示。

[1] 王江,潘亚涛,陈健.DVB-C机顶盒中OSD功能的设计与实现[J].电视技术,2000,24(5):31-33.

[2]Samsung Electronics.S3C6410X_UM_Rev[EB/OL].[2011-03-25].http://download.csdn.net/download/dclx/2759785.

[3]CORBET J,RUBINI A,KROAH-HARTMAN G.Linux设备驱动程序[M].北京:中国电力出版社,2009.

[4]Nokia Corporation.Qt for Embedded Linux reference documentation[EB/OL].[2011-03-25].http://doc.qt.nokia.com/4.5/index.html.

[5]张萍,徐晶.Qt_embedded环境下嵌入式键盘驱动的实现[J].计算机工程,2007,33(11):254-258.

[6]BLANCHETTE J,SUMMERFIELD M.C++GUI programming with Qt 4[M].2nd ed.北京:电子工业出版社,2008.

猜你喜欢

视窗控件键盘
视窗
你知道手机拨号键盘上为什么要有*和#吗?
视窗
键盘猫
Cлово месяца
ikbc R300机械键盘
关于.net控件数组的探讨
视窗
ASP.NET服务器端验证控件的使用
创意视窗