于幫偉,鄧華秋
(華南理工大學 理學院,廣東 廣州 510640)
在監控系統中,屏幕顯示(On Screen Display,OSD)是實現人機對話的基礎。目前為止,在簡單的硬件平臺上實現OSD主要有兩種途徑:一種實現方法是提取視頻的行場同步信號,并以此控制字符發生電路,通過開關在原視頻信號中嵌入字符信號,這種實現方法比較復雜,而且穩定性差;第二種方法是通過OSD專用集成芯片實現,這種方法相對于前一種實現較簡單,但是會增加系統的成本[1]。對于嵌入式系統來說,成本是必須考慮的重要方面。本文在以S3C6410為主控芯片的Linux嵌入式平臺上,在沒有增加硬件外設的條件下,利用Qt/Embed?ded4.5.3實現了人機交互界面,能夠準確響應自定義鍵盤信號。
S3C6410是一款16/32位RISC微處理器,以ARM1176JZF-S為核心,提供了強大的視頻處理能力和豐富的內部設備。操作系統為Linux2.6.24,作為穩定的開源系統,Linux為開發工作提供了很強的自主性和便利性。
界面開發工具是諾基亞公司提供的開源工具包Qt/Embedded4.5.3,使用C++作為開發語言。Qt/Embedded為界面開發提供了豐富的控件類、界面修飾工具和字體庫。Qt/Embedded的應用程序還可以直接寫內核緩沖幀。同時,作為嵌入式平臺專用庫,Qt/Embedded提供了自定義鍵盤和鼠標驅動接口,占用資源較少,裁剪方便,隨著更高版本的推出,移植到嵌入式平臺也越來越簡單,開發人員有更多的精力集中在界面的設計和優化上。Qt代碼可以一次編寫,多次編譯實現跨平臺應用,基本界面調試在PC上就可以進行,提高開發效率。系統整體框架如圖1所示。

選擇在S3C6410上實現控制界面功能,在于S3C6410可以同時輸出5層視頻窗口,最終的視頻輸出是5層視頻窗口通過α疊加和Color Key綜合作用的結果,疊加方式是可編程的[2]。本文通過設置Color Key寄存器實現控制界面的隱藏和顯示。
在實際的顯示中,最外層視窗0(window0)顯示Qt/Embedded界面,視窗1(window1)顯示RGB565格式的視頻。視窗0和視窗1通過Color Key的疊加過程如圖2所示。

具體操作從硬件寄存器的設置和Linux應用程序兩個方面來說明。
在硬件層面主要是通過設置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值。
在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的成員變量如下:

關閉或隱藏操作界面的結構體變量初始化如下:

本文所采用的平臺要求通過帶有4個方向鍵和回車鍵的鍵盤實現控制界面的操作。然而,默認情況下Qt/Embedded只支持個人PC的鍵盤模式,并且操作也不能完全由5個按鍵來完成,因此,需要子類化用到的控件類,得到自定義的控件組,使Qt/Embedded控件更適用于當前的嵌入式硬件系統。最后,為了實現與視頻信號疊加,需要對界面作一定的修飾。
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()函數可以重新顯示控制界面。
對其他應用程序的控制是通過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),在該槽函數中實現黑白彩色的轉換。
操作界面顯示時應盡量不影響視頻的顯示效果,盡量只顯示與控制相關的字符信息,因此,需要對界面進行必要的修飾。為了便于視頻窗的疊加,將主窗口的顏色設置為黑色:
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()函數進一步對界面的細節進行修飾,以美化界面。
為了滿足不同用戶的需要,界面實現了中英文顯示,并且能夠手動切換。英語作為Qt/Embedded的默認語言,只需要系統的字體庫就可以正常顯示。Qt/Embedded提供了大量的國際化工具[6],可以方便地生成自己的翻譯文件(.qm文件)。默認情況下,翻譯文件會在Qt/Em?bedded安裝目錄的/lib/fonts/下尋找對應的字體庫,只要將漢語字體庫放入該文件夾下,就可以通過翻譯文件實現中英文雙語顯示。
得益于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.