MiniGUI在工程机械车载安全监控器中的应用

来源:互联网 发布:男士电脑包 知乎 编辑:程序博客网 时间:2024/04/28 16:34
1. 引言
        近年来,随着国家基础建设规模的扩大和工程机械租赁业的发展,工程机械面临着良好的市场前景和发展机遇。安全监控器作为工程机械的控制核心,在各种复杂工程机械中占据极其重要的地位。随着社会和科技的进步,以人为本的思想又为工程机械在人机工程学上赋予了新的内涵。如何符合人机工程学理念,为机械操作者的安全和舒适提供保障成为了安全监控器设计的重要参考因素之一。因此,一个友好的图形用户界面是工程机械车载安全监控器不可或缺的组成部分。
作为一个嵌入式设备,安全监控器本身的硬件资源十分有限,要求运行于其中的图形用户界面尽可能精简。MiniGUI作为一款优秀的国产嵌入式图形用户界面系统,能够充分满足嵌入式系统的需求,并具有轻型、占用资源少、高性能、高可靠性和可配置等几大优势。
本文将重点讨论如何应用MiniGUI开发嵌入式图形用户界面,并将其移植到工程机械车载安全监控器上。
2. 系统组成
        本文中的监控器硬件平台采用Hynix公司的HMS30C7202处理器为核心,该处理器是由ARM720T内核和其他一些外围接口器件组成,片上资源十分丰富,具有极高的集成度,非常适用于嵌入式系统应用。监控器的硬件平台及外围设备如图1所示。
图1 工程机械车载安全监控器硬件平台及外围设备
3. 图形用户界面设计
    MiniGUI通过窗口系统来管理应用程序在屏幕上的显示,其包含有三种窗口类型:主窗口、对话框和控件。每一个MiniGUI的运用程序一般都要创建一个主窗口或非模态对话框,作为应用程序的主界面或开始界面,然后在主窗口中创建一些控件来构成整个图形用户界面的框架。MiniGUI中提供了一种基于模板的机制,并通过该机制创建主窗口、对话框和控件。在MiniGUI中,用下面两个结构体来表示上述的模板。 
/*控件模板结构体*/
typedef struct
{
        char* class_name;               // 控件所属类的类名
DWORD dwStyle;                 // 控件的风格
int x, y, w, h;                         // 控件在主窗口或对话框中的位置和大小
int id;                                    // 控件的ID
const char* caption;             // 控件上的文字
DWORD dwAddData;          // 附加数据
DWORD dwExStyle;             // 扩展风格
} CTRLDATA;
/*对话框模板结构体*/
typedef struct
{
DWORD dwStyle;                 // 对话框的风格
DWORD dwExStyle;             // 对话框的扩展风格
int x, y, w, h;                         // 对话框在屏幕中的位置及大小
const char* caption;             // 对话框的标题文字
HICON hIcon;                      // 对话框图标
HMENU hMenu;                  // 对话框菜单
int controlnr;                        // 包含的控件数量
PCTRLDATA controls;        // 对应的控件结构体数组
DWORD dwAddData;          // 附加数据,必须设为0
} DLGTEMPLATE;
    利用这两个结构体模板,用户可以根据需要在程序中定义自己的对话框和控件。通过上述方法生成的工程机械车载安全监控器的界面如图2所示。
图2 基于MiniGUI的工程机械车载安全监控器图形用户界面
    主界面各主要控件功能说明:
    (1) 左边的子窗口用于显示图像,该图像是由安装在工程机械上的工业摄像头定时捕获到的视频信号经嵌入式图像采集卡压缩后获得。通过该图像,操作人员可以清楚地掌握一些视觉死角的工况,从而避免发生一些意外事故;
    (2) 右边上面的四个按键是系统菜单,分别用于进入相应的子对话框进行报警和通信等方面的参数的设置;
    (3) 右边中间的下拉框用于切换多路摄像头采集到的图像;
    (4) 右边下面的静态框由于显示通过CAN总线获取的工程机械的工况信息,便于操作人员及时了解到工程机械的工作状况。
4. 输入引擎移植
    由于MiniGUI软件系统本身是采用分层结构设计,这为其在不同配置的硬件平台和操作系统上的移植提供了便利。MiniGUI软件系统的层次结构如图3所示。最顶层为API,即编程接口。中间层是MiniGUI的核心层,其中包括了窗口系统必不可少的各个模块,如消息事件处理模块、图形设备接口等;而最底层的可移植层是MiniGUI能够移植到各种系统上的关键, 其包含两个子层,分别是图形抽象层(Graphics Abstract Layer)和输入抽象层(Input Abstract Layer)。抽象层的概念类似于Linux内核虚拟文件系统的概念,它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为“图形引擎”和“输入引擎”。
图3 MiniGUI软件系统层次结构图
    由于我们采用嵌入式Linux作为工程机械车载安全监控器的操作系统,该操作系统内核已提供了对FrameBuffer的支持,因此MiniGUI自带的FBCON图形引擎可以正常的在安全监控器上使用。
    作为可移植层的另外一个方面,输入引擎的移植对于嵌入式设备而言,显得格外重要。相对于标准PC系统,嵌入式系统往往采用触摸屏或仅有的几个按键作为输入设备,因此需要一个标准的接口用来将MiniGUI的底层输入与上层相隔。
在MiniGUI中正是通过一个INPUT的结构体来表示输入引擎的接口,其定义位于“src/include/ial.h”文件中。在这个结构体中定义了输入引擎的ID、初始化和终止函数指针、鼠标操作函数指针、键盘操作函数指针和输入事件等待函数指针等。用户可以通过MiniGUI提供的上述接口与自己的输入引擎代码相关联,从而在自己的嵌入式设备上实现MiniGUI程序对鼠标和键盘事件的响应。
    本文中的安全监控器采用触摸屏作为主要输入设备,因此需要自己编写相应的输入引擎代码。
    首先,需要定义一个结构体来从触摸屏设备的文件描述符(/dev/ts)中获取数据,该结构体定义如下:
    typedef struct {
     unsigned short b;  //触摸屏的状态(是否被点击)
     unsigned short x;  //触摸屏的x坐标
     unsigned short y;  //触摸屏的y坐标
    } POS;
     static POS pos;
   然后在wait_event函数中通过以下代码获得触摸屏的状态信息:
    ts = open(“/dev/ts”, O_RDONLY);
    read (ts, &pos, sizeof(POS));
    if (pos.b > 0) {
     mousex = pos.x;
     mousey = pos.y;
    }
    pos.b = (pos.b > 0 ? 4 : 0);
    最后通过mouse_getxy和mouse_getbutton等函数将获得的状态信息通过INPUT结构体传递给MiniGUI应用程序。具体实现方法如下:
    BOOL InitHMSInput (INPUT *input, const char* mdev, const char* mtype)
    {
     ……
     input->get_mouse_xy=mouse_getxy;
     input->get_mouse_button=mouse_getbutton;
     ……
    }
    static void mouse_getxy(int* x, int* y)
    {
     *x=mousex;
     *y=mousey;
    }
    static int mouse_getbutton(void)
    {
     return pos.b;
    }
    限于篇幅的原因,这里只列出了其中输入引擎的移植代码中较为关键的部分。代码编写完成后,还需要在“src/ial/ial.c”中添加自定义的输入引擎的入口项。
    static INPUT inputs [] = 
    { ……
    #ifdef _HMS7202_IAL
         {"hms7202", InitHMSInput, TermHMSInput},
    #endif
     ……
    }
5. 交叉编译
    为了能让MiniGUI运行在不同的目标平台上,需要对其运行环境、资源文件和应用程序进行交叉编译。
5.1 安装交叉编译环境
    要在PC上交叉编译ARM平台上运行的程序,必须安装交叉编译工具。这里以arm-toolchain-2.1.3工具链为例,简要介绍交叉编译环境的安装。上述的工具链包含以下三个安装包:
     arm-linux-binutils-2.10-1.i386.rpm
     arm-linux-gcc-2.95.2-1.i386.rpm
     arm-linux-glibc.2.1.3-1.i386.rpm
    在互连网上下载到这些安装包后,执行rpm –ivh *.rpm命令,这些工具就会自动安装到“/usr/local/arm-linux”下。然后在系统的PATH变量中添加“/usr/local/arm-linux/bin”,以便Shell和make工具能正确地找到该交叉编译器。
5.2 编译MiniGUI库文件
    首先用tar命令对下载到的libminigui-str-1.6.2.tar.gz进行解压缩,然后进入解压后的目录,执行以下命令以完成对编译选项的配置。
    $ CC=arm-linux-gcc /
      ./configure --target=arm-linux --prefix=/usr/local/arm-linux/arm-linux /
     --host=arm-linux --build= i686-pc-linux-gnu --enable-hms7202ial --disable-lite
    这些选项的意义请读者参照MiniGUI的用户手册,这里不再赘述。值得说明的是,其中的“--enable-hms7202ial”表示将之前自定义的输入引擎编译进MiniGUI的运行库中去。完成配置后,便会在当前目录下生成新的Makefile文件,然后按顺序执行make和make install,成功后会把MiniGUI 配置文件、库文件和头文件分别安装到上面prefix选项所指定路径的etc、lib和include子目录下。
5.3 安装MiniGUI资源文件
    同样先用tar命令解压下载到的minigui-res-str-1.6.tar.gz文件,进入解压后的目录,先修改configure.linux文件中的prefix选项为“prefix=$(TOPDIR)/usr/local/arm-linux/arm-linux”,以便和前面的MiniGUI库文件的安装路径保持一致。然后直接执行make install,MiniGUI的资源便成功安装到了“/usr/local/arm-linux/arm-linux/lib/minigui/res”路径下。
5.4 编译自己的MiniGUI应用程序
    MiniGUI为用户提供了一个综合演示程序包MDE,该程序包是一个利用Autoconf/Automake脚本组织起来的软件项目。因此,我们可以参照MDE的Autoconf/Automake脚本为自己编写的程序建立项目脚本。首先,我们先建立自己的项目目录,这里先假设目录名为monitor,然后将项目的源代码保存在“monitor/src”中。然后,再将MDE目录下的configure.in文件复制到项目目录下并修改,修改的内容如表1所示。
接下来,分别创建项目目录和src子目录下的Makefile.am文件。项目目录下的Makefile.am文件的内容为:
    SUBDIR = src
    src子目录下的Makefile.am文件内容为:
    noinst_PROGRAMS = monitor
    monitor_SOURCES = monitor.c dlgctrl.h
表1 “configure.in”文件修改说明
修改前
修改后
说明
AC_INIT(mginit/mginit.c)
AC_INIT(src/monitor.c)
指定一个项目源文件
AM_INIT_AUTOMAKE(mde,1.6.8)
AM_INIT_AUTOMAKE(monitor,1.0)
指定项目名称和版本号
AC_OUTPUT(
Makefile
notebook/Makefile
……
)
AC_OUTPUT(
Makefile
src/Makefile
)
列出要生成的Makefile文件
 
    最后,我们在项目目录下建立一个autogen.sh文件,内容为:
        #!/bin/sh
        aclocal
        automake --add-missing
        autoconf
    该文件是一个Shell脚本,依次调用了aclocal、automake和autoconf命令。建立该文件后,还需要运行“chmod +x autogen.sh”命令将其变为可执行文件。
    接下来,我们只需要在终端下依次运行“./autogen.sh”和“CC=arm-linux-gcc ./configure --target=host=arm=linux --build=i686-pc-linux-gnu --prefix=/usr/local/arm-linux/arm-linux”便可生成所需的Makefile文件,最后通过执行make命令完成编译,生成在ARM平台上运行的可执行文件。
 
6. 中文字体显示支持

    本文采用的是MiniGUI-STR v1.6.2开源版本,其本身并不支持中文显示,幸运的是,MiniGUI另一开源版本v1.3.3中提供了中文字体文件,因此,笔者采用了“移花接木”的办法,为MiniGUI-STR v1.6.2添加了中文显示支持。方法是,将下载来的minigui-res-1.3.tar.gz文件解压,复制其子目录font下的song-12-gb2312.bin和song-16-gb2312.bin两个文件到之前安装的MiniGUI资源文件目录“/usr/local/arm-linux/arm-linux/res”的font子目录下,并修改该子目录下的font.name文件,在其中增加两行:
        song-12-gb2312.bin Raw Bitmap Font   rbf-fixed-rrncnn-12-12-GB2312.1980-0
        song-16-gb2312.bin Raw Bitmap Font   rbf-fixed-rrncnn-16-16-GB2312.1980-0
    之后,只需要在MiniGUI的配置文件中进行修改,MiniGUI的应用程序便可显示中文了。具体的修改方法在下文中有详细说明。

7. 在嵌入式设备上部署和配置MiniGUI

    完成以上步骤之后,接下来需要将之前编译好的文件复制到嵌入式设备的文件系统中去。需要复制的文件及其路径部署见表2。
表2 MiniGUI在嵌入式设备文件系统中的部署
需要复制的文件
部署到嵌入式设备中的路径
“/usr/local/arm-linux/arm-linux/lib/minigui/res”目录下的所有文件
“/usr/local/lib/minigui/res”
“/usr/local/arm-linux/arm-linux/lib”目录下的libminigui*.*
“/usr/local/lib”
“/usr/local/arm-linux/arm-linux/etc”目录下的MiniGUI.cfg
“/usr/local/etc”
用户自己编译好的应用程序
“/app”
 
    其中MiniGUI.cfg是MiniGUI的配置文件,在复制前还需要根据之前的编译选项进行修改。修改的内容及说明如下:
    (1) 修改[system]字段下的ial_engine=hms7202,指定输入引擎为之前自定义的hms7202。
    (2) 修改[fbcon]字段下的defaultmode=640 x480-16bpp,指定显示模式分辨率为640*480。
    (3) 修改[systemfont]字段下的所有内容为:
          font_number=3
          font0=rbf-fixed-rrncnn-8-16-ISO8859-1
          font1=rbf-fixed-rrncnn-12-12-GB2312.1980-0
          font2= rbf-fixed-rrncnn-16-16-GB2312.1980-0
          default=0
          wchar_def=1
          fixed=1
          caption=2
          menu=2
          control=1
          指定用于显示的字符集,这里去掉了一些不需要的字符集,同时加入了之前添加的两个中文字符集文件。
    (4) 修改[rawbitmapfonts]段的全部内容为:
          font_number=3
          name0=rbf-fixed-rrncnn-8-16-ISO8859-1
          fontfile0=/usr/local/lib/minigui/res/font/8x16-iso8859-1.bin
          name1= rbf-fixed-rrncnn-12-12-GB2312.1980-0
          fontfile1=/usr/local/lib/minigui/res/font/song-12-gb2312.bin
          name2= rbf-fixed-rrncnn-16-16-GB2312.1980-0
          fontfile1=/usr/local/lib/minigui/res/font/song-16-gb2312.bin
          指定rawbitmap类型的字体信息,包含字体名和字体文件所在的路径。

8. 结语

    本文将技术和人性化工程设计理念相结合,创建了基于MiniGUI的工程机械车载安全监控器的嵌入式图形用户界面。通过友好直观的界面,工程机械操作人员可以迅速的了解到工程机械的工作状况和周边的环境状况,从而大大降低了工程机械事故和故障的发生率,具有较高的实用价值和市场前景。
 
参考文献:
1 MiniGUI 用户手册. 北京飞漫软件技术有限公司, 2004.
2 MiniGUI 编程指南. 北京飞漫软件技术有限公司, 2004.
3 魏永明. MiniGUI与嵌入式Linux. 开放系统世界, 2004, 07.
 
作者简介:
陈敬恩(1981-),男(汉族),福建泉州人,湖南大学电气与信息工程学院硕士研究生,主要从事嵌入式系统、计算机测控网络研究,Email: jingen.chen@gmail.com。彭楚武(1949-),男(汉族),湖南大学电气与信息工程学院教授,主要从事计算机测控网络、实时控制系统研究。
原创粉丝点击