发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种可配置的仪器菜单系统。
本发明的技术方案如下:
一种可配置的仪器菜单系统,其中,包括显示交互层及数据逻辑层;所述显示交互层包括多个按钮控件及一个静态控件;所述按钮控件,用于接收按键消息并呈现菜单项的内容;所述静态控件,用于显示当前菜单标题;所述数据逻辑层包括菜单管理单元、菜单文件加载单元、动态创建数据单元、菜单关系数据单元及菜单项菜单组的映射表单元;所述菜单管理单元,用于菜单创建、菜单切换以及菜单与仪器内部模块之间的交互;所述菜单文件加载单元,用于读取配置文件并将读取的数据填充到动态创建数据单元和菜单关系数据单元中;所述动态创建数据单元,用于保存动态创建菜单所需的数据结构;所述菜单关系数据单元,用于保存菜单切换所需的数据结构;所述菜单项菜单组的映射表单元,用于保存菜单组菜单项ID与对象的映射关系。
所述的可配置的仪器菜单系统,其中,所述按钮控件通过一个指向当前菜单组的指针与菜单项关联,从而将按键消息传递给菜单项;按钮控件向菜单项开放绘图接口,菜单项利用该开放绘图接口将内容呈现到按钮控件上。
所述的可配置的仪器菜单系统,其中,所述动态创建数据单元包括菜单项位置信息、自定义菜单组字符串、自定义菜单项字符串、自定义菜单项信息、内部菜单项信息、内部菜单组信息;所述菜单关系数据单元包括子窗口与菜单组的关系、仪器面板硬键与菜单组的关系、导向菜单项与菜单组的关系;所述菜单项菜单组的映射表单元包括一个保存菜单项ID和菜单项对象关系的映射表以及一个保存菜单组ID和菜单组对象关系的映射表。
所述的可配置的仪器菜单系统,其中,所述菜单管理单元用于根据所述动态创建数据单元中的数据动态创建菜单对象,并将菜单组菜单项对象ID和菜单对象之间的映射关系存放到所述菜单项菜单组的映射表单元;还用于根据所述菜单关系数据单元中的数据进行菜单切换;还用于通过指令分发层获取仪器内部数据,进行菜单信息的实时更新。
所述的可配置的仪器菜单系统,其中,所述内部菜单项信息包括类型信息及数据更新信息;所述类型信息,用于标识菜单项的类型;所述数据更新信息,用于记录与菜单项更新相关的仪器内部数据类型;所述自定义菜单项包括“别名”菜单项和“一键测量”菜单项;所述“别名”菜单项用于为内部菜单项重命名;所述“一键测量”菜单项用于一次性执行批量的指令。
所述的可配置的仪器菜单系统,其中,所述菜单关系数据单元,采用三个结构体定义子窗口ID与菜单组ID、硬键键值与菜单组ID、导向菜单项ID与菜单组ID的对应关系,采用三个数组保存所述的三种结构体对象。
所述的可配置的仪器菜单系统,其中,所述菜单的动态创建包括以下步骤:
步骤一:所述菜单管理单元根据所述内部菜单组和菜单项信息,创建内部的菜单组和菜单项对象,并在所述菜单项菜单组的映射表单元中添加菜单项菜单组ID与对象的映射关系;
步骤二:所述菜单管理单元根据所述自定义菜单组和菜单项信息,创建自定义的菜单组和菜单项对象,并在所述菜单项菜单组的映射表单元中添加映射关系;
步骤三:所述菜单管理单元根据所述菜单项位置信息,从所述菜单项菜单组的映射表单元中搜索已创建好的菜单项和菜单组对象,对其进行菜单布局操作。
所述的可配置的仪器菜单系统,其中,在进行菜单切换时,所述菜单管理单元根据所述菜单关系数据单元和所述菜单组菜单项的映射表单元,找到将要切换到的菜单组对象的指针,替换当前菜单组对象的指针,然后通知所述显示交互层进行菜单的重绘。
所述的可配置的仪器菜单系统,其中,所述菜单信息的实时更新是由所述菜单管理单元创建一个菜单更新线程,将当前菜单每个菜单项的更新信息依次以查询指令的形式主动向仪器内部模块发送,查询的结果返回后,对菜单项的数据进行更新或进行重绘。
采用上述方案:1、菜单布局和菜单切换关系可配置,不需要修改源代码即可实现新的菜单,提升了开发效率;2、通过规范化的接口交互,与仪器内部模块相互分离。使得仪器菜单成为可复用的组件化模块;3、可通过自定义的“一键测量”菜单项,按一个键让仪器自动执行一系列指令;4、可通过自定义的“别名”菜单项,修改菜单项的名称;5、面向用户开放菜单定制接口。
具体实施方式
以下结合附图和具体实施例,对本发明进行详细说明。
实施例1
1本发明的整体架构,如图1所示:
可配置的菜单采用两层的架构形式,上层是显示交互层101,用于接收按键消息以及显示菜单信息;底层是数据逻辑层102,负责菜单的数据维护及逻辑控制。
1.1显示和交互层101采用一个窗口对象与用户进行交互。窗口包括了多个按钮控件1010和一个静态控件1011,按钮控件1010用来接收按键消息并呈现菜单项的内容,静态控件1011用来显示菜单组标题。
按钮通过一个指向当前菜单组的指针1012与菜单组中的菜单项关联,从而可以将按键消息传递给菜单项,由菜单项向仪器内部模块发送设置指令;按钮向菜单项开放绘图接口,以便让菜单项把自己的内容呈现到按钮控件上。
1.2数据逻辑层分成了两个功能单元和三个数据单元。功能单元包括菜单管理单元1020和菜单文件加载单元1023。菜单管理单元1020是该层的核心模块,负责菜单创建、菜单切换以及菜单与仪器内部模块之间的交互;菜单文件加载单元1023用于读取配置文件并对动态创建数据区和菜单关系数据区的数据进行更新。
数据单元包括动态创建数据单元1021、菜单关系数据单元1022、菜单项菜单组的映射表单元。动态创建数据单元1021存放了创建所有菜单项和菜单组对象所必需的数据,其中内部数据由仪器自身提供(本发明将仪器固有的属性统称为“内部”),可配置数据由菜单文件加载单元1023从菜单配置文件中获取;菜单关系数据单元1022包含了实现菜单切换所需的信息,这些信息从配置文件中获取;菜单组映射表10和菜单项映射表11用于存放所有菜单组和菜单项对象与它们的ID之间的映射关系,映射表10及映射表11采用散列表的数据结构,能够实现菜单组和菜单项对象的快速查找;映射表中的“键”为菜单组和菜单项的ID,“值”为菜单组和菜单项对象的指针。
数据逻辑层102中各功能单元和数据单元之间的关系如图2所示。菜单文件加载单元1023从配置文件12中读取出配置信息,然后将这些配置信息放入动态创建数据单元1021和菜单关系数据单元1022中;菜单管理单元按照动态创建数据单元1021的数据能够动态创建所有的菜单组和菜单项对象,并将对象ID和对象指针的映射关系存放到菜单组映射表10和菜单项映射表11中。
2本发明的实现原理:
2.1可配置菜单的数据结构
可配置菜单所需的数据结构主要分为两类,一类是菜单项菜单组的数据,另一类是菜单关系数据。菜单项菜单组的数据具体包括菜单项位置信息、自定义菜单组字符串、自定义菜单项字符串、自定义菜单项信息、内部菜单项信息、内部菜单组信息。菜单关系数据具体包括子窗口与菜单组的关系、仪器面板硬键与菜单组的关系、导向菜单项与菜单组的关系。本发明统一采用数组记录这些数据。除了字符串信息外,其他数组的元素均为结构体。以下是这些结构体的定义说明。
2.1.1菜单项和菜单组的数据结构
菜单项位置信息结构体共有三个字段,含义如表1所示。表中的指令ID是菜单项的标识。每个菜单项的标识必须是独一无二的。考虑到自定义菜单项的ID可以很方便地由其标题字符串数组的索引(从0开始递增)表示,所以为了避免ID冲突,内部菜单项的ID号是从0x8000开始定义的。
表1为菜单项位置信息结构体说明:
内部菜单组信息结构体共两个字段,含义如表2所示。同样考虑到自定义菜单组的ID可由其标题字符串数组的索引表示,所以内部菜单组的ID号从0x8000开始定义。
表2为内部菜单组信息结构体说明:
字段名称 |
字段类型 |
含义 |
菜单组ID |
整型 |
菜单组的标识 |
字符串ID |
整型 |
该菜单组标题字符串标识 |
下面对菜单项的数据结构进一步说明:
菜单项是菜单的基本组成单元,根据菜单显示信息的不同可以划分为简单型、信息型、选项型、图标型等。此外本发明提供了“别名”和“一键测量”两种新类型的菜单项。“别名”菜单项是仪器内部某个菜单项的别名,开发者和用户通过它可以把内部菜单项设置成自己喜欢的名字。“一键测量”菜单项的功能类似于批处理,该菜单项拥有一个菜单项指针的链表,可以顺序执行一串指令,从而实现按一个键仪器即可执行一系列指令的“一键测量”功能。
内部菜单项的信息分为两部分,一是类型信息,用于标识菜单项的类型;。二是数据更新信息,用于记录与菜单项更新相关的仪器内部数据类型;。这两类信息的结构体如表3及表4所示。
表3为内部菜单项的类型信息说明:
表4为内部菜单项的数据更新信息说明:
类型信息中的菜单项类型的0-3位用于表示内部菜单项的类型,9、10位用于表示菜单项是否导向父子菜单,12-15位用于表示自定义菜单项的类型。
数据更新信息中的仪器数据类型ID表示与该菜单项更新相关的仪器内部数据类型,利用该字段,菜单项可以通过接口查询得到仪器相应的内部数据,使得菜单项的显示与仪器内部数据保持一致。菜单项更新类型表示该菜单项可能动态改变的信息类型,例如使能、选项切换、信息字符串更新等,利用该字段可以指示菜单项对查询结果进行有效提取并对数据进行比对更新。每个菜单项有且只有一项类型信息,但可以包含零或多项数据更新信息,数据更新信息由菜单项对象的一个链表维护。
自定义的菜单项的信息分为三部分,一是基本信息,二是“别名”菜单项信息,三是“一键测量”菜单项信息。这三类信息的结构体如表5、表6、表7所示。
表5为自定义菜单项基本信息:
表6为“别名”菜单项信息:
字段名称 |
字段类型 |
含义 |
别名菜单项ID |
整型 |
自定义的别名菜单项标识 |
内部菜单项ID |
整型 |
该菜单项所对应的内部菜单项标识 |
表7为“一键测量”菜单项信息:
2.1.2菜单关系数据结构
菜单关系数据结构记录的是一些映射关系,菜单切换功能的实现依赖于这些数据结构。子窗口和菜单组的关系记录的是子窗口ID与菜单组ID的映射关系,当窗口焦点发生改变时,通过该映射关系可以切换到与窗口对应的菜单;面板硬键和窗口组的关系记录的是硬键键值与菜单组ID的映射关系,当按下面板硬键时,通过该映射关系可以切换到与硬键对应的菜单;导向菜单项与菜单组的关系记录的是导向菜单项ID与菜单组ID的映射关系,当按下导向菜单项时,可以通过该映射关系切换当前菜单组的上级或下级菜单。
2.2、可配置菜单系统的动态创建
动态创建发生在两个时刻,一为仪器初始化时,二为加载新的配置文件时。在第一种情况下,菜单管理单元首先会根据内部菜单组和菜单项信息,创建内部的菜单组和菜单项;然后根据默认的配置文件,创建自定义的菜单组和菜单项,最后进行菜单布局,建立菜单关系。在第二种情况下,菜单管理单元首先会销毁之前的自定义菜单组和菜单项,然后根据新的配置文件创建自定义菜单组和菜单项,最后重新进行菜单布局和建立菜单关系。从上述过程可以看出,动态创建主要由三个动作构成,分别为创建内部菜单组和菜单项、创建自定义菜单组和菜单项、菜单布局并建立菜单关系。
2.2.1创建内部菜单组和菜单项
菜单管理单元根据动态创建数据区的内部菜单组信息,创建所有内部菜单组对象,并在映射表中添加菜单组ID与菜单组对象指针的映射关系;根据内部菜单项的类型信息和数据更新信息,创建所有内部菜单项对象,并在映射表单元中添加菜单项ID与菜单项对象指针的映射关系。
2.2.2创建自定义菜单组和菜单项
菜单管理单元根据自定义菜单组信息创建自定义的菜单组对象,并在映射表中添加菜单组ID与菜单组对象指针的映射关系;然后根据“别名”菜单项信息和“一键测量”菜单项信息创建自定义的菜单项对象,并在映射表中添加菜单项ID与菜单项对象指针的映射关系。
2.2.3菜单布局并建立菜单关系
菜单管理单元根据菜单项位置信息,从两张映射表中搜索已创建好的菜单项和菜单组进行菜单布局操作。本发明为菜单组设计了一个菜单项的指针数组和一个菜单项位置数组,菜单布局实际上就是对这两个数组进行填充。由于菜单组和菜单项不再是组合关系,菜单组拥有的只是菜单项的指针,所以一个菜单项可以分配给多个菜单组。
各种菜单切换关系是通过菜单文件加载器从配置文件中获取的。这些关系信息存放在菜单关系数据区,菜单管理单元正是根据这些菜单关系正确的进行菜单切换。
3本发明的菜单更新机制
在本发明中,菜单项是由开发者或用户自由选取并任意排列的,仪器并不知道当前菜单共有哪些菜单项需要更新,它们的位置又在哪里,所以传统设计方案所采用的仪器反向通知菜单更新的方式已不可取。在本发明中,采用了一种菜单正向查询的方法来进行菜单实时更新。
该方法基于一种“仪器人机交互的统一化处理方法”的技术。菜单通过仪器的指令分发层,将当前菜单每个菜单项的更新信息依次以查询指令的形式主动向仪器发送,查询的结果返回后,对菜单项的数据进行更新,必要时对按钮进行重绘。通过规范化接口的交互方式,使得菜单和仪器内部模块相互之间并不知道对方的存在,从而对两者进行了有效的隔离,提高了菜单的复用性。
本发明设计了一个菜单更新线程来保证菜单更新的实时性,线程每隔40毫秒进行一次当前菜单的更新,更新过程包括菜单项302更新数据的刷新和按钮301的重绘。考虑到按钮301重绘操作占用CPU资源较多,所以并不是每次循环都对按钮301进行重绘。按钮301重绘操作仅发生在与该按钮对应的菜单项302的更新数据发生改变时。菜单更新过程如图3所示,图3中,菜单项302遍历自身的数据更新链表,对每个更新条目以查询指令的方式发送到指令分发器303;指令分发器303将查询指令发送给仪器内部模块304;查询指令在仪器内部实现响应并将查询结果反馈到菜单项302,菜单项302将查询结果与现有更新数据作比较,如果有变化则通知按钮进行重绘。
“别名”菜单项属于自定义的菜单项,在配置时并不会提供该菜单项的数据更新信息链表,这就意味着“别名”菜单项不能进行数据更新。为了解决这一问题,本发明的“别名”菜单项拥有它所对应的内部菜单项的指针,借助该指针可以引用具备数据更新链表的内部菜单项去完成“别名”菜单项的数据更新以及按钮重绘。
实施例2
在上述实施例的基础上,进一步,提供一种可配置的仪器菜单系统,其中,包括显示交互层及数据逻辑层;所述显示交互层包括多个按钮控件及一个静态控件;所述按钮控件,用于接收按键消息并呈现菜单项的内容;所述静态控件,用于显示当前菜单标题;所述数据逻辑层包括菜单管理单元、菜单文件加载单元、动态创建数据单元、菜单关系数据单元及菜单项菜单组的映射表单元;所述菜单管理单元,用于菜单创建、菜单切换以及菜单与仪器内部模块之间的交互;所述菜单文件加载单元,用于读取配置文件并将读取的数据填充到动态创建数据单元和菜单关系数据单元中;所述动态创建数据单元,用于保存动态创建菜单所需的数据结构;所述菜单关系数据单元,用于保存菜单切换所需的数据结构;所述菜单项菜单组的映射表单元,用于保存菜单组菜单项ID与对象的映射关系。
进一步而言,所述按钮控件通过一个指向当前菜单组的指针与菜单项关联,从而将按键消息传递给菜单项;按钮控件向菜单项开放绘图接口,菜单项利用该开放绘图接口将内容呈现到按钮控件上。
进一步而言,所述动态创建数据单元包括菜单项位置信息、自定义菜单组字符串、自定义菜单项字符串、自定义菜单项信息、内部菜单项信息、内部菜单组信息;所述菜单关系数据单元包括子窗口与菜单组的关系、仪器面板硬键与菜单组的关系、导向菜单项与菜单组的关系;所述菜单项菜单组的映射表单元包括一个保存菜单项ID和菜单项对象关系的映射表以及一个保存菜单组ID和菜单组对象关系的映射表。
进一步而言,所述菜单管理单元用于根据所述动态创建数据单元中的数据动态创建菜单对象,并将菜单对象ID和菜单对象的映射关系存放到所述菜单项菜单组的映射表单元;还用于根据所述菜单关系数据单元中的数据进行菜单切换;还用于通过指令分发层获取仪器内部数据,进行菜单信息的实时更新。
进一步而言,所述内部菜单项信息包括类型信息及数据更新信息;所述类型信息,用于标识菜单项的类型;所述数据更新信息,用于记录与菜单项更新相关的仪器内部数据类型;所述自定义菜单项包括“别名”菜单项和“一键测量”菜单项;所述“别名”菜单项用于为内部菜单项重命名;所述“一键测量”菜单项用于一次性执行批量的指令。
进一步而言,所述菜单关系数据单元,采用三个结构体定义子窗口ID与菜单组ID、硬键键值与菜单组ID、导向菜单项ID与菜单ID组的对应关系,采用三个数组保存所述的三种结构体对象。
进一步而言,所述菜单的动态创建包括以下步骤:
步骤一:所述菜单管理单元根据所述内部菜单组和菜单项信息,创建内部的菜单组和菜单项对象,并在所述菜单项菜单组的映射表单元中添加菜单对象ID与菜单对象的映射关系;
步骤二:所述菜单管理单元根据所述自定义菜单组和菜单项信息,创建自定义的菜单组和菜单项对象,并在所述菜单项菜单组的映射表单元中添加映射关系;
步骤三:所述菜单管理单元根据所述菜单项位置信息,从所述菜单项菜单组的映射表单元中搜索已创建好的菜单项和菜单组对象,对其进行菜单布局操作。
进一步而言,在进行菜单切换时,,所述菜单管理单元根据所述菜单关系数据单元和所述菜单组菜单项的映射表单元,找到将要切换到的菜单组对象的指针,替换当前菜单组对象的指针,然后通知所述显示交互层进行菜单的重绘。
进一步而言,所述菜单信息的实时更新是由所述菜单管理单元创建一个菜单更新线程,将当前菜单每个菜单项的更新信息依次以查询指令的形式主动向仪器内部模块发送,查询的结果返回后,对菜单项的数据进行更新或进行重绘。
采用上述方案:1、菜单布局和菜单切换关系可配置,不需要修改源代码即可实现新的菜单,提升了开发效率;2、通过规范化的接口交互,与仪器内部模块相互分离。使得仪器菜单成为可复用的组件化模块;3、可通过自定义的“一键测量”菜单项,按一个键让仪器自动执行一系列指令;4、可通过自定义的“别名”菜单项,修改菜单项的名称;5、面向用户开放定制接口。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。