周 旋,顧宏斌
(南京航空航天大學民航學院,江蘇 南京 211100)
控制顯示組件(Control and Display Unit)是飛行管理系統(tǒng)中人機交互的重要部件,是飛行員在飛行訓練中使用最多的模塊。飛行員使用CDU完成建立飛行計劃、修改航路、輸入FMC數(shù)據、檢索顯示頁面等飛行管理功能。因此,對CDU的仿真是整個飛行模擬系統(tǒng)不可或缺的部分[1]。
目前為止,在科研領域,對CDU的仿真主要停留在仿真CDU的按鍵輸入和頁面顯示功能,而CDU顯示的難點,其頁面的生成,則使用第三方軟件生成[2],或只仿真少部分頁面[3],無法滿足實驗和仿真的需要。本文在基于嵌入式Linux的ARM平臺下,選擇Qt作為GUI開發(fā)工具。參考737NG系列的CDU,歸納了頁面特性,用面向對象的思想封裝各級頁面,將各級頁面的信息和邏輯關系以資源文件的形式的存儲在SQLite數(shù)據庫中,根據可修改的數(shù)據庫信息生成CDU頁面,實現(xiàn)頁面顯示功能和按鍵事件響應,簡化了CDU頁面的開發(fā)復雜度。并使用標準鍵盤,將標準按鍵映射為CDU按鍵[4],為開發(fā)1:1 CDU仿真按鍵做好準備。經測試,該方案可以方便地生成CDU頁面,處理按鍵事件,并與上位機通信。在設計新型號CDU時只需修改數(shù)據庫和新建頁面變量即可生成新的頁面,滿足對不同種CDU快速開發(fā)的需要。
CDU是飛行管理計算機系統(tǒng)(Flight Management Computer System)的人機接口,通過CDU的鍵盤向FMCS輸入飛行計劃、性能數(shù)據、修改航路、檢索各種頁面信息(如導航數(shù)據、性能數(shù)據、咨詢信息、故障情況、自檢信息等)[1]。
在737NG系列飛機中,CDU負責頁面顯示與發(fā)送按鍵事件。其頁面的切換與數(shù)據的處理都是由FMC處理。但是在飛行仿真中,為了使各部分功能模塊化,方便分工合作,充分利用處理性能,將頁面標題生成和顯示,以及對按鍵事件的處理功能交給CDU仿真模塊,而上位機只負責復雜的飛行計劃的仿真。上位機與CDU仿真模塊通過UDP/IP協(xié)議通信,CDU仿真模塊將需處理的飛行數(shù)據發(fā)送給上位機,經上位機處理后發(fā)回,并在CDU仿真模塊中顯示。如圖1所示。
圖1 CDU仿真模塊的構架
在飛行管理計算系統(tǒng)的仿真中,CDU仿真模塊負責的是頁面顯示輸出功能。其顯示功能,就是根據鍵盤的輸入,改變頁面信息或者切換頁面,并將頁面上的信息傳輸給上位機的飛行計劃處理單元。因此,事實上CDU仿真模塊主要處理的任務就是根據外部響應切換頁面。實際的問題就轉化為,搭建一個實現(xiàn)顯示、按鍵輸入、并與上位機通信的嵌入式系統(tǒng)。
本文使用嵌入式Linux操作系統(tǒng)+QtGui來搭建CDU仿真模塊,Linux內核具有可裁剪的特性,可以裁剪不用的部分加快啟動時間[5]。Qt是主流的GUI解決方案,有面向對象性強,跨平臺的特點[6]。由于CDU的頁面數(shù)量很大,使用SQLite數(shù)據庫存儲頁面初始化信息。SQLite是主要面向嵌入式設備,擁有ODBC接口的輕量級數(shù)據庫。在Qt中使用QtSQL可以方便地使用SQLite數(shù)據庫功能[7]。
此外由于CDU按鍵功能的特殊性,可以將CDU功能按鈕的使能信息放在數(shù)據庫中。事實上,除了少部分特殊頁面的特殊功能以外,大部分頁面的初始化信息全部存儲在數(shù)據庫中,只需要更改數(shù)據庫信息,就可以改變頁面的文字信息。
CDU仿真模塊主要功能有頁面生成、顯示,按鍵事件響應和網絡通信的功能。在系統(tǒng)啟動后,首先讀取數(shù)據庫,初始化頁面,然后接收上位機飛行計劃相關信息并顯示,根據按鍵事件做出插入、復制數(shù)據等操作,在完成某些操作后將信息傳輸給上位機。CDU仿真模塊流程如圖2所示。
圖2 CDU仿真模塊流程
圖3 頁面系統(tǒng)
搭建CDU仿真模塊的關鍵在于:如何方便地生成大量的CDU頁面;如何處理復雜的頁面邏輯關系?使用面向對象的方法,總結歸納CDU頁面的特性,歸納的程度越高,就越能簡化每個獨立頁面所需的代碼。
(1)頁面的生成
真實CDU的任何頁面系統(tǒng)都包含三個部分:頁面的標題信息,頁面數(shù)據,頁面切換標識。其中,標題信息為小字顯示,頁面數(shù)據和頁面邏輯為大字顯示,如圖3所示。
飛行仿真中,CDU仿真模塊初始化頁面標題信息和頁面邏輯,頁面數(shù)據由上位機處理生成并使用UDP傳輸給CDU仿真模塊。在初始化過程中,把頁面數(shù)據初始化為空字符,把它視作頁面切換標識的子集。實際所有的頁面數(shù)據都由CDU仿真模塊初始化,在生成頁面時可以忽略其區(qū)別,在之后在處理頁面數(shù)據。
根據真實CDU顯示特性,頁面文字分為2類:小字體字符,包含頁面標題信息[1];大字體字符,包括頁面數(shù)據、頁面標題和頁面邏輯。
總結所有CDU頁面的特點,可以發(fā)現(xiàn)小字體字符的位置不會變化,大字體字符有2種變化:左右分布或者左中右分布[1]。左右分布其實是左中右分布的特殊形式,即中間沒有文字。把每組字符串視為單獨的對象,創(chuàng)建繼承QLabel類的QWord類,大字符為 QWordBig,小字體字符為 QWordS-mall。創(chuàng)建繼承QWidget的QCDU類,作為CDU頁面功能的基類,包含22個QWordBig類和12個QWordSmall類。參考真實CDU的顯示特性,使用Qt的Layout排版,設置QwordBig分別左右對齊,中間對齊,并根據字符的長度自動調節(jié)QWordBig的長度,在填入初始化字符串后,該方案可以模擬所有的CDU頁面。大字體字符串抽象圖如圖4所示。
圖4 大字體字符串抽象圖
(2)頁面的切換
頁面的存儲使用Qt的堆棧功能,頁面的切換則是使用了SQLite的查詢功能。
雖然CDU的頁面數(shù)量較大,但主要存儲的是文字信息,實際占用的空間并不大。在CDU模塊初始過程中,實際是初始化所有的QCDU對象。將所有的QCDU對象存儲在QStackWidget堆棧中,每個對象獲取唯一的堆棧號,并存儲到數(shù)據庫中,通過選擇堆棧號,切換相應頁面到前臺。
真實CDU中,有3種方式切換頁面:按下具有標準選擇功能并對應行含有“<”或“>”字符的按鍵;按下功能按鍵;上下翻頁鍵[1]。頁面切換功能的實質是將行選鍵對應的字符與頁面一一對應起來。為此,在后頁的QCDU類中增加一組標識字符串,其表示標識為唯一,使之與前頁字符串一一對應。當按下按鍵是,程序根據行選鍵對應的內容,搜索數(shù)據庫,找到對應的堆棧號,使用QStack-Widget功能切換到指定頁面。
如:真實CDU中,在位置起始頁(POS INIT)中“ROUTE>”對應航路頁(RTE)。因此,設置航路頁的QCDU類的標識符為“ROUTE”。CDU仿真模塊中,按下“ROUTE>”對應的行選鍵后,系統(tǒng)自動除去“>”符號,并在數(shù)據庫中搜索“ROUTE”頁面,搜索到RTE序號為5,使用QStackWidget類,切換顯示到堆棧號為5的QCDU頁面,即RTE,同時把便簽欄數(shù)據復制到RTE中。
真實CDU一共有包括行選鍵、功能鍵、數(shù)字字母鍵在內的78個按鍵,仿真與實物的移植,提高仿真效果,訂制與對應機型CDU在鍵盤大小,按鍵布局與按鍵功能一致的鍵盤。在程序中將鍵盤的輸入映射為CDU按鍵,重新定義標準鍵盤的按鍵事件,如將F1~F6定義為左功能鍵。
功能鍵主要有12個快捷鍵,2個翻頁鍵,1個執(zhí)行鍵組成[1]。按下快捷鍵時調用QStackWidget,直接跳轉到對應的頁面。翻頁鍵功能與之類似,配置QCDU加入堆棧時按頁面排列,按下下一頁按鍵時候當前頁面序號+1,即轉到下一頁。按下執(zhí)行鍵時檢測上位機發(fā)送的使能變量,判斷是否能夠執(zhí)行。
行選鍵是邏輯相對復雜的一種,每個功能鍵總計有5個功能,包括3個標準功能,2個非標準功能,其中非標準功能不常用[1]。將QCDU類作為基類,實現(xiàn)3個標準功能的處理函數(shù),使用虛函數(shù)描述2個非標準功能,在子類中重寫非標準功能處理函數(shù)。3個標準功能包括標準選擇功能,標準輸入功能,刪除功能。標準輸入功能和刪除功能實際是QCDU類中22個QWord數(shù)據的交換。對于標準選擇功能,需要對QWord中的字符串進行判斷,在包含“>”或“<”進行頁面切換,不含則與另兩個標準功能類似,只進行頁面內數(shù)據的交換。
雖然每個行選鍵在程序初始化時都有5個功能,但真實CDU系統(tǒng)中每個行選鍵都只擁有固定的幾項功能,如起始位置檢索頁,該頁中行選鍵都具有標準輸入功能,而沒有標準選擇功能[1]。CDU仿真模塊根據數(shù)據庫中存儲的信息使能行選鍵的功能,只需要修改數(shù)據庫中的數(shù)據設置就能設置行選鍵的功能。
如果將頁面數(shù)據及頁面邏輯信息都存儲在程序中,不僅會使程序結構復雜,且擴大了程序的體積。并且由于CDU頁面較多,當需要建立新頁面時,要將頁面標題數(shù)據全部輸入,對于不熟悉程序源代碼的人來說維護較為麻煩。因此,參照程序本體/資源文件模型,將頁面中的標題數(shù)據和邏輯信息存儲在資源文件中,在程序本體啟動時讀取資源文件,根據資源文件初始化。
資源文件是一種存儲在硬盤中的文件,其中可以包含文字、位圖、音頻等信息。資源文件不需要經過編譯,程序在初始化時通過特定的方式讀取資源文件,并存儲在內存中。使用資源文件可以減少主程序體積,在替換資源時不用重新編譯程序,且不影響程序運行速度。為了方便資源文件的維護和擴展,使用SQLite數(shù)據庫文件格式存儲資源文件。
資源文件中存儲的數(shù)據包括4個部分:
(1)頁面標識名稱(title)。對于每一個頁面,使用一個唯一的字符型常量與其對應,稱為頁面標識。程序中使用該名稱區(qū)分每個頁面,確保頁面變量能從資源文件中正確讀取對應的信息。
(2)換頁信息(pagename),該條目與頁面邏輯有關。存儲的文本用作檢索名稱,用于搜索
(3)行選鍵使能信息。決定了行選鍵的功能,為了方便維護,每個使能功能以可用位置的形式存儲。如在位置起始頁中,L2,L3,L5,L6,R4,R5 按鍵擁有標準輸入功能,R1,R2,R3,R6擁有標準選擇功能。在數(shù)據庫存儲方式為:fselect值為7,8,9,12。fenter值為 2,3,4,5,10,11。
(4)頁面顯示信息。即CDU頁面顯示的信息,參照實際CDU系統(tǒng)輸入。
由于嵌入式系統(tǒng)的處理能力較弱,CDU仿真模塊主要處理的是頁面的生成和按鍵事件的處理,負責較復雜運算的FMC的功能由上位機處理。由于傳輸距離很近,選擇使用UDP/IP通信協(xié)議進行數(shù)據的傳輸。在CDU仿真模塊頁面初始化完成后,發(fā)送頁面名稱,請求上位機發(fā)送相應頁面數(shù)據,根據機發(fā)送的信息顯示頁面數(shù)據。每當進行切換頁面操作時,CDU仿真模塊將頁面標題、頁面數(shù)據按順序發(fā)送給上位機。
打開CDU仿真模塊,運行上位機,并填入頁面數(shù)據。CDU進入IDENT(識別檢索)頁,頁面的數(shù)據能完整顯示。按下字母按鍵,便簽欄數(shù)據改變。按下行選鍵6R,頁面切換,進入POS INIT(位置初始化)頁,所有數(shù)據正常顯示。按下PageDown,進入POS REF頁。按下行選鍵1L,數(shù)據被復制到便簽欄中,如圖5所示。
圖5 實物展示
在已有頁面基礎上增加NAV DATA(導航數(shù)據頁面)。由于NAV DATA沒有非標準按鍵功能,直接使用QCdu類建立對象,插入堆棧。
QCdu*CduNavdata=new Cdu("NAV DATA");
insertcdu(CduNavdata);
數(shù)據庫中新建NAV DATA元素見表1。
表1
通過對真實CDU頁面邏輯的分析,基于嵌入式Qt開發(fā)環(huán)境建立了可與上位機交互的CDU仿真模塊。使用面向對象仿真技術和數(shù)據庫抽象出頁面顯示特性和頁面邏輯,簡化了完整CDU模塊的設計,為完全模擬CDU模塊打下基礎。使用標準鍵盤模擬按鍵輸入,方便調試,并具有擴展性。實驗結果表明,該方法能較好地模擬真實CDU的運行,并能減少CDU頁面開發(fā)的開發(fā)量,適應于各種飛行仿真環(huán)境。
[1]欽慶生.飛行管理計算機系統(tǒng)[M].北京:國防工業(yè)出版社,1991.
[2]向明,馬存寶.基于VAPS的FMS CDU實時仿真系統(tǒng)開發(fā)[J].計算機仿真,2006,(8).
[3]廖蜂,鄭書朋,侯偉欽,等.一種高逼真度的控制顯示組件仿真方法[J].計算機工程,2011,(4).
[4]陳又軍.基于仿真硬件CDU的飛行管理系統(tǒng)訓練器擴展研究[J].航空維修與工程,2009,(4).
[5]孫天澤.嵌入式Linux開發(fā)技術[M].北京:航空航天大學出版社,2011.
[6]蔡志明,盧傳富,李立夏.精通Qt4編程[M].北京:電子工業(yè)出版社,2008.
[7]孫磊.基于ARM Linux的嵌入式數(shù)據庫SQLite的移植開發(fā)[D].昆明:昆明理工大學,2008.