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