资源描述
模板编号:0022
文件编号
××××.×××-××××
版本编号
V×. ×
修订状态
×
归档日期
××××-××-××
南京能瑞自动化设备股份有限公司企业文件
GW2012-9G25 显示
子系统 项目
详细设计说明书
拟制:
审核:
批准:
南京能瑞自动化设备股份有限公司发布
版 本 历 史
版本号/修改状态
拟制人/修改人
拟制/修改日期
更改理由
主要更改内容
(写要点即可)
1.0
张文超
2012-12-25
创建
无
1.1
张文超
2012-12-29
修改
整体思路
2.0
张文超
2013-6-3
修改
详细思路文档
注1:每次更改归档文件时,需填写此表。
注2:文件第一次归档时,“更改理由”、“主要更改内容”栏写“无”。
目 录
1 引言 4
1.1 编写目的 4
1.2 术语 4
1.3 参考文献 5
2 系统功能说明 5
2.1 应用场合 6
2.2 功能描述 6
3 设计约束 6
3.1 需求约束 6
3.2 隐含约束 6
4 设计策略 6
5 总体设计 7
5.1 总体结构设计 7
5.2 功能子系统清单 11
5.3 显示画面索引结构设计 11
6 接口设计 18
6.1 硬件接口 18
6.2 软件接口 18
6.2.1 MiniGUI接口 18
6.2.2 操作系统接口 18
6.2.3 平台接口 18
6.2.4 主应用接口 19
7 系统安全 20
7.1 系统安全 20
7.2 数据安全 20
7.3 后备和恢复 20
7.4 出错处理 20
7.5 计算机病毒的防治措施 21
8 开发环境的配置 21
1 引言
1.1 编写目的
本文档的目的旨在推动软件工程的规范化,包括程序系统的基本处理流图、程序系统的组织结构、功能模块划分、接口设计、运行设计、数据结构设计和安全性设计等内容。为程序的详细设计奠定基础。
V2.0的编写是为了详细列出I型集中器和II型专变的人机交互系统各个函数的实现与逻辑,需要注意的是,人机交互系统是基于MiniGUI系统开发的,所以在阅读前,请务必对MiniGUI有一定的了解!而关于涉及到MiniGUI的知识,我将不做任何描述!
1.2 术语
Ø 测量点(measured point):
指可以测量出唯一的一组电气量值的测量装置与终端的顺序电气连接点,当物理上相同的一个电气连接点被多个装置所测量,或者被一个装置所测量但通过多种方式被传递到终端时,按照多个测量点计,每个测量点具有唯一的逻辑定位编码,是该装置在终端的参数配置、数据应用的唯一对象标识。 计量点的数据来源,可以是485表或模拟量输入、脉冲表、计算值(包括总加表)、交采表。
Ø 规约
在远动系统中,为了正确地传送信息,必须有一套关于信息传输顺序、信息格式和信息内容等的约定。这一套约定,称为规约。
Ø 终端
安装于电力客户现场的用于现场服务与管理的设备。包括电力负荷管理系统终端、公用变压器监控终端、配电网自动化系统远方终端等各种负荷终端。每个终端都可包含多个计量点。
Ø GUI
Graphics User Interface 图形用户界面有时也称为WIMP = Window/Icon/Menu/Pointing Device 窗口、图标、菜单、指点设备。
Ø MiniGUI
由北京飞漫软件技术有限公司开发的 MiniGUI(),是面向实时嵌入式系统发布第 MiniGUI 已广的轻量级图形用户界面支持系统。自 1999 年初遵循 GPL 条款泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放机、查询终端等产品和领域。目前,MiniGUI 已成为跨操作系统的图形用户界面支持系统,可在 Linux/uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX、Nucleus、OSE等操作系统以及 Win32 平台上运行;已验证的硬件平台包括 Intel x86、ARM(ARM7/ARM9/StrongARM/xScale)、PowerPC、MIPS、M68K(DragonBall/ColdFire)等等。MiniGUI 1.16 更为基于嵌入式 Linux 的高端嵌入式设备提供了完整的多进程支持,从而将 MiniGUI 从中端市场带到了高端市场。
Ø 窗口系统
拥有图形用户界面的计算机通过窗口系统(Window System)来管理应用程序在屏幕上的显示。一个图形用户界面系统的组成一般有图2.1.1所示的关系。
图2.1.1 图形用户界面系统的组成
窗口系统是一个软件系统,它通过把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境。窗口系统提供基于窗口的工作模式,每个窗口是屏幕上的一个矩形区域,平行于屏幕的边界。应用程序可以拥有一个或多个窗口,窗口系统通常采用“重叠窗口”的概念和机制来管理窗口的显示,各个窗口在屏幕上是相互重叠的。窗口系统克服了老式终端机上字符工作模式下一次只能在一个屏幕做一件工作的缺点,它使得用户在一个屏幕上可以同时看到几件工作,还可以方便地切换工作项目。
Ø 根窗口
根窗口(root window)是所有窗口的祖先,占满整个屏幕的表面,也称为桌面窗口。本文中反复提到的DESKTOP就是指根窗口。
窗口有从属关系,也就是说,某些窗口的生命周期和可见性由它的所有者决定。父窗口通常拥有它们的子窗口。在这里,所有的窗口都是被DESKTOP所拥有!DESKTOP可以控制子窗口的生与灭!
1.3 参考文献
u MiniGUI技术白皮书 版本2.0(修订号3)
u MiniGUI编程指南 版本2.0(修订号3)
u MiniGUI用户手册 版本2.0(修订号3)
2 系统功能说明
2.1 应用场合
在我们的终端设备中,无论是浙江规约应用还是04国网规约的应用,都离不开人机界面。显示功能是终端不可少的一项功能,但是不同应用,甚至不同现场系统中要求显示的具体内容可能存在部分差别。
2.2 功能描述
显示系统主要完成三项功能:
u 常规菜单显示:主要包括终端实时信息、终端配置参数、终端测量点参数、终端测量点数据、终端参数设置等
u 弹出菜单显示:主要包括一些提示信息,如控制信息、升级信息、参数更改信息等
u 轮显菜单显示:轮显是终端在长时间无按键操作和远程通信操作时,需要持续循环显示几个固定的画面,可能是终端的实时信息、遥信状态、控制状态、计量点实时数据等用户关心的内容。
3 设计约束
3.1 需求约束
由于具体现场应用需求的一致性比较差,不同系统要求的终端功能不尽相同,显示菜单根据不同的终端类型,不同的系统应用,经常会有所调整,要求显示系统具有灵活的可配置性。在具体实现时,我们在基本版本中先实现主菜单项的可配置,每个主菜单下属的显示画面仍然是固定的。
对于图形显示(如实时的功率曲线、电压曲线、电流曲线、电量曲线等)也在基本版本中不做过高要求,先实现原终端中已完成的柱状图显示。
本设计暂时只考虑160×160点阵的LCD屏。
3.2 隐含约束
4 设计策略
显示模块采用MiniGUI设计,由于MiniGUI的软件架构,不允许它嵌入我们以单进程单线程设计的应用层软件中,只能作为一个单独的应用进程在终端内运行。常规的处理(菜单、轮显)由显示进程处理,需要弹出的画面需要由应用层软件通过进程间通信传递到显示进程处理。同时显示进程需要把按键事件通过进程间通信传递到应用进程做一些特殊处理(如按键消音,强制通话)。在允许通过面板按键设置终端参数的应用中,显示进程还需要把参数更改事件通知应用进程处理。
5 总体设计
5.1 总体结构设计
本设计中,MiniGUI运行在线程模式,可以在不同应用线程中创建多个窗口,但所有的窗口在一个进程或地址空间内运行。但我们的显示系统比较简单,不需要同时显示多个窗口,所以显示应用只设计一个线程。
整体架构如下:
MiniGUI应用程序
MiniGUI应用程序接口
ANSI C
库
设备驱动
操作系统
可移植层
底层硬件
图 基于MiniGUI的嵌入式系统总体架构
显示应用主要完成三个工作,包括消息处理、画面绘制、同主调度系统的进程间通信。
MiniGUI中的各线程之间采用消息机制进行通信,其中的Desktop线程充当一个消息服务器,消息从Timer消息队列和窗口消息队列取出来后就会投递给Desktop线程,再由它传递给应用线程。消息传递模型如下图所示:
MiniGUI中的Timer线程用来完成定时应用,如某菜单下的定时刷新数据、定时菜单跳转等。
执行流程图如下:
这是一个主线程的执行流程图,在这里有一个重要的消息接收机制,创建主窗口后,它不断的从消息队列中去读消息,然后把消息发送到消息处理机制。消息处理机制再根据,得到的消息类型进行相应的处理,在正常运行的情况下,这个机制是不会结束的,当然主控制系统可以通过sendMessage 关闭窗口消息(MSG_CLOSE)来关闭窗口。
在这里要说明的是,此流程图中有两个定时器,一个是定时刷新DESKTOP界面(闪烁图标),第二个是定时去读数据字典里的信息。
在DESKTOP收到来自子窗口或者是主控制系统的自定义消息时,DESKTOP会创建并打开一个子窗口。当桌面只显示DESKTOP窗口的时候,子窗口是不允许运行的,也就是子窗口没有被打开。当由一个子窗口A要进入另个子窗口B,子窗口A就会向DESKTOP发送一个打开子窗口B的消息,然后子窗口A会关掉自己。DESKTOP在收到消息的时候,就会打开子窗口B,同时也可以将子窗口发过来的参数(A要传给B的参数)发给子窗口B。子窗口的执行流程图如下:
同主调度系统的进程间通信,通过socket连接,把本系统设为客户端与主调度系统进行连接通信,流程图如下:
5.2 功能子系统清单
u Int MiniGUIMain(int argc, const char* argv[])
MiniGUI入口函数,完成主窗口的创建,打开对应的动态库,并创建窗口控制系统的线程。
u Int desktop(void)
创建DESKTOP窗口,消息队列的循环读取处理,窗口间通信数据的读取
u void creatCtrldata(U32 u32CreatId)
根据界面索引号,从menu.ini配置文件中读取菜单界面显示数据
u void creatLeafWin(U32 u32CreatId)
根据界面索引号,从menu.ini配置文件中读取叶子界面显示数据
u void *pthContrlMain(void)
人机交互系统的控制系统,负责与守护进程进行通信,对按键的操作计时,对轮显和背光灯进行控制,并且对图标状态的维护等
u int ChildExec(U32 u32ChildWindowID,LPARAM lpara)
窗口过程函数,实际的显示功能就是在这个函数中实现的,因为MiniGUI的显示主要就是对消息的处理。这个函数中需要处理的消息包括按键消息、定时消息、自定义消息等。每个消息处理中可能包括对显示画面索引的处理和调用统一的处理函数。
根据显示画面索引号,调用具体绘画界面函数,显示具体界面内容。其中u32ChildWindowID为要显示窗口的索引号。Lpara为窗口的附件参数
u 画面绘图函数集
具体绘制终端需要显示的每个画面,详细内容参见《8028interface》。
5.3 显示画面索引结构设计
显示界面画面结构设计。(命名统一)局部变量规则:类型+名字,名字原则上采用英文定义,首字母大写;如:指针类型:*pName;结构类型:strName;u32类型变量:u32Name;
全局变量:g_类型+名字;如全局指针类型:*g_pName.
typedef struct __DISPALY_INFO__
{
HWND u32NowFd; //当前界面句柄
HWND softkeyAndPortFd; //当前的告警窗口和小键盘窗口句柄
U32 u32WinId; //当前叶子窗口索引号
U32 u32LightonFlg; //背光灯亮起标志
U32 u32LightonTime; //背光开启时间
U32 u32LightonDispTime; //背光灯本次亮起累计时间
U32 u32PopupFlg; //弹出警告界面有效标志
U32 u32TurndispFlg; //轮显有效标志
S32 u32TurndispIndex; //当前轮显菜单索引
U32 u32TurnTime; //轮显开启时间
U32 u32TurndispTime; //当前轮显间隔时间
U32 u32NokeyTime; //无按键操作累计时间
}DISPALY_INFO;
extern DISPALY_INFO dispalyInfo;
上面的这个结构体是DESKTOP对子窗口的一个控制信息,当有按键操作消息时,或有弹出菜单消息时,在消息处理中,置位u32LightonFlg标志,同时清零u32LightonTime重新开始计时,在定时消息处理中判断u32LightonTime计时是否达到设定背光灯亮起时间,是则复位u32LightonFlg标志。
当有接收到弹出画面消息时,置位u32PopupFlg,同时清零popup_time重新开始及时,在定时消息处理中判断popup_time是否达到设定的弹出画面显示时间,是则复位u32PopupFlg,同时处理菜单索引为主菜单或其他菜单。
在定时消息处理中,需要无条件的对u32NokeyTime进行累计,u32NokeyTime的清零需要在每个按键消息处理中进行。当u32NokeyTime累计到轮显启动设定时间u32TurnTime, 置位u32TurndispFlg,同时清零u32TurnTime重新开始计数,计数到某设定值u32TurndispTime,轮显下一个菜单。
Ø 索引号的定义
在本界面系统当中,界面索引号采用的4个字节的16进制数定义:0xABCDEFGH;A表示第一级菜单,AB表示第二级菜单,ABC表示第三级菜单,ABCD表示第4级菜单,ABCDE表示第5级菜单,ABCDEF表示第六级菜单;ABCDEFG表示第7级菜单, ABCDEFGH表示第8级菜单如下图:
(0x1)主界面
(0x10)主菜单
(0x100)测量点数据显示
(0x1000)实时数据
(0x1001)日数据(输入日期)
(0x10010)日数据显示
(0x1002)月数据(输入日期)
(0x10020)月数据显示
(0x101)参数设置与查看
(0x1011)设置模式(密码)
(0x10110)参数设置
(0x101100)通讯通道设置
(0x1011000)信道类型设置
(0x1011001)通信模式设置
(0x1011002)通道详细设置
(0x10110020)通讯方式
(0x10110021)短信中心
(0x10110022)主站IP地址
(0x10110023)以太网参数
(0x101101)电表参数设置
(0x101101)测量点选择
(0x1011010)电表档案设置
(0x101102)终端时间设置
(0x101102)终端时间设置
(0x1011020)提示修改
(0x101103)界面密码设置
(0x101103)界面密码设置
(0x1011030)提示修改
(0x101104)终端编号设置
(0x1011040)提示修改
(0x1010)查看模式
(0x1010)参数查询
(0x10100)通讯通道查看
(0x101000)信道类型查看
(0x101001)通信模式查看
(0x101002)通道详细查看
(0x1010020)通讯方式
(0x1010021)短信中心
(0x1010022)主站IP地址
(0x1010023)以太网参数
(0x10101)电表参数查看
(0x10101)测量点选择
(0x101010)电表档案查看
(0x10102)终端时间查看
(0x10103)终端编号查看
(0x102)终端管理与维护
(0x1020)终端版本
(0x1021)页面设置
(0x1022)现场调试
(0x10220)测量点参数
(0x10221)串口参数
(0x10222)GPRS登录信息
(0x10223)终端运行状态
(0x10224)遥信状态
(0x10225)下行模块状态
(0x10226)直流模拟量
(0x1023)终端重启
(0x1024)数据初始化
(0x1025)参数初始化
(0x1026)载波抄表管理
(0x10260)重启抄表
(0x10261)停止抄表
(0x10262)恢复抄表
(0x1027)手动抄表
(0x1028)终端数据
(0x10280)有功功率
(0x10281)无功功率
(0x10282)电压电流
(0x10283)正向有功
(0x10284)正向无功
(0x10285)反向有功
(0x10286)反向无功
(0x10287)电能表示数
(0x10288)当月有功需量
(0x10289)当月无功需量
(0x1028a)上月电能表示数
(0x1028b)上月有功需量
(0x1028c)上月无功需量
(0x1028d)当前时间
(0x1028e)结算日
还有一些较为独立的界面,如密码输入界面,(在设置模式后出现),我把它的索引号设为:0x3
轮显界面为:0X4
界面Id号固定,架构Id是可变的,两套ID作为映射。
5.4 轮显菜单设置
轮显菜单通过定义一个轮显菜单ID数组来设计:
typedef struct __TURN_WINDOW__
{
U32 viewFlg; //轮显画面对应的ID号
U32 viewWindowId; //轮显界面的索引号
}TURN_WINDOW;
static TURN_WINDOW viewTurn[TURENUM]
在轮显时通过ID和相应的绘图函数进行显示。而至于有哪些画面参与轮显,是我们在页面设置中设置的。
5.5 模块设计
在前面,已经大概的介绍了一下整体思路,在这里我将粗略的介绍一下设计每一个模块的实现方法:
Ø DESKTOP设计
我们把DESKTOP分为两部分,一部分是DESKTOP的显示部分,另一部分是消息传递部分;而消息传递部分又分为,向子窗口传递消息部分和向主控制器传递消息部分!
向子窗口传递消息部分,包括接收子窗口发来的消息,向子窗口发送消息等,同样向主控制器传递消息部分也是包括接收和发送两个内容!
Ø 模块概念描述
DESKTOP的显示部分:这一部分主要是负责界面的显示,包括前面所说的四大窗口类型,其他部分是不可以直接显示界面的;
消息传递层:这一部分主要负责对给个窗口的消息进行传递,它从主控制器接过要发送的消息然后发到指定窗口;或者从窗口系统中接收消息再发送到主控制器机制中;
Ø 模块设计描述
Desktop在前面已经做了简单的说明,desktop是所有口的父窗口,也就是说,DESKTOP可以直接控制各个子窗口。
DESKTOP的窗口设置,是采用满屏的风格,即占满整个LCD屏,160*160的大小,在窗口定义和设置属性中,去掉窗口默认的标题栏,状态栏和标题,如下图:
I型集中器主界面示图
实现方法:
CreateInfo.dwStyle = WS_VISIBLE;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = WinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 160;
CreateInfo.by = 160;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
在主窗口(desktop窗口)中有个重要的自定义消息:MSG_CHILDTODESK,这个消息的功能是接收子窗口发来的创建另一窗口的消息,在这个消息处理中包含了一个重要的函数:ChildExec。这个函数我们在前面也说过,它是打开子窗口的一个入口函数!
在desktop窗口中,也创建了一个定时器的消息,它是用来维护时间和顶层、底层状态栏信息!
Ø 子窗口设计
从显示角度来看的话,子窗口可以分成菜单界面和叶子界面,而所有菜单界面的结构都相似,有菜单界面的标题,button控件和其上的信息组成,唯一不同的就是每个菜单界面的菜单数,即button的数量。所以菜单界面信息定义一下结构体:
typedef struct __WINDOW_INFO__
{
U32 u32WindowID; //窗口的逻辑ID
S8 s8Title[16]; //当前窗口的标题;
U32 u32IdNum; //当前窗口的菜单数目
U32 u32ButtonID[MAXMENU]; //当前窗口的button的ID
S8 s8MenuName[MAXMENU][20]; //当前窗口菜单名
}WINDOW_INFO;
在叶子界面中信息,远比菜单界面要复杂,因为叶子界面分为设置界面和查询界面,查询界面较为简单,其界面只有显示信息,而没有控件。但是设置界面会有不同的控件,控件大致有两种,一是编辑框,二是下拉选择框。
typedef struct __LEAF_WINDOW__
{
U32 dlgNum; //界面显示项的数目
U32 flgSign; //查询窗口和设置窗口的标志
U32 unirtSign; //轮显界面是否有单位
S8 unirt[DLGNUM][20]; //单位
U32 maxNum[DLGNUM]; //最大的值
U32 comBoBoxInfoNum[DLGNUM];//每个下拉框中选项的数目
S8 comBoBox[DLGNUM][DLGNUM][20];//下拉框中的选项内容
char title[20]; //界面的题目
S8 dlgName[DLGNUM][20]; //每个数据项的名字
U32 dlgType[DLGNUM]; //每个数据项的类型,下拉框和编辑框还有无
U32 pID[DLGNUM]; //每个数据项在数字字典中的ID号
U32 inpMaxNum[DLGNUM]; //每个数据项设置的最大长度
U32 FNsend[DLGNUM]; //广播发送修改Fn标志
}LEAF_WINDOW;
这个结构体是什么菜单界面的信息,开发人员通过更改这个结构体里的信息,来显示不同菜单。甚至可以直接通过修改文件menu.ini,就可以做到创建修改菜单窗口。这样就大大减小了开发者的后期开发的难度。
子窗口的设计部分,相来对说可能会简单点,因为绝大多数的子窗口中模块是相似的,当然这里的子窗口包括警告窗口和输入窗口。
在子窗口的设计中,采用对话框的设计风格,但是要注意的是,子窗口并不是采用满屏方式,这样是为了不完全覆盖DESKTOP界面。子窗口的大小为:160*108的大小,160是横坐标长度,108是纵坐标长度,单位为像素点。子窗口不能覆盖掉DESKTOP的顶层状态栏和底层状态栏,如图:
主菜单示图
在实现的过程中,将子窗口的创建信息和属性,设成是一个类,有不同的子窗口,就有这个类的不同的对象。这样就可以做到所有的子窗口都是继承了一个类的属性!
如下:
static DLGTEMPLATE DlgYourTaste =
{
WS_VISIBLE,
WS_EX_NONE ,
0, 17, 160,125,
"",
0, 0,
5, NULL,
0
};
子窗口的创建, 要用到一个结构体,如下:
typedef int (*DispChildWindow)(U32,LPARAM);
typedef struct __DISP_INFO__
{
U32 u32DispID; //窗口ID;
DispChildWindow p; //窗口的入口函数
}DISP_INFO;
在这个结构体中有两个数据项,一个是窗口ID,还有一个是窗口的入口函数,这是创建一个子窗口的两个必要元素。在这个结构体中,窗口的入口函数可以相同,但是窗口ID一定是唯一的,这也是识别不同窗口的一个元素,结构体的赋值如下:
DISP_INFO disp[WINDOWNUMMAX] =
{
{0x10, menuWindowCreat}, //主菜单-菜单
{0x100, menuWindowCreat}, //测量点数据-菜单
{0x1000, TimerData}, //实时数据
{0x1001,dayDataSelect}, //日数据查询
{0x10010,dayAndMonDataShow}, //日数据
{0x1002,monthDataSelect}, //月数据查询
{0x10020,dayAndMonDataShow}, //月数据
{0x101, menuWindowCreat}, //模式选择:查询模式,设置模式 -菜单
{0x1010,menuWindowCreat},//参数查询 -菜单
{0x10100,menuWindowCreat},//通信通道查询 -菜单
{0x101000,setAndShowFace},//类型模式查询
{0x101001,menuWindowCreat},//通道详细查询 - 菜单
{0x1010010,setAndShowFace},//通讯方式
{0x1010011,setAndShowFace},//短信中心
{0x1010012,setAndShowFace},//主站IP地址
{0x1010013,setAndShowFace},//以太网参数
{0x10101,InputMeaPointNum},//输入测量点号
{0x101010,AmmeterFileShow},//电表档案查询
{0x10102,setTime},//时钟查询
{0x10103,TerminalNumSet},//集中器编号查询
{0x10104,SetContrast},//对比度查询
{0x1011,menuWindowCreat},//参数设置 -菜单
{0x10110,menuWindowCreat},//通信通道设置 -菜单
{0x101100,setAndShowFace},//类型模式设置
{0x101101,menuWindowCreat},//通道详细设置 - 菜单
{0x1011010,setAndShowFace},//通讯方式
{0x1011011,setAndShowFace},//短信中心
{0x1011012,setAndShowFace},//主站IP地址
{0x1011013,setAndShowFace},//以太网参数
{0x10111,InputMeaPointNum},//输入测量点号
{0x101110,AmmeterFileSet},//电表档案设置
{0x10112,setTime},//时钟设置
{0x10113,setAndShowFace},//密码设置
{0x10114,TerminalNumSet},//集中器编号设置
{0x10115,SetContrast},//对比度设置
{0x102, menuWindowCreat}, //终端管理与维护 -菜单
{0x1020,ConcenInfot}, //集中器信息
{0x1021,menuWindowCreat}, //页面设置
{0x10210,viewPropertySet}, //属性设置
{0x10211,viewSet}, //画面设置
{0x1022,menuWindowCreat}, //现场调试
{0x10220,SiteCommisInter}, //交采参数
{0x10221,GPRSInter}, //GPRS登录信息
// {0x10222,paraInit}, //终端运行状态
{0x10223,yxState}, //遥信状态
{0x10224,upModeStatie}, //下行
{0x10225,LCDPrint}, //调试信息
{0x1023,menuWindowCreat}, //终端初始化
{0x10230,paraInit}, //硬件初始化
{0x10231,paraInit}, //数据初始化
{0x10232,paraInit}, //参数初始化
{0x1024,menuWindowCreat}, //载波搜表管理
{0x10240,paraInit}, //启动搜表
{0x10241,paraInit}, //已搜电表
{0x1025,menuWindowCreat}, //手动抄表
{0x10250,paraInit}, //重启抄表
{0x10251,paraInit}, //停止抄表
{0x10252,paraInit}, //恢复抄表
/*************************特殊界面*****************************/
{0x3,inputPassword}, //密码输入界面,(在设置模式后出现)
{0x4,viewShow}, //轮显界面
/**************************************************************/
{0,NULL}
};
I型集中器的所有界面机会都在这里了,当然还有两个界面没有列在其中,一个是小键盘输入界面,还有一个是告警界面。在设计时,为了方便调用,将小键盘和告警界面作为所有窗口的直接子窗口,即可以直接调用。
上面我们所说的是创建子窗口的必要元素,那么有了这些元素,就要实现子窗口的绘制,在本系统中,实现子窗口的函数如下:
if (!InitMiniGUIExt())
return -1;
DlgYourTaste.controls = set_months;
DialogBoxIndirectParam (&DlgYourTaste, HWND_DESKTOP, set_monthsdata, 0L);
上面的绘制方法和语法详见《MiniGUI编程规范》
5.6 显示画面函数库的组织
显示的画面函数有很多下面,我将一一列出,并做简要说明:
.c文件
函数
说 明
main.c
int MiniGUIMain(int argc, const char* argv[])
人机交互系统的入口函数
AmmeterFileSet.c
int AmmeterFileSet(U32 u32WindowId,LPARAM lpara)
创建电表档案设置
AmmeterFileShow.c
int AmmeterFileShow(U32 u32WindowId,LPARAM lpara)
创建电表档案查询
ConcenInfo.c
int ConcenInfot(U32 u32WindowId,LPARAM lpara)
创建集中器信息的界面
contrastAndLCDBlight.c
void contrastAndLCDBlight(int cmd,int sta)
Lcd屏对比度和背光灯控制函数
dayData.c
int dayDataSelect(U32 u32Id,LPARAM lpara)
日数据选择日期界面
desktop.c
int desktop(void)
创建主界面
GetPrivateProfileString.c
GPPSDWORD GetPrivateProfileString
从menu.ini文件中读取数据的函数
GPRSInter.c
int GPRSInter(U32 u32WindowId,LPARAM lpara)
创建现场调试界面,GPRS登录信息界面
initChildWin.c
void creatLeafWin(U32 u32CreatId)
根据窗口的索引号初始化叶子窗口数据
initMenuData.c
void creatCtrldata(U32 u32CreatId)
根据窗口的索引号初始化菜单窗口数据
InputMeaPointNum.c
int InputMeaPointNum(U32 u32WindowId,LPARAM lpara)
创建测量点输入界面
LCDPrint.c
int LCDPrint(U32 u32WindowId,LPARAM lpara)
调试信息显示
展开阅读全文