引 言
随着社会信息化的日益发展,车载终端的主要发展方向应该是监控跟踪及导航相结合,即所谓的车载信息系统,长远发展则是通信、导航、娱乐、安防、办公和上网为一体的车辆信息系统。
1 系统整体设计方案
本文中提出的车载导航终端设计方案,可实现GPS导航、电子地图实时定位、GSM/GPRS通信等功能,通过实验已取得良好的效果。系统整体设计方案如图1所示。
系统主控芯片采用了由韩国Samsung公司生产的ARM核32位RISC微处理器S3C2410,并在由其组成的开发板上移植Linux操作系统,由Linux操作系统负责系统的整体调度和控制。通过S3C2410的UART接口连接GPS接收机JUPITER 021/031,用以接收NEMA0183格式的GPS定位信息。通过UART接口和GSM/GPRS模块MC35进行通信,通过发送AT命令控制MC35,来完成语音呼叫、GSM SMS及GPRS等功能。
为在车载LCD上实现电子地图的绘制显示,系统的整体层次框图如图2所示,由Linux操作系统负责底层硬件的初始化和管理,并向上层提供应用接口,MiniGUI来完成电子地图在LCD上的绘制,并通过Linux内核提供的应用接口与GPS接收机和GSM/GPRS模块完成通信等功能。
2 图形界面支持系统——MiniGUI
2.1MiniGUI介绍
MiniGUI是由许多自由软件开发人员共同开发的一个自由软件项目,遵循LGPL条款发布,其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。MiniGUI能够在各个不同平台上提供最大程度的接口兼容性,已运行于ARM、MIPS等各种主流嵌入式硬件平台之上。目前,在包括手持信息终端产品、金融终端、KTV点播系统、POS机等许多项目和产品中得到广泛的应用。
本文利用MiniGUI 1.30版本,将其编译为lite版本并移植到基于ARM核的32位微处理器S3C2410上。在此基础上,又开发了基于MiniGUI的电子地图显示应用程序,配合GPS信号接收机实现定位导航功能。
2.2MiniGUI的交叉编译
为了使MiniGUI能够在不同的目标平台上运行,必须有针对相应平台的交叉编译工具。在本文的设计中,选用了由韩国Mizi公司开发和维护的armv41交叉编译工具链,该工具链是Mizi公司针对Samsung公司32位ARM核RISC微处理器S3C2410设计开发的,因此与选用的硬件具有更好的兼容性。
MiniGUI使用自由软件常用的automake和autoconf接口,因此MiniGUI的配置和编译相对比较容易。首先进入MiniGUI源代码的目录中,下面是具体交叉编译的步骤。
① 为了达到交叉编译的目的,首先要修改configure文件。设置make环境变量CC、LD及AR等,将其设置为选用的armv41交叉编译工具,以达到交叉编译的目的。
② IAL(Input Abstract Layer,输入抽象层)接口的实现。在MiniGUI中,引入了输入抽象层的概念,抽象层类似于Linux内核中的虚拟文件系统,定义了一组不依赖于任何硬件的抽象接口。(具体请参见MiniGUI源代码src/include/ial.h及src/ial/ial.c)。
在具体实现一个输入引擎的时候,其中最为关键的是事件处理函数wait_event()的实现,MiniGUI会不断的调用该函数,来确定在输入引擎上是否有输入事件发生。这里需要特别注意的是,因为MiniGUI是通过select系统调用来实现进程间通信机制的,因此在实现lite版本输入引擎的wait_event函数时,一定要通过select函数或与其等价的poll函数来实现。与此同时,在实现目标板的触摸屏驱动时,必须要实现相对应file_operations结构中的poll函数指针。即使触摸屏驱动没有提供poll函数,也要在wait_event返回之前调用select,并传递相关参数。
③ 依次运行configure、make和make install命令,完成MiniGUI的配置和编译。关于configure命令的详细参数及含义可以通过运行./configure –help命令获得。
经过上述编译过程,会将编译好的MiniGUI库文件安装在/home/MiniGUI-lite目录下。为了减小库文件的大小,可根据需要利用configure命令将MiniGUI中一些不需要的功能去掉,同时可以用交叉编译工具链中的strip命令删除MiniGUI函数库中的符号信息和其他一些调试信息。关于MiniGUI自带的范例程序mde及MiniGUI资源文件的编译和安装可参照上述库文件的编译过程及MiniGUI用户指南进行。
2.3MiniGUI向S3C2410上的移植
一般而言,在嵌入式系统开发过程中,编译完MiniGUI和应用程序后,需要把MiniGUI库、资源和应用程序拷贝到为目标系统准备的文件系统(目标文件系统)目录中,然后使用相关的工具生成文件系统映像,再下载到目标板上。
本文中Linux使用initrd技术来mount一个ramdisk作为目标板的根文件系统,因此需要将编译好的MiniGUI的库文件拷贝到ramdisk的/user/lib目录下,同时将MiniGUI的资源文件也拷贝到该目录下。
MiniGUI在运行的时候需要一个配置文件,用来配置MiniGUI运行所需要的环境参数。在本文的设计中,将配置文件MiniGUI.cfg放到了目标板的/etc目录下。mginit初始化时必读的配置文件包括:系统使用的图形引擎、输入引擎、鼠标、屏幕设备的指定、参数设置以及字体库等信息。
另外还有一个问题需要注意,因为MiniGUI使用framebuffer作为其输入引擎,因此在编译Linux内核的时候,一定要将framebuffer相关的功能编译到内核中去。
3 绘制基于MiniGUI的电子地图
3.1电子地图数据的提取
MapInfo格式的电子地图是目前使用最为广泛的地图格式之一。由于商用原因,截止至现在为止,MapInfo公司一直没有向外界公布它原始的以矢量形式存储的文件格式,即TAB格式,这就加大了直接利用MapInfo原始数据的难度。但MapInfo公司提供了与外界交换数据的机制,即MIF(MapInfo Interchange Format)格式地图。
在本文的设计中,利用MapInfo MIF格式的地图数据来完成地图的绘制工作,通过选取合适的数学模型和建立合适的数据结构,来实现电子地图的绘制。地图中的地理信息可以将其归为3类:
Point型——用于市区单位名等图层的绘制和显示;
Pline型——用于一级道路、二级道路、三级道路、单线河和桥等图层的绘制和显示;
Region型——用于边框、居民地、绿地、市界、县界和双线河等图层的绘制和显示。
对应于Point型、Pline型和Region型三种类型的地理信息,分别定义数据结构_POINT、_PLINE和_REGION。以道路为例,在程序中定义对应的_PLINE结构来描述相关信息,该结构定义如下:
struct _PLINE{
double* B;//描述各节点经度坐标的数组指针;
double* L;//描述各节点纬度坐标的数组指针;
int m_node;//节点数;
char *m_name;//名称标识;
}
_PLINE和_REGION等数据结构的定义与_PLINE类似,在这里不再详细介绍。有了上述结构的定义,就可以将MIF和MID文件中的信息读取到为对应信息定义的结构变量中,然后在具体绘制电子地图的时候只需对这些结构变量进行相应的操作即可。
3.2MiniGUI下电子地图的绘制
MiniGUI程序的入口点为MiniGUIMain,main函数已经在MiniGUI的函数库中定义,该函数在进行一些MiniGUI的初始化工作后调用MiniGUIMain函数。如果应用程序为lite版本MiniGUI下的应用程序,则应首先调用SetDesktopRect函数来设置程序的显示区域,然后调用CreateMainWindow函数创建并显示程序的主窗口,最终进入消息循环。
MiniGUI是消息驱动的系统,一切运作都围绕着消息进行,MiniGUI应用程序通过接收消息来与外界交互。在电子地图的绘制过程中,主要用到了MiniGUI的窗口绘制消息MSG_PAINT。该消息在需要进行窗口重绘时发送到窗口过程。MiniGUI通过判断窗口是否含有无效区域来确定是否需要重绘,在需要进行重绘时,MiniGUI会向相应的窗口过程发送MSG_PAINT消息。
基于MiniGUI的主程序框架图如图3所示,为了与JUPITER 021/031通信,接收GPS定位信息,同时还要与MC35通信实现无线通信相关功能,因此在主程序中启动两个子进程来实现与子系统的串口通信。另外,使用Linux下的共享内存(shared memory)和信号(signals)机制来实现进程间的通信,用以传递定位数据等信息。GPS信息接收的子进程功能框架如图4所示。
当MiniGUI主程序接收到其GPS通信子进程发送的SIGUSR1信号时,就会调用相应的信号处理函数。为了实时更新定位点在电子地图中的位置,必须在该函数中读取共享内存中的最新位置信息;同时根据定位点位置的变化确定需要重绘的区域,调用MiniGUI中的InvalidateRect函数使该区域无效。通过这种方式,使得最新的位置信息实时的在电子地图上显示出来。
为了把底层图形设备和上层图形接口分离开来,提高MiniGUI图形系统的可移植性,MiniGUI中引入了图形抽象层(GAL, graphics abstract layer)的概念。在一定的GAL基础上,实现了图形设备接口(GDI,Graph Device Interface)。在程序中定义mpadraw函数为电子地图绘制函数,在主程序的MSG_PAINT消息处理时调用该函数,来完成电子地图的具体绘制工作。mpadraw函数流程图如图5所示。在具体绘制的过程中,要用到MiniGUI提供的GDI函数来完成道路、道路名、居民区等地理信息的显示。图6即为笔者实现的电子地图。
结语
随着社会信息化的发展,GPS导航终端在我国有着光明的应用前景。本文中利用MiniGUI来实现车载终端的电子地图在LCD上地绘制,使地图的绘制工作脱离烦琐的底层硬件,大大的简化了此项工作,再配合GPS信号接收机实现实时定位导航的功能。同时也应该看到,本方案仍有很多方面需要改进,例如矢量化地理信息的显示及地图显示的进一步优化等。