郝士林 李方軍 朱永杰
(西安電子工程研究所 西安 710100)
vxworks系統具有高效的微內核、可裁剪性、高可靠性、高穩(wěn)定性等優(yōu)點,被廣泛應用于農業(yè)、工業(yè)、醫(yī)療、軍事、航空航天等領域。隨著計算機硬件性能的提高,以前因硬件性能限制并不要求圖形界面的vxworks應用軟件也被越來越多的領域要求具備基本甚至復雜圖形功能。鑒于基于vxworks開發(fā)的軟件具備高實時性、高可靠性、支持圖形顯示、支持電子地圖等特點,目前軍品型號人機交互項目通常要求在vxworks操作系統進行設計實現。
vxworks操作系統在可靠性、實時性上滿足軟件設計要求。Windml作為風河公司的多媒體庫雖能提供對基本的圖元、視頻、音頻的支持,但自帶的控件不足以支撐復雜圖形界面的顯示[1],如電子地圖中的圖形要素。為了實現復雜的圖形界面,往往會借助于當今比較成熟的vxworks圖形開發(fā)工具,DeltaGUI作為輕量級的嵌入式圖形開發(fā)包具有可靠性強、占用資源少、易移植等優(yōu)點,能很好的支持嵌入式圖形界面的開發(fā),被廣泛應用于vxworks系統輕量級圖形開發(fā)上。
現在主流電子地圖都是在桌面地理信息系統工具Mapinfo中制作的完成,在嵌入式系統中并沒有專門的軟件或插件支持Mapinfo格式的電子地圖[2],在Vxworks系統實現電子地圖功能首先需開發(fā)Mapinfo電子地圖文件讀取工具,對讀取的地圖信息進行顯示。
Tab文件和MIF文件是Mapinfo地圖的主要存儲格式, 其中,Mapinfo的Tab數據存儲在屬性表結構文件(.tab)與屬性數據文件(.dat)中,空間數據保存在空間數據文件(.map)中,兩者通過交叉索引文件(.id)聯系。
Mapinfo公司并沒有對外公布原始矢量形式存儲的數據格式,但其提供的地圖數據交換格式(MIF和MID)可以供開發(fā)人員做二次開發(fā),該格式的空間數據以ASCII碼存儲,易生成且便于編譯。
MIF文件的內容主要包括“頭文件區(qū)”和“數據區(qū)”,在“頭文件區(qū)”規(guī)定了地圖的版本信息、字符集、投影坐標類型及表的結構;在“數據區(qū)”記錄了圖形的坐標和圖形屬性信息,包括點、文本、線、折線、區(qū)域、矩形、圓角矩形、橢圓、圓弧等;MID作為圖形屬性數據描述文件,對MIF文件中定義的圖形要素的屬性進行說明。
MapInfo軟件不能在vxworks系統下讀取MapInfo原始地圖數據,在vxworks系統下開發(fā)電子地圖,只能從mif和mid文件獲取地圖數據。地圖數據被存放在多個mif和mid文件,每個mif文件為一個圖層,圖形信息以圖元的形式存儲在mif圖層文件中,每個圖元的描述信息存儲在mid文件中,在程序設計時采用鏈表方式對文件信息進行存儲,根據mif文件格式定義圖元、圖層的數據結構體,典型的圖層結構體采用鏈表形式,內容包括點、線、折線、多邊形、區(qū)域、弧線等的屬性描述。
地圖讀取方法:打開第一個mif圖層文件,開辟內存創(chuàng)建圖層鏈表指針,將圖層中的圖形數據和mid文件中圖形描述信息以鏈表的形式存放在圖層結構體中,此圖層的圖元全部讀取完畢后,讀取下一個mif圖層文件,再次開辟內存創(chuàng)建圖層鏈表指針,將新的圖層指針賦值給上一圖層結構體中的下一圖層指針后,進行本圖層數據的讀取和存儲,以此類推完成所有文件的讀取,并將所有圖層的數據存在內存變量中,地圖讀取的過程是通過C++封裝的地圖讀取類實現,圖1為電子地圖文件讀取流程圖。
圖1 地圖文件讀取流程圖
DeltaGUI實現作圖的原理是在系統內存中分配一個與實際物理顯存相對應的虛擬顯示存儲空間,然后把虛擬顯示存儲空間的圖像數據更新到物理顯示存儲空間上以實現圖像的顯示。畫圖是把虛擬顯示存儲空間的圖像數據更新到物理顯示存儲空間的過程,實現圖形的刷新,這種顯示方式為脫屏緩沖,脫屏緩沖技術可最大限度的提高圖形顯示速度,減少圖形顯示時的閃爍。但出于效率和視覺考慮,在進行圖形數據更新時,可只更新發(fā)生變化的那塊區(qū)域的數據,這一區(qū)域被稱作為失效(無效)區(qū)域,若整個屏幕都發(fā)生變化,失效區(qū)域為整個屏幕。
電子地圖的顯示及相關操作由PPI顯示類實現,把內存中的地圖數據通過圖形工具包DeltaGUI以圖層的方式進行畫圖。為了保證畫圖的高效性,只繪制虛擬顯存中失效矩形區(qū)域內的圖元,當第一次繪圖時,失效區(qū)域為整個PPI屏幕,以后繪圖的失效區(qū)域是地圖或背景被覆蓋而需要重繪的矩形區(qū)域。
地圖縮放功能是響應雷達顯示量程的切換操作,根據切換后的量程自動切換地圖顯示范圍,當切換雷達顯示量程時,使整個矩形區(qū)域失效,按照電子地圖顯示流程,重新繪制地圖背景。
圖2 脫屏緩沖原理
圖3 電子地圖顯示流程圖
區(qū)域放大功能是將關心的區(qū)域放大至全屏,在需要放大的矩形區(qū)域左上角單擊鼠標左鍵不放,然后拖動鼠標至矩形區(qū)域右下角,釋放鼠標左鍵,矩形區(qū)域會放大到整個PPI屏幕,單擊鼠標右鍵恢復普通視圖。內部處理過程:首先根據DeltaGUI反饋的鼠標左鍵按下、鼠標移動、鼠標左鍵抬起、鼠標右鍵抬起消息,判斷是否執(zhí)行了區(qū)域放大操作或恢復普通視圖操作;若是區(qū)域放大操作,根據選擇的矩形區(qū)域進行比例放大,并重新計算放大后的顯示中心屏幕坐標,使整個矩形區(qū)域失效,按畫圖的流程完成畫圖;若是恢復圖通視圖操作,則將區(qū)域放大模式恢復至普通模式。
應用程序運行在單核CPU主頻1.1GHz,顯卡為intel Extreme Graphics2的單板機上。應用程序除了進行網絡任務、串口任務、圖形控件的操作與響應、鼠標鍵盤的操作與響應外,每40ms還進行一次屏幕刷新,刷新的主要內容包括點跡、航跡、雜波、微表、地圖。圖4為電子地圖顯示效果圖、圖5為區(qū)域放大顯示效果圖,操作過程中,圖形界面無卡頓,其他任務及操作響應及時,表明這種基于DeltaGUI的顯示方法能實現地圖及雷達信息的顯示功能,經過用戶長時間的使用,滿足可靠性和實時性的要求,且采用通用的C++語言實現,具有較強的移植性,可以應用在有相同需求的其他項目中。
圖4 電子地圖顯示效果圖
圖5 區(qū)域放大顯示效果圖
本文以某型雷達為背景,講述了在vxworks操作系統下電子地圖的實現方法,并在有限硬件平臺上實現電子地圖的顯示,最后成功應用在某在研型號項目中,提升了嵌入式系統實時性、可靠性、支和人機交互能力。該技術成果可在嵌入式指揮控制系統、火力控制系統中推廣,具有良好的應用前景。
參考文獻:
[1] 栗明,栗科峰.嵌入式圖形庫Windml中窗口控件的實現[J].數字技術與應用,2011(4): 125-126.
[2] 翟艷磊,何祥宇,夏玉杰.嵌入式電子地圖設計中Mapinfo文件的讀取和顯示[J].現代計算機,2010(2): 122-125.
[3] 李旭升.MiniGUI的研究及在嵌入式車載導航系統中的應用[D].成都:西華大學,2009.
[4] 汪亞雷,余春暄.基于嵌入式Linux的Mapinfo格式地圖顯示[J].嵌入式操作系統應用,2006,22(10-2):185-186.
[5] 趙從欣.基于Mapinfo平臺的Mif/mid文件成圖方法[J].四川測繪,2003:28-32.
[6] 李杰,付夢印,鄧志紅.Mapinfo格式的地圖數據在嵌入式導航系統中的應用[J].計算機工程與應用,2003(13):214-217.
[7] 北京科銀京成技術有限公司.DeltaGUI技術白皮書3.0[C].2002.