基于μCOS的预定义UI交互设计
扫描二维码
随时随地手机看文章
摘要:本设计用于电能计量终端的人机交互,对直流电和单相、三相交流电的电参数进行实时显示。基于μCOS的预定义UI交互设计的特点是预定义一个菜单数组,由程序解析菜单定义。菜单项为菜单数组中的一个结构体,通过设置菜单数组就能改变菜单组合形式。菜单项的可响应按键集也以结构体的形式定义,结构体的每一元素对应一个可以响应的按键,通过按键响应动作来实现菜单切换。该设计易于实现多层次菜单,而且具备很好的可移植性,适用于大量中等规模的嵌入式系统应用。运用该设计很好地完成了电能计量终端电参数的实时显示。
关键词:UI设计;菜单设计;人机交互;μCOS;嵌入式系统
0 引言
嵌入式设备的飞速发展大大丰富了人们的生活,无论在工业控制、仪器仪表、通信设备或是娱乐工具等各个方面都有嵌入式微处理器在工作,然而,人们要想实现对这些设备的控制就必须通过用户界面(User Interface,UI),所以人们越来越关注UI界面的可用性和用户使用效率的提高。目前,嵌入式设备开发中的UI设计多数采用按键控制简单的上下翻页或滚屏操作,缺少层次性,本设计将在S3C44BOX微控制器上植入μCOS系统,采用预定义的方式,实现一种多层次、可移植性强的预定义UI交互。
1 电能计量终端系统简介
为实现配电自动化,需要使用电能计量终端来对多种电源的接入进行监控,包括直流电和单相、三相交流电。图1为电能计量终端的硬件系统结构框图。它以S3C44BOX微控制器为核心,配有通信电路、LCD显示电路、按键、RS 232和RS 485通信接口以及直流电和单相、三相交流电测量电路。
电能计量终端除了具有普通智能仪表所具有的测量功能、数据处理功能和通信功能外,还为用户提供了友好的UI。通过UI交互,用户可灵活地切换和查看以下信息:供电电流、供电电压、累计供电量、有功功率、停电时间/来电时间、交流负载的总功率因数、缺相告警及
电压值超标告警等。另外,还设有掉电保护和防雷功能。
2 UI交互电路
图2为电能计量终端的UI交互电路框图,电路中有1个128×64点阵的LCD显示器(QC12864B)和6个按键。LCD显示器每行能显示16个英文或8个中文符号,共4行。微控制器通过IO来控制LCD的显示。因为LCD外部接口信号需要5 V的驱动电平,而微控制器的IO管脚输出只有3.3 V,不能直接控制,在此使用74LVx245电平转换芯片来驱动LCD。6个按键分别为上(up)、下(down)、左(left)、右(right)、确定(enter)和取消(esc)键,微控制器通过扫描按键IO,可得到各个键值。为节省中断开销,6个按键通过与门连接到微控制器的同一个外部中断上。利用这6个按键,用户可以在菜单窗口和监控界面之间随意切换。
3 预定义UI交互设计
UI的设计目标是实现中文窗口界面,用户可以在菜单方式下进行交互。窗口分为2类:对话框和菜单,也包括两者的混合。对话框用于参数的输入输出显示;菜单用于响应用户的选择,根据用户的选择运行程序。预定义的UI。简单的说,就是预定义一个菜单数组,由程序解析菜单定义形式。改变菜单数组中对应项的内容,就能设定菜单显示的坐标、尺寸和内容等等性能参数,而无需修改解析函数,因此具有很高的可移植性。[!--empirenews.page--]
3.1 操作界面
根据电能计量终端的监控内容,设计菜单窗口和各菜单项对应的监控界面。设备上电后,将显示版本号,接着进入菜单窗口。菜单窗口有4行,其中前2行显示菜单项,后2行显示实时时间。菜单项共有4个,分别为交流电(包括市电和油电)、风电和光电参数。通过上下按键在主窗口的前两行进行菜单项切换。菜单窗口设计如图3所示。
在选择的菜单项上点击enter键进入该菜单项对应的监控界面,监控内容分屏显示。交流电子菜单分7屏来显示交流电接入类型(市电/油电)、交流电压、交流电量、有功功率、市电/油电停电时间、市电/油电来电时间、功率因数等,图4(a)为其中一屏;光电/风电子菜单分2屏来显示光电/风电电压、光电/风电电流、光电/风电电量、光电/风电功率等,图4(b)为其中一屏。用户可通过up,down键和esc键来切屏和返回至菜单窗口。
3.2 预定义菜单设计
μCOS是一个源码公开、可移植、可固化、可裁剪、抢占式、支持多任务的实时操作系统,运行于没有MMU的嵌入式微处理器上,采用可剥夺型内核进行任务调度,实时性好,小巧且移植方便,适合工业控制领域使用。在μCOS中,设置一个UI任务,完成响应用户的键盘输入、选择菜单和根据用户选择的菜单执行相应操作。菜单设计成多层次形式。菜单设计采用预定义的集中描述,由程序解析菜单定义形式。可响应的按键集也以数组的形式在菜单数组中定义。键盘服务设计成中断级任务,通过专用的消息队列发送键值到UI任务,实现实时信息显示。
预定义的菜单由3部分控制:
①菜单显示区域坐标。用来定义菜单显示区域左上角字符坐标(符号常量MENU_AREA_LT_X,MENU_AREA_LT_Y,)和右下角字符坐标(符号常量MENU_AREA_RB_X,MENU_AREA_RB_Y),显示的菜单要限制在这个区域中。
②菜单定义。设计一个结构体数组,数组中的每个结构体描述一个菜单项的各项设置,这个结构体数组称为“菜单定义结构体数组”(Menu Deftne Structure,MDS),在C代码中命名为Menu_Define[]。
③当前有效菜单项指针。定义一个整型变量,称为“菜单指针”(Menu Pointer,MP),MP的值与MDS的数组下标相对应,指明了当前有效的菜单项。菜单定义采用枚举类型标识,以提高代码的可读性。[!--empirenews.page--]
一个预定义的菜单由若干个菜单项组成,每个菜单项可以显示主显示内容和副显示内容两部分。程序运行后,主显示内容一旦定义则不改变,副显示内容是可变的。如图4(b)中,风电电压、风电电流是主显示内容,而其对应的电压、电流值是副显示内容。MDS是一个结构体数组,数组中每个元素(即每个“菜单项”)的结构如表1所示。
可响应按键集也是一个结构体数组,每个元素对应一个可以响应的按键,Key_Collection_Iterm定义如下:
部分菜单定义结构体数组成员说明:
i16uMenu_ID:菜单的标识符,如果在某菜单上发生了“RT_ACT”(执行)动作,则菜单任务根据菜单标识符执行相应的功能。
I16uAccessory_Type:副显示值类型,指明副显示内容的来源类型,包括常见的变量类型(char,char*,INT16U,INT16,INT32U,INT32,float,double)。
I16uResponse_Type:按键响应动作类型,指明对当前按键的响应动作,包括:当前有效菜单项改变为上临菜单项;当前有效菜单项改变为下临菜单项;当前有效菜单项改变为右临菜单项;当前有效菜单项改变为左临菜单项;当前有效菜单项改变为父菜单项;当前有效菜单项改变为子菜单项。依据当前有效菜单项ID执行相应操作,对应的枚举类型定义如下:
[!--empirenews.page--]
3.3 预定义UI交互软件流程
预定义的菜单设计针对的是多层次的菜单设计,可以轻松实现多层次菜单显示。根据操作界面设计各个菜单项,即:在预定义的菜单项结构体中定义菜单项的标识符、坐标、上下临菜单项标识符、父子菜单标识符和可响应按键集等等。用户在当前有效菜单项上点击按键,系统根据动作ID散转,在可响应按键集中找出相应的响应动作,图5为按键响应动作类型散转流程图。
各按键通过相似的响应流程完成各自不同的响应动作,这里以单个按键为例,对按键动作响应流程进行介绍。图6是一个UI交互任务流程,完成对UP按键的响应动作,动作类型为RT_MOVE_UP。
系统上电后,首先对系统硬件和各变量进行初始化,屏幕显示首屏菜单,由活动表示符指明当前活动菜单项。当UP按键按下,进入键盘中断,随即向μCOS中发送按键消息队列,执行UI任务,在UI任务中将中断挂起,而后运行键盘扫描代码,判断出键值UP。此时,UI任务将根据当前活动菜单标识符执行RT_MOVE_UP功能。首先判断菜单显示区域内的当前活动菜单项标识符(CAID)是否等于它的上临菜单(CAID.上临ID),如果相等,不做任何操作;如果不等,再判断CAID是否为当前菜单显示区域内正在显示的最顶端的菜单项标识符(TMID)。如果CAID=TM ID,那么CAID=TMID=CAID.上临ID,调用显示菜单函数,显示此屏幕的上一屏菜单;如果CAID不是TMID,则CAID=CAID.上临ID,调用显示菜单函数,活动表示符指向CAID.上临ID。
3.4 UI交互设计实物图
UI交互设计实物图如图7所示。
4 结语
UI的广泛应用是当今计算机发展的重大成就之一,它强调的是计算机对于人的反馈交互作用。嵌入式UI具有下面几个方面的基本要求,轻型、占用资源少,高性能、高可靠性,便于移植、可配置。本项目设计的UI是基于预定义的文本菜单,具有菜单设计灵活、占用资源少的优点,同时支持多层次菜单,菜单功能丰富,适用于大量的中等规模的嵌入式系统应用。