MiniGUI在車載導(dǎo)航終端中的應(yīng)用
摘要:提出一種GPS車載導(dǎo)航終端的設(shè)計(jì)方案,并針對(duì)電子地圖導(dǎo)航所需的圖形界面支持系統(tǒng)進(jìn)行詳細(xì)論述。MiniGUI作為一種主要運(yùn)行于嵌入式Linux下的圖形用戶界面支持系統(tǒng),在本文中將其應(yīng)用到車載導(dǎo)航儀中,并提出一種基于MiniGUI的電子地圖的設(shè)計(jì)方法,配合GPS信號(hào)接收機(jī),實(shí)現(xiàn)定位導(dǎo)航功能。
關(guān)鍵詞:GPS MiniGUI 電子地圖 車載導(dǎo)航
引 言
隨著社會(huì)信息化的日益發(fā)展,車載終端的主要發(fā)展方向應(yīng)該是監(jiān)控跟蹤及導(dǎo)航相結(jié)合,即所謂的車載信息系統(tǒng),長(zhǎng)遠(yuǎn)發(fā)展則是通信、導(dǎo)航、娛樂、安防、辦公和上網(wǎng)為一體的車輛信息系統(tǒng)。
1 系統(tǒng)整體設(shè)計(jì)方案
本文中提出的車載導(dǎo)航終端設(shè)計(jì)方案,可實(shí)現(xiàn)GPS導(dǎo)航、電子地圖實(shí)時(shí)定位、GSM/GPRS通信等功能,通過實(shí)驗(yàn)已取得良好的效果。系統(tǒng)整體設(shè)計(jì)方案如圖1所示。
圖1車載導(dǎo)航終端整體設(shè)計(jì)方案
系統(tǒng)主控芯片采用了由韓國(guó)Samsung公司生產(chǎn)的ARM核32位RISC微處理器S3C2410,并在由其組成的開發(fā)板上移植Linux操作系統(tǒng),由Linux操作系統(tǒng)負(fù)責(zé)系統(tǒng)的整體調(diào)度和控制。通過S3C2410的UART接口連接GPS接收機(jī)JUPITER 021/031,用以接收NEMA0183格式的GPS定位信息。通過UART接口和GSM/GPRS模塊MC35進(jìn)行通信,通過發(fā)送AT命令控制MC35,來完成語音呼叫、GSM SMS及GPRS等功能。
為在車載LCD上實(shí)現(xiàn)電子地圖的繪制顯示,系統(tǒng)的整體層次框圖如圖2所示,由Linux操作系統(tǒng)負(fù)責(zé)底層硬件的初始化和管理,并向上層提供應(yīng)用接口,MiniGUI來完成電子地圖在LCD上的繪制,并通過Linux內(nèi)核提供的應(yīng)用接口與GPS接收機(jī)和GSM/GPRS模塊完成通信等功能。
圖2系統(tǒng)層次結(jié)構(gòu)框圖
2 圖形界面支持系統(tǒng)――MiniGUI
2.1MiniGUI介紹
MiniGUI是由許多自由軟件開發(fā)人員共同開發(fā)的一個(gè)自由軟件項(xiàng)目,遵循LGPL條款發(fā)布,其目標(biāo)是為基于Linux的實(shí)時(shí)嵌入式系統(tǒng)提供一個(gè)輕量級(jí)的圖形用戶界面支持系統(tǒng)。MiniGUI能夠在各個(gè)不同平臺(tái)上提供最大程度的接口兼容性,已運(yùn)行于ARM、MIPS等各種主流嵌入式硬件平臺(tái)之上。目前,在包括手持信息終端產(chǎn)品、金融終端、KTV點(diǎn)播系統(tǒng)、POS機(jī)等許多項(xiàng)目和產(chǎn)品中得到廣泛的應(yīng)用。
本文利用MiniGUI 1.30版本,將其編譯為lite版本并移植到基于ARM核的32位微處理器S3C2410上。在此基礎(chǔ)上,又開發(fā)了基于MiniGUI的電子地圖顯示應(yīng)用程序,配合GPS信號(hào)接收機(jī)實(shí)現(xiàn)定位導(dǎo)航功能。
2.2MiniGUI的交叉編譯
為了使MiniGUI能夠在不同的目標(biāo)平臺(tái)上運(yùn)行,必須有針對(duì)相應(yīng)平臺(tái)的交叉編譯工具。在本文的設(shè)計(jì)中,選用了由韓國(guó)Mizi公司開發(fā)和維護(hù)的armv41交叉編譯工具鏈,該工具鏈?zhǔn)荕izi公司針對(duì)Samsung公司32位ARM核RISC微處理器S3C2410設(shè)計(jì)開發(fā)的,因此與選用的硬件具有更好的兼容性。
MiniGUI使用自由軟件常用的automake和autoconf接口,因此MiniGUI的配置和編譯相對(duì)比較容易。首先進(jìn)入MiniGUI源代碼的目錄中,下面是具體交叉編譯的步驟。
① 為了達(dá)到交叉編譯的目的,首先要修改configure文件。設(shè)置make環(huán)境變量CC、LD及AR等,將其設(shè)置為選用的armv41交叉編譯工具,以達(dá)到交叉編譯的目的。
?、?IAL(Input Abstract Layer,輸入抽象層)接口的實(shí)現(xiàn)。在MiniGUI中,引入了輸入抽象層的概念,抽象層類似于Linux內(nèi)核中的虛擬文件系統(tǒng),定義了一組不依賴于任何硬件的抽象接口。(具體請(qǐng)參見MiniGUI源代碼src/include/ial.h及src/ial/ial.c)。
在具體實(shí)現(xiàn)一個(gè)輸入引擎的時(shí)候,其中最為關(guān)鍵的是事件處理函數(shù)wait_event()的實(shí)現(xiàn),MiniGUI會(huì)不斷的調(diào)用該函數(shù),來確定在輸入引擎上是否有輸入事件發(fā)生。這里需要特別注意的是,因?yàn)镸iniGUI是通過select系統(tǒng)調(diào)用來實(shí)現(xiàn)進(jìn)程間通信機(jī)制的,因此在實(shí)現(xiàn)lite版本輸入引擎的wait_event函數(shù)時(shí),一定要通過select函數(shù)或與其等價(jià)的poll函數(shù)來實(shí)現(xiàn)。與此同時(shí),在實(shí)現(xiàn)目標(biāo)板的觸摸屏驅(qū)動(dòng)時(shí),必須要實(shí)現(xiàn)相對(duì)應(yīng)file_operations結(jié)構(gòu)中的poll函數(shù)指針。即使觸摸屏驅(qū)動(dòng)沒有提供poll函數(shù),也要在wait_event返回之前調(diào)用select,并傳遞相關(guān)參數(shù)。
?、?依次運(yùn)行configure、make和make install命令,完成MiniGUI的配置和編譯。關(guān)于configure命令的詳細(xì)參數(shù)及含義可以通過運(yùn)行./configure Chelp命令獲得。
經(jīng)過上述編譯過程,會(huì)將編譯好的MiniGUI庫(kù)文件安裝在/home/MiniGUI-lite目錄下。為了減小庫(kù)文件的大小,可根據(jù)需要利用configure命令將MiniGUI中一些不需要的功能去掉,同時(shí)可以用交叉編譯工具鏈中的strip命令刪除MiniGUI函數(shù)庫(kù)中的符號(hào)信息和其他一些調(diào)試信息。關(guān)于MiniGUI自帶的范例程序mde及MiniGUI資源文件的編譯和安裝可參照上述庫(kù)文件的編譯過程及MiniGUI用戶指南進(jìn)行。
2.3MiniGUI向S3C2410上的移植
一般而言,在嵌入式系統(tǒng)開發(fā)過程中,編譯完MiniGUI和應(yīng)用程序后,需要把MiniGUI庫(kù)、資源和應(yīng)用程序拷貝到為目標(biāo)系統(tǒng)準(zhǔn)備的文件系統(tǒng)(目標(biāo)文件系統(tǒng))目錄中,然后使用相關(guān)的工具生成文件系統(tǒng)映像,再下載到目標(biāo)板上。
本文中Linux使用initrd技術(shù)來mount一個(gè)ramdisk作為目標(biāo)板的根文件系統(tǒng),因此需要將編譯好的MiniGUI的庫(kù)文件拷貝到ramdisk的/user/lib目錄下,同時(shí)將MiniGUI的資源文件也拷貝到該目錄下。
MiniGUI在運(yùn)行的時(shí)候需要一個(gè)配置文件,用來配置MiniGUI運(yùn)行所需要的環(huán)境參數(shù)。在本文的設(shè)計(jì)中,將配置文件MiniGUI.cfg放到了目標(biāo)板的/etc目錄下。mginit初始化時(shí)必讀的配置文件包括:系統(tǒng)使用的圖形引擎、輸入引擎、鼠標(biāo)、屏幕設(shè)備的指定、參數(shù)設(shè)置以及字體庫(kù)等信息。
另外還有一個(gè)問題需要注意,因?yàn)镸iniGUI使用framebuffer作為其輸入引擎,因此在編譯Linux內(nèi)核的時(shí)候,一定要將framebuffer相關(guān)的功能編譯到內(nèi)核中去。
3 繪制基于MiniGUI的電子地圖
3.1電子地圖數(shù)據(jù)的提取
MapInfo格式的電子地圖是目前使用最為廣泛的地圖格式之一。由于商用原因,截止至現(xiàn)在為止,MapInfo公司一直沒有向外界公布它原始的以矢量形式存儲(chǔ)的文件格式,即TAB格式,這就加大了直接利用MapInfo原始數(shù)據(jù)的難度。但MapInfo公司提供了與外界交換數(shù)據(jù)的機(jī)制,即MIF(MapInfo Interchange Format)格式地圖。
在本文的設(shè)計(jì)中,利用MapInfo MIF格式的地圖數(shù)據(jù)來完成地圖的繪制工作,通過選取合適的數(shù)學(xué)模型和建立合適的數(shù)據(jù)結(jié)構(gòu),來實(shí)現(xiàn)電子地圖的繪制。地圖中的地理信息可以將其歸為3類:
Point型――用于市區(qū)單位名等圖層的繪制和顯示;
Pline型――用于一級(jí)道路、二級(jí)道路、三級(jí)道路、單線河和橋等圖層的繪制和顯示;
Region型――用于邊框、居民地、綠地、市界、縣界和雙線河等圖層的繪制和顯示。
對(duì)應(yīng)于Point型、Pline型和Region型三種類型的地理信息,分別定義數(shù)據(jù)結(jié)構(gòu)_POINT、_PLINE和_REGION。以道路為例,在程序中定義對(duì)應(yīng)的_PLINE結(jié)構(gòu)來描述相關(guān)信息,該結(jié)構(gòu)定義如下:
struct _PLINE{
double* B;//描述各節(jié)點(diǎn)經(jīng)度坐標(biāo)的數(shù)組指針;
double* L;//描述各節(jié)點(diǎn)緯度坐標(biāo)的數(shù)組指針;
int m_node;//節(jié)點(diǎn)數(shù);
char *m_name;//名稱標(biāo)識(shí);
}
_PLINE和_REGION等數(shù)據(jù)結(jié)構(gòu)的定義與_PLINE類似,在這里不再詳細(xì)介紹。有了上述結(jié)構(gòu)的定義,就可以將MIF和MID文件中的信息讀取到為對(duì)應(yīng)信息定義的結(jié)構(gòu)變量中,然后在具體繪制電子地圖的時(shí)候只需對(duì)這些結(jié)構(gòu)變量進(jìn)行相應(yīng)的操作即可。
3.2MiniGUI下電子地圖的繪制
MiniGUI程序的入口點(diǎn)為MiniGUIMain,main函數(shù)已經(jīng)在MiniGUI的函數(shù)庫(kù)中定義,該函數(shù)在進(jìn)行一些MiniGUI的初始化工作后調(diào)用MiniGUIMain函數(shù)。如果應(yīng)用程序?yàn)閘ite版本MiniGUI下的應(yīng)用程序,則應(yīng)首先調(diào)用SetDesktopRect函數(shù)來設(shè)置程序的顯示區(qū)域,然后調(diào)用CreateMainWindow函數(shù)創(chuàng)建并顯示程序的主窗口,最終進(jìn)入消息循環(huán)。
MiniGUI是消息驅(qū)動(dòng)的系統(tǒng),一切運(yùn)作都圍繞著消息進(jìn)行,MiniGUI應(yīng)用程序通過接收消息來與外界交互。在電子地圖的繪制過程中,主要用到了MiniGUI的窗口繪制消息MSG_PAINT。該消息在需要進(jìn)行窗口重繪時(shí)發(fā)送到窗口過程。MiniGUI通過判斷窗口是否含有無效區(qū)域來確定是否需要重繪,在需要進(jìn)行重繪時(shí),MiniGUI會(huì)向相應(yīng)的窗口過程發(fā)送MSG_PAINT消息。
基于MiniGUI的主程序框架圖如圖3所示,為了與JUPITER 021/031通信,接收GPS定位信息,同時(shí)還要與MC35通信實(shí)現(xiàn)無線通信相關(guān)功能,因此在主程序中啟動(dòng)兩個(gè)子進(jìn)程來實(shí)現(xiàn)與子系統(tǒng)的串口通信。另外,使用Linux下的共享內(nèi)存(shared memory)和信號(hào)(signals)機(jī)制來實(shí)現(xiàn)進(jìn)程間的通信,用以傳遞定位數(shù)據(jù)等信息。GPS信息接收的子進(jìn)程功能框架如圖4所示。
圖3MiniGUI主程序框架
圖4定位信息接收子進(jìn)程框圖
圖5地圖繪制函數(shù)流程圖
當(dāng)MiniGUI主程序接收到其GPS通信子進(jìn)程發(fā)送的SIGUSR1信號(hào)時(shí),就會(huì)調(diào)用相應(yīng)的信號(hào)處理函數(shù)。為了實(shí)時(shí)更新定位點(diǎn)在電子地圖中的位置,必須在該函數(shù)中讀取共享內(nèi)存中的最新位置信息;同時(shí)根據(jù)定位點(diǎn)位置的變化確定需要重繪的區(qū)域,調(diào)用MiniGUI中的InvalidateRect函數(shù)使該區(qū)域無效。通過這種方式,使得最新的位置信息實(shí)時(shí)的在電子地圖上顯示出來。
為了把底層圖形設(shè)備和上層圖形接口分離開來,提高M(jìn)iniGUI圖形系統(tǒng)的可移植性,MiniGUI中引入了圖形抽象層(GAL, graphics abstract layer)的概念。在一定的GAL基礎(chǔ)上,實(shí)現(xiàn)了圖形設(shè)備接口(GDI,Graph Device Interface)。在程序中定義mpadraw函數(shù)為電子地圖繪制函數(shù),在主程序的MSG_PAINT消息處理時(shí)調(diào)用該函數(shù),來完成電子地圖的具體繪制工作。mpadraw函數(shù)流程圖如圖5所示。在具體繪制的過程中,要用到MiniGUI提供的GDI函數(shù)來完成道路、道路名、居民區(qū)等地理信息的顯示。圖6即為筆者實(shí)現(xiàn)的電子地圖。
圖6利用MiniGUI繪制的電子地圖
結(jié)語
隨著社會(huì)信息化的發(fā)展,GPS導(dǎo)航終端在我國(guó)有著光明的應(yīng)用前景。本文中利用MiniGUI來實(shí)現(xiàn)車載終端的電子地圖在LCD上地繪制,使地圖的繪制工作脫離煩瑣的底層硬件,大大的簡(jiǎn)化了此項(xiàng)工作,再配合GPS信號(hào)接收機(jī)實(shí)現(xiàn)實(shí)時(shí)定位導(dǎo)航的功能。同時(shí)也應(yīng)該看到,本方案仍有很多方面需要改進(jìn),例如矢量化地理信息的顯示及地圖顯示的進(jìn)一步優(yōu)化等。
參考文獻(xiàn)
1 北京飛漫軟件技術(shù)有限公司. MiniGUI用戶手冊(cè), 2003
2 吳信才. 地理信息系統(tǒng)原理與方法. 北京:北京電子工業(yè)出版社, 2002
3 宋立新. 面向嵌入式操作系統(tǒng)的圖形用戶界面: [學(xué)位論文]. 杭州:浙江大學(xué),2001
4 黑新宏,崔杜武,常斌. 基于MiniGUI的客戶端PDA的研究及開發(fā). 計(jì)算機(jī)應(yīng)用, 2003, 23(4):75~77
評(píng)論