劉東濤,肖 峰
(1. 海軍駐426廠軍事代表室,遼寧 大連 116015;2. 江蘇自動化研究所,江蘇 連云港 222006)
VxWorks操作系統是美國WindRiver公司于1983年設計開發的一種嵌入式實時操作系統,是嵌入式開發平臺的關鍵組成部分[1]。它以其良好的可靠性和卓越的實時性被廣泛地應用于通信、軍事、航空、航天等對實時性要求極高的領域中。
隨著VxWorks的應用群體不斷擴大,應用范圍不斷拓廣,用戶的需求也在不斷提高,很多應用系統已經不再局限于無界面、無交互的方式。越來越多的用戶要求提供高性能、高可靠的圖形用戶界面支撐系統。而圖形化界面開發恰恰是VxWorks的弱點,國外對嵌入式圖形系統的研究起步較早,在國內占據了大部分市場,處于壟斷地位,如WindRive公司的Tilcon。但是Tilcon存在的缺點是中文支持度不好,不支持中文輸入功能[2]。國內在圖形開發環境方面起步比較晚,在這方面的研究主要是基于VxWorks的圖形中間件軟件包──WindML進行二次開發[3]。在WindML基礎上自行開發圖形相關的功能函數,利用這種手段編寫的程序無法將顯示邏輯和數據處理邏輯劃分開來,界面開發工作量大,導致代碼重復,維護成本較高。作為操作系統和應用程序之間的中間件──飛漫公司的MiniGUI已經取得一定的成果,但MiniGUI的窗口管理器沒有完全基于WindML窗口管理器,不能完全兼容WindML(VxWorks標準的圖形開發庫),使得MiniGUI在VxWorks上應用受到限制。針對這種情況,本文在VxWorks標準圖形庫WindML的基礎上提出了一種基于控件技術的人機界面圖形開發庫JARI-EGK的設計方法。
嵌入式系統往往是一種定制設備,有不同的硬件設備,各個系統對人機界面圖形庫要求各不相同,如有的系統只要求一些圖形功能,而有的系統則要求完備的圖形用戶界面開發庫支持,因此,嵌入式窗口系統必須層次化,方便配置和定制。
為了屏蔽人機界面圖形庫與不同硬件設備的關聯,要求設計時就考慮分層次設計。如圖1所示,JARI-EGK建立在圖形抽象層(WindML)之上。WindML支持多媒體程序運行于嵌入式操作系統,主要目的是用來提供基本的圖形、視頻和音頻技術,以及提供一個設計標準設備驅動程序框架。WindML包含兩個組件——軟件開發包(SDK)和驅動程序(DDK),SDK組件用來開發應用程序,它提供了一個全面的API集[4],包括圖形、輸入處理、多媒體、字體和內存管理,DDK組件是用來實現驅動程序的,它提供了一個完整的驅動程序參考集,包括硬件配置和API集,以便開發者能夠迅速地引導和應用自己的驅動程序[5]。在不同硬件平臺上運行時,只需通過適應性的底層作圖函數修改就能滿足JARI-EGK的需求。WindML 為操作系統提供一個基本的抽象層,JARI-EGK為更高一級的抽象,JARI-EGK中的抽象層可通過WindML將特定底層硬件的細節隱藏起來,而上層應用程序則無需關心底層的硬件平臺輸出和輸入設備,進而應用程序只關心自己的特定功能滿足要求就可以了。WindML屏蔽了JARI-EGK與硬件平臺之間的關系,使得JARI-EGK可方便地應用到不同的硬件環境中去。

圖1 JARI-EGK層次圖
在JARI-EGK設計過程中,本文重點分析了窗口和控件關系、事件傳遞機制、窗口和控件狀態更新機制和中文輸入等問題。
在JARI-EGK的設計過程中,考慮到窗口、控件、控件組等關系,它們是有獨立也有聯系的各個錯綜復雜的關系的結合體。每個控件本身有共同的特點比如大小、位置、事件處理等,但是每個控件又有自己的不同行為,比如文本框、按鈕、TAB控件等,它們的外觀和事件處理方法都不相同,同時控件本身也存在父子關系,比如TAB控件包含幾頁,頁里面包含多少控件等,對于窗口也具有控件的某些特性、大小位置以及部分事件處理,整個JARI-EGK圖形系統應該具有組織、管理和查詢所有控件和窗口的能力[6],以及應用系統中包含多個窗口和控件,因而如何組織一個有效的數據結構管理這些控件和窗口是十分必要的。綜合這些原因,在JARI-EGK圖形系統中采用面向對象的設計理念,面向對象設計主要優點有:封裝性,繼承性,多態性。在設計過程中,為了增加代碼重用,建立一個良好的類關系,采用不同類來設計窗口以及各個控件。由于這些原因首先設計了四個主要的類Egk_Widget(控件基類)、Egk_Window(窗口類)、Egk_Group(控件組類)和Egk(全局類),其基本關系如圖2所示。
控件基類(Egk_Widget)包含了窗口和控件的基本信息,譬如長、寬等。JARI-EGK中的所有的控件、窗口和控件組都是由控件基類派生,控件基類來實現不同控件之間的相似功能,各控件的消息處理和回調都是由重載控件基類的函數來實現的的,從而可以讓每個屬于控件基類的控件均保持有相同的函數,這就是面向對象的多態性。由于窗口等有可能包含有控件,所以添加了Egk_Group(控件組類),Egk_Group也繼承自控件基類,同時又有自己的屬性,Egk_Group設置鏈表可以添加、刪除、查詢控件基類指針。在控件基類的設計過程中添加變量來區分當前控件類型是窗口還是控件。

圖2 窗口、控件類基本關系圖
當創建窗口的時候,在Egk類這個全局靜態變量鏈表里面增加一個窗口類指針。窗口包含一個控件指針數組,控件指針數組的第一個指針指向窗口本身,余下的依次指向其它控件以及控件組,控件組又可以包含別的控件指針,也就是可以包含其它控件,結束時控件指針數組設置結束標志、整個窗口、控件、控件組形成一個整體。另外設計一個窗口鏈表類包含各個窗口信息,譬如窗口ID號等,當存在多個窗口時,窗口鏈表類依次增加,查詢方法是存在多個窗口,先從窗口查詢開始,接著遍歷窗口包含的控件組和控件,對于控件組再遍歷控件組包含的所有控件。
控件和窗口采用了面向對象的設計理念, 事件傳遞通過重載控件基類的事件處理函數virtual int handle(int event)。外部消息,比如WindML底層事件(鼠標、鍵盤原始信息),首先發送給窗口[7]。這個由WindML窗口管理器處理。Egk類函數Egk::run()負責分發這些消息,根據窗口的ID號,發到相應的窗口類,窗口類里面的控件組成員變量包含了所有加載到本窗口的控件指針,窗口類遍歷控件指針,根據控件基類位置信息判斷給哪個控件發送信息,然后就發送給該控件,控件基類指針指向要選中的控件,這樣具體執行事件處理函數就可以執行消息響應了。比如當窗口接收到鼠標按下消息后,判斷位置在按鈕區域,然后執行按鈕的事件處理函數handle來實現按鈕的響應。如果含有控件組那么傳給控件組,控件組再遍歷控件指針數組,根據控件基類位置信息判斷給確定控件發送消息,具體的那個控件再執行相應的事件處理函數,如圖3(a)所示。對相似控件事件處理也充分利用面向對象中的繼承和派生方法,通過對已有控件事件處理函數的繼承,既可以讓該控件繼承已有控件類的大部分處理行為,同時又具有自己的特殊行為。比如,一般的編輯框會接收所有的鍵盤輸入,當我們希望自己的編輯框只接收數字時,就可以用這種辦法屏蔽非數字的字符輸入。

圖3 JARI-EGK、WindML窗口信息處理對照圖
JARI-EGK的事件處理采用開放性的設計原則,能夠和WindML應用程序能夠無縫結合,如圖3(a)、圖3(b)所示。對于JARI-EGK應用程序和WindML應用程序,WindML窗口相關的窗口信息和窗口管理起都是一樣的,WindML窗口只和底層事件、窗口信息和窗口管理器相關,對于WindML窗口來說兩個是完全相同的處理流程,所以JARI-EGK應用程序和WINDML應用程序能夠完全兼容。
窗口控件的行為和窗口一樣,即能夠接收鍵盤和鼠標等外部輸入,也可以在自己的區域內進行輸出,只是它們的所有活動被限制在主窗口中。當把控件和窗口都已經創建完畢,接著就是循環等待各種外部事件。窗口和控件狀態更新實現機理如圖所示。設計的過程中我們在控件基類里添加一個變量_damage,當僅僅控件需要更新時,我們把控件的_damage變成EGK_DAMAGE_CHILD,同時也設置它所隸屬窗口的_damage值也為EGK_DAMAGE_CHILD,當控件需要更新時,發送消息告訴窗口需要更新但不是全部更新,Egk::run()循環檢測到窗口的更新信息只是更新控件,窗口類查詢控件每個控件更新信息后,直接調用控件的Draw函數,更新控件,當整個窗口需要更新時,我們把窗口的_ damage變成EGK_DAMAGE_ALL這時窗口類更新整個窗口及其控件,這種更新機制保證了控件的及時有效的重繪。

圖4 窗口更新示意圖
JARI-EGK 的中文輸入是一個相對獨立的模塊(稱為 JARI-IME),完全內嵌在WindML中,它實際是一個特殊的窗口。該窗口將在啟動之后,首先將自己注冊為輸入法窗口,輸入法窗口一直出現在各個窗口的頂層。鍵盤信息管理負責管理輸入法模塊、底層鍵盤信息、WindML窗口之間鍵盤信息傳遞,鍵盤信息管理根據WindML窗口根據輸入法狀態決定鍵盤信息發送給輸入法窗口還是WindML窗口。發送給輸入法窗口后[8],經過輸入發模塊轉換成相應信息后再返回給WindML窗口,如圖5。當活動主窗口發生變化時,窗口管理器會通知輸入法窗口當前的活動窗口。這樣,當輸入法窗口接收到按鍵消息并且翻譯為適當的字符之后,就可以將其發送到當前的活動窗口。
窗口管理器為輸入法窗口定義了如下消息,當活動窗口發生變化時,JARI-EGK會向 IME 窗口發送這些消息:
IME_EGK_ SEND:發送該消息到當前活動窗口;
IME_EGK_ OPEN:發送該消息到當前活動窗口,告訴當前活動窗口輸入法窗口已經打開;
IME_EGK_CLOSE:發送該消息到當前活動窗口,告訴當前活動窗口輸入法窗口已經關閉。

圖5 輸入法模塊示意圖
在嵌入式操作系統VxWorks的圖形界面開發過程中,WindML作為VxWorks的標準圖形開發組件往往是最佳選擇,由于WindML只能實現點線圓作圖、窗口移動縮放等簡單功能,圖形界面開發支持較弱。本文采用基于控件技術的層次化設計和面向對象的設計方法,在WindML基礎之上實現了一種在VxWorks實時操作系統下具有自主知識產權和開放體系結構的人機界面圖形開發系統JARI_EGK。目前JARI-EGK已經成功應用到海軍多個項目軟件開發中,實際工程應用表明,JARI_EGK在功能和性能方面能夠滿足VxWorks實時操作系統下圖形界面開發要求。
JARI_EGK目前只能實現了二維圖形界面顯示開發,但是三維圖形界面顯示已經是大勢所趨,因而如何實現三維圖形界面顯示開發將是今后下一步研究工作的重點。
[1]孔祥營,柏桂枝.嵌入式實時操作系統VxWorks及其開發環境[M].北京:中國電力出版社,2002.
[2]張加林,李松,等.基于Tilcon的VxWorks圖形界面開發技術[J].指揮控制與仿真,2007(5).
[3]皇甫禎,陳懷民,等.VxWorks嵌入式圖形界面設計[J].測控技術,2008(8).
[4]WindML DDK 3.0 PROGRAMMER’S GUIDE [R],Wind River Systems, Inc.2002.
[5]WindML SDK 3.0 PROGRAMMER’S GUIDE [R], Wind River Systems, Inc.2002.
[6]趙甫,李躍,等. VxWorks上的一種GUI系統的設計與實現[J]. 計算機工程與設計,2006(15).
[7]董英英,王啟峰,等.基于S3C2440的WindML圖形驅動設計[J].現代電子技術,2010(16).
[8]萬海東,劉丹,等.軍事指揮系統中VxWorks下漢字顯示技術[J]. 計算機工程與設計,2009(13).