于幫偉,鄧華秋
(華南理工大學(xué) 理學(xué)院,廣東 廣州 510640)
在監(jiān)控系統(tǒng)中,屏幕顯示(On Screen Display,OSD)是實(shí)現(xiàn)人機(jī)對(duì)話的基礎(chǔ)。目前為止,在簡(jiǎn)單的硬件平臺(tái)上實(shí)現(xiàn)OSD主要有兩種途徑:一種實(shí)現(xiàn)方法是提取視頻的行場(chǎng)同步信號(hào),并以此控制字符發(fā)生電路,通過(guò)開(kāi)關(guān)在原視頻信號(hào)中嵌入字符信號(hào),這種實(shí)現(xiàn)方法比較復(fù)雜,而且穩(wěn)定性差;第二種方法是通過(guò)OSD專(zhuān)用集成芯片實(shí)現(xiàn),這種方法相對(duì)于前一種實(shí)現(xiàn)較簡(jiǎn)單,但是會(huì)增加系統(tǒng)的成本[1]。對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),成本是必須考慮的重要方面。本文在以S3C6410為主控芯片的Linux嵌入式平臺(tái)上,在沒(méi)有增加硬件外設(shè)的條件下,利用Qt/Embed?ded4.5.3實(shí)現(xiàn)了人機(jī)交互界面,能夠準(zhǔn)確響應(yīng)自定義鍵盤(pán)信號(hào)。
S3C6410是一款16/32位RISC微處理器,以ARM1176JZF-S為核心,提供了強(qiáng)大的視頻處理能力和豐富的內(nèi)部設(shè)備。操作系統(tǒng)為L(zhǎng)inux2.6.24,作為穩(wěn)定的開(kāi)源系統(tǒng),Linux為開(kāi)發(fā)工作提供了很強(qiáng)的自主性和便利性。
界面開(kāi)發(fā)工具是諾基亞公司提供的開(kāi)源工具包Qt/Embedded4.5.3,使用C++作為開(kāi)發(fā)語(yǔ)言。Qt/Embedded為界面開(kāi)發(fā)提供了豐富的控件類(lèi)、界面修飾工具和字體庫(kù)。Qt/Embedded的應(yīng)用程序還可以直接寫(xiě)內(nèi)核緩沖幀。同時(shí),作為嵌入式平臺(tái)專(zhuān)用庫(kù),Qt/Embedded提供了自定義鍵盤(pán)和鼠標(biāo)驅(qū)動(dòng)接口,占用資源較少,裁剪方便,隨著更高版本的推出,移植到嵌入式平臺(tái)也越來(lái)越簡(jiǎn)單,開(kāi)發(fā)人員有更多的精力集中在界面的設(shè)計(jì)和優(yōu)化上。Qt代碼可以一次編寫(xiě),多次編譯實(shí)現(xiàn)跨平臺(tái)應(yīng)用,基本界面調(diào)試在PC上就可以進(jìn)行,提高開(kāi)發(fā)效率。系統(tǒng)整體框架如圖1所示。
選擇在S3C6410上實(shí)現(xiàn)控制界面功能,在于S3C6410可以同時(shí)輸出5層視頻窗口,最終的視頻輸出是5層視頻窗口通過(guò)α疊加和Color Key綜合作用的結(jié)果,疊加方式是可編程的[2]。本文通過(guò)設(shè)置Color Key寄存器實(shí)現(xiàn)控制界面的隱藏和顯示。
在實(shí)際的顯示中,最外層視窗0(window0)顯示Qt/Embedded界面,視窗1(window1)顯示RGB565格式的視頻。視窗0和視窗1通過(guò)Color Key的疊加過(guò)程如圖2所示。
具體操作從硬件寄存器的設(shè)置和Linux應(yīng)用程序兩個(gè)方面來(lái)說(shuō)明。
在硬件層面主要是通過(guò)設(shè)置window1的Color Key控制寄存器W1KEYCON0實(shí)現(xiàn)的,W1KEYCON0的功能位如表1所示。
表1 window1的Color Key控制寄存器[2]
KEYBLEN位選擇是否使用alpha疊加功能疊加非關(guān)鍵區(qū)域,在使用Color Key實(shí)現(xiàn)疊加功能時(shí),該位保持默認(rèn)值。KEYEN_F是Color Key的開(kāi)關(guān)位;實(shí)驗(yàn)證明DIR?CON位是疊加效果控制位,當(dāng)DIRCON為1時(shí),window0中RGB值與COMPKEY相匹配的視頻數(shù)據(jù)將被window1中相應(yīng)位置的視頻數(shù)據(jù)疊加掉;當(dāng)DIRCON設(shè)置為0時(shí),window0中的內(nèi)容將被視window1完全疊加掉,相當(dāng)于隱藏了視窗0中的內(nèi)容,這時(shí)操作界面將隱藏。系統(tǒng)主要通過(guò)改變DIRCON的值來(lái)實(shí)現(xiàn)控制界面的隱藏與顯示。COMPKEY是window0中將被疊加掉的RGB值。
在Linux操作系統(tǒng)中,主要通過(guò)Linux內(nèi)核提供的系統(tǒng)調(diào)用函數(shù)ioctl()實(shí)現(xiàn)對(duì)W1KEYCON0的設(shè)置[3],其原型為int ioctl(int handle,int cmd,[int*argdx,int argcx])。
ioctl是對(duì)設(shè)備進(jìn)行簡(jiǎn)單操作的方法。其中,參數(shù)ar?gcx一般為控制設(shè)備的參數(shù)指針。隨S3C6410一起發(fā)布的Linux內(nèi)核在Frame Buffer的驅(qū)動(dòng)中實(shí)現(xiàn)了ioctl()函數(shù)接口,在用戶層通過(guò)系統(tǒng)調(diào)用函數(shù)ioctl()即可實(shí)現(xiàn)對(duì)W1KEYCON0的設(shè)置,從而實(shí)現(xiàn)視窗的疊加。其中,ioctl()設(shè)置寄存器W1KEYCON0的參數(shù)是如下結(jié)構(gòu)體變量:
其中,direction用來(lái)設(shè)置W1KEYCON0中的DIRCON值。3個(gè)顏色分量用來(lái)設(shè)置COMPKEY的值。為了便于COMPKEY的設(shè)置,控制界面除有效區(qū)域外都設(shè)置成黑色。因此,COMPKEY 3個(gè)RGB分量應(yīng)都為0。由于Col?or Key的顏色分量默認(rèn)為RGB888格式的視頻格式,而文中使用的是RGB565格式的視頻,所以,在設(shè)置COMP?KEY時(shí),紅色分量compkey_red和藍(lán)色分量compkey_blue的低3位需置位,綠色分量compkey_green的低2位需置位。
因此,顯示操作界面的Color Key的成員變量如下:
關(guān)閉或隱藏操作界面的結(jié)構(gòu)體變量初始化如下:
本文所采用的平臺(tái)要求通過(guò)帶有4個(gè)方向鍵和回車(chē)鍵的鍵盤(pán)實(shí)現(xiàn)控制界面的操作。然而,默認(rèn)情況下Qt/Embedded只支持個(gè)人PC的鍵盤(pán)模式,并且操作也不能完全由5個(gè)按鍵來(lái)完成,因此,需要子類(lèi)化用到的控件類(lèi),得到自定義的控件組,使Qt/Embedded控件更適用于當(dāng)前的嵌入式硬件系統(tǒng)。最后,為了實(shí)現(xiàn)與視頻信號(hào)疊加,需要對(duì)界面作一定的修飾。
3.1.1 使Qt/Embedded響應(yīng)自定義鍵盤(pán)信號(hào)
在內(nèi)核層,鍵盤(pán)驅(qū)動(dòng)通過(guò)每個(gè)按鍵的中斷處理函數(shù)產(chǎn)生一個(gè)唯一的16進(jìn)制數(shù)表示的鍵值,定義的鍵值與5個(gè)按鍵的對(duì)應(yīng)關(guān)系為:回車(chē)(0x1),上(0x2),下(0x3),右(0x4)和左(0x5),通過(guò)驅(qū)動(dòng)程序的read()將該鍵值發(fā)送到Linux用戶層。
在Qt/Embedded中有自定義鍵盤(pán)接口類(lèi)QWSKey?boardHandler,通過(guò)子類(lèi)化該類(lèi)可以讓Qt響應(yīng)自定義鍵盤(pán)信號(hào)。實(shí)現(xiàn)自定義鍵盤(pán)用到的另一個(gè)關(guān)鍵類(lèi)是QSocketNotifier。QSocketNotifier對(duì)象可以監(jiān)聽(tīng)Linux中的文件描述符,當(dāng)關(guān)于該文件的指定事件發(fā)生時(shí),QWS?KeyboardHandler對(duì)象將發(fā)送activated()信號(hào),通過(guò)Qt的信號(hào)槽機(jī)制可以將Qt以外的事件整合到Qt事件循環(huán)隊(duì)列中[4],從而實(shí)現(xiàn)響應(yīng)外部事件的效果。
通過(guò)在QWSKeyboardHandler子類(lèi)的構(gòu)造函數(shù)中創(chuàng)建QSocketNotifier對(duì)象,可以監(jiān)聽(tīng)鍵盤(pán)驅(qū)動(dòng)的輸出信號(hào),當(dāng)檢測(cè)到鍵盤(pán)文件有輸出信號(hào)時(shí),要做的工作如圖3所示[5]。
圖3 鍵盤(pán)信號(hào)處理流程
QWSKeyboardHandler的子類(lèi)實(shí)現(xiàn)之后,便成功定義了Qt鍵盤(pán)驅(qū)動(dòng)。調(diào)用上述鍵盤(pán)驅(qū)動(dòng),需要使用Qt服務(wù)進(jìn)程管理類(lèi)QWSServer。QWSServer可以封裝一個(gè)Qt服務(wù)進(jìn)程,這里通過(guò)QWSServer::setKeyboardHandler(QWS?KeyboardHandler*)封裝上面的Qt鍵盤(pán)驅(qū)動(dòng)。程序運(yùn)行時(shí),QWSServer將初始化鍵盤(pán)設(shè)備;當(dāng)鍵盤(pán)產(chǎn)生中斷時(shí),QWSServer讀取其中的鍵盤(pán)事件,并且將鍵盤(pán)事件傳送給相應(yīng)的應(yīng)用程序,從而實(shí)現(xiàn)Qt/Embedded應(yīng)用程序響應(yīng)自定義鍵盤(pán)信號(hào)。
3.1.2 讓Qt/Embedded控件正確響應(yīng)鍵盤(pán)信號(hào)
得到Qt可以識(shí)別的鍵盤(pán)信號(hào)之后,要求使用這5個(gè)按鍵信號(hào)完成所有必要的操作。然而,默認(rèn)情況下,Qt/Embedded中的控件只能響應(yīng)典型的PC鍵盤(pán)信號(hào)。可以通過(guò)重定義Qt/Embedded控件類(lèi)中的鍵盤(pán)事件響應(yīng)函數(shù)keyPressEvent(QKeyEvent*event)來(lái)改變控件對(duì)鍵盤(pán)信號(hào)的響應(yīng)[4],這是一個(gè)繼承于QWidget的虛函數(shù),主要實(shí)現(xiàn)控件對(duì)鍵盤(pán)事件的響應(yīng)??刂平缑娴亩鄶?shù)工作是通過(guò)QComoboBox顯示和完成的,重定義后的QComoboBox的成員函數(shù)keyPressEvent(QKeyEvent*event)關(guān)鍵代碼如下:
其中,OSD_open為標(biāo)示OSD界面顯示與否的全局變量,當(dāng)OSD正在顯示時(shí),OSD_open=1,否則OSD_open=0,這里QComboBox分兩種情況響應(yīng)鍵盤(pán)事件:
1)當(dāng)OSD_open=1時(shí),可以控制圖像化的OSD界面。按下左右鍵,QComboBox中的文本元素循環(huán)顯示。通過(guò)控制上下鍵,主界面循環(huán)改變聚焦的控件,相當(dāng)于PC上的Tab鍵的功能。
2)當(dāng)OSD_open=0時(shí),控制界面已經(jīng)被視頻數(shù)據(jù)完全疊加,說(shuō)明當(dāng)前輸出的視頻沒(méi)有控制界面,但是仍能夠正常響應(yīng)鍵盤(pán)事件,當(dāng)回車(chē)鍵按下時(shí),調(diào)用Display Con?troller的ioctl()函數(shù)可以重新顯示控制界面。
對(duì)其他應(yīng)用程序的控制是通過(guò)Qt/Embedded的信號(hào)槽機(jī)制實(shí)現(xiàn)的。信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,是Qt的核心特性,也是Qt區(qū)別于其他工具包的重要之處[6]??丶邮照_的鍵盤(pán)信號(hào)后,將發(fā)送信號(hào),之后與該信號(hào)通過(guò)connect()函數(shù)建立連接的槽函數(shù)被執(zhí)行,控制工作在槽函數(shù)中完成。例如本文的監(jiān)控系統(tǒng)能夠?qū)崿F(xiàn)視頻的黑白和彩色兩種輸出模式,之間的轉(zhuǎn)換通過(guò)信號(hào)槽機(jī)制實(shí)現(xiàn)如下:
connect(displaymode_combobox,SIGNAL(currentIndexChanged(int)),this,SLOT(displaymode(int)));
其中,displaymode_combobox為選擇黑白或彩色的QComboBox對(duì)象,當(dāng)通過(guò)左右鍵改變它的文本元素時(shí),displaymode_combobox的信號(hào)currentIndexChanged(int)將被發(fā)送,該信號(hào)將觸發(fā)與其建立連接的槽函數(shù)display?mode(int),在該槽函數(shù)中實(shí)現(xiàn)黑白彩色的轉(zhuǎn)換。
操作界面顯示時(shí)應(yīng)盡量不影響視頻的顯示效果,盡量只顯示與控制相關(guān)的字符信息,因此,需要對(duì)界面進(jìn)行必要的修飾。為了便于視頻窗的疊加,將主窗口的顏色設(shè)置為黑色:
pal.setColor(QPalette::Window,QColor(0x00,0xff,0x00,0x00));
widget->setPalette(pal);
同時(shí),Qt/Embedded4.5.3在嵌入式Linux中默認(rèn)的背景顏色為綠色,為了便于圖層疊加,將背景顏色設(shè)置為黑色,通過(guò)QWSServer來(lái)實(shí)現(xiàn)的。通過(guò)該類(lèi),將背景顏色設(shè)置為黑色的語(yǔ)句為:
QBrush*BackColor=new QBrush(QColor(0,0,0));
QWSServer::setBackground(*BackColor);
可以通過(guò)setStyleSheet()函數(shù)進(jìn)一步對(duì)界面的細(xì)節(jié)進(jìn)行修飾,以美化界面。
為了滿足不同用戶的需要,界面實(shí)現(xiàn)了中英文顯示,并且能夠手動(dòng)切換。英語(yǔ)作為Qt/Embedded的默認(rèn)語(yǔ)言,只需要系統(tǒng)的字體庫(kù)就可以正常顯示。Qt/Embedded提供了大量的國(guó)際化工具[6],可以方便地生成自己的翻譯文件(.qm文件)。默認(rèn)情況下,翻譯文件會(huì)在Qt/Em?bedded安裝目錄的/lib/fonts/下尋找對(duì)應(yīng)的字體庫(kù),只要將漢語(yǔ)字體庫(kù)放入該文件夾下,就可以通過(guò)翻譯文件實(shí)現(xiàn)中英文雙語(yǔ)顯示。
得益于S3C6410的視頻疊加功能和Linux操作系統(tǒng)的支持,本文在S3C6410 Linux嵌入式平臺(tái)上使用Qt/Embedded 4.5.3,成功實(shí)現(xiàn)了視頻監(jiān)控系統(tǒng)的控制界面功能,同時(shí),利用自制的鍵盤(pán)流暢的控制界面。本文所述功能已經(jīng)在監(jiān)控?cái)z像機(jī)中得到應(yīng)用。效果如圖4所示。
[1] 王江,潘亞濤,陳健.DVB-C機(jī)頂盒中OSD功能的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),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設(shè)備驅(qū)動(dòng)程序[M].北京:中國(guó)電力出版社,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環(huán)境下嵌入式鍵盤(pán)驅(qū)動(dòng)的實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2007,33(11):254-258.
[6]BLANCHETTE J,SUMMERFIELD M.C++GUI programming with Qt 4[M].2nd ed.北京:電子工業(yè)出版社,2008.