Sfoglia il codice sorgente

01. 合并: 液晶处理部分代码。
02. 修改: 为提高液晶响应速度将主循环休眠时间修改为10ms。

EWen 5 mesi fa
parent
commit
9645adbc0d

+ 5 - 1
README.md

@@ -76,4 +76,8 @@
 
 # 20251218
 01. 修复: rt_sockioctl接口强制转换导致指针地址截断进而导致虚拟网卡ip获取失败的问题。
-02. 修复: rt_get_netcard_id_from_socket函数中ip转换处理问题。
+02. 修复: rt_get_netcard_id_from_socket函数中ip转换处理问题。
+
+# 20251219
+01. 合并: 液晶处理部分代码。
+02. 修改: 为提高液晶响应速度将主循环休眠时间修改为10ms。

+ 5 - 307
dtu/dtu_main_t536/app/Fmt.c

@@ -16,41 +16,8 @@
 *********************************************************************/
 #include <stdarg.h>  
 #include  "head.h"
-#ifdef LINUX_KERNEL_APP
-#include <linux/inet.h>
-#endif
 MODIFY_DEF g_tModify;    /* 修改数据的结构*/
 
-#ifdef LINUX_KERNEL_APP
-int _in_aton_(char* str)
-{
-    int addr=0;
-    unsigned char tmp[3],dat,i;
-    char count;
-    char* ptr=str;
-
-    for(count=0,dat=0; count<4; count++)
-    {
-        memset(tmp,0,3);
-        i=0;
-        while((*ptr!='.')&&(i<3)&&(*ptr!='\0'))
-        {
-            tmp[i++]=*ptr-'0';
-            ptr++;
-        }
-        if(i==1)
-            dat=tmp[0];
-        else if(i==2)
-            dat=tmp[0]*10+tmp[1];
-        else if(i==3)
-            dat=tmp[0]*100+tmp[1]*10+tmp[2];
-        addr|=dat<<(8*(4-count-1));
-        ptr++;
-    }
-    return addr;
-}
-#endif
-
 static void itoa1(short int value,char *pbuf)
 {
 	sprintf(pbuf,"%i",value);
@@ -202,7 +169,7 @@ static void stostr(unsigned short value,char *pbuf,char basetype)
 ***************************************************************************/
 
 #if 0
-static void ltostr(uint32_t int value,char *pbuf,char basetype)
+static void ltostr(unsigned long int value,char *pbuf,char basetype)
 {
 	switch(basetype)
 	{
@@ -818,25 +785,6 @@ static void   UnsignedFormatOut(char *Flags,unsigned char Width,char *TempStr,un
 		i=Width;
 	}
 }
-
-
-int  fmt_findchardot(u8 *buf,u8 *str,BYTE dot)
-{
-	u8 *ps;	
-	int i,lenth=0;
-	ps=strchr(buf,dot);
-	if(ps)  // 存在','
-	{
-		lenth=ps-buf;
-		for(i=0;i<lenth;i++)
-		{
-			str[i]=*buf++;
-		}
-		str[i]='\0';	
-	}
-	return lenth;
-}
-
 /***************************************************************************
 **  功能: 将从参数表中取出的指针,并将它所指向的值转变成给定格式的字符串 **
 **  入口: ap是参数表的参数指针,注意: 参数表中的参数均应为void *         **
@@ -873,7 +821,7 @@ unsigned char ValuePtrToStr(char *Str,char *FmtStr,va_list  ap)
 	
 	/*分解出数据的显示宽度*/
 	// 剔除0~9以外的内容
-	for(; (*TempPtr<='9')&&(*TempPtr>='0'); TempPtr++){}/*0~9 change by sunxi old:(*TempPtr<':'&&*TempPtr>'/')*/
+	for(; (*TempPtr<='9')&&(*TempPtr>='0'); TempPtr++){}/*0~9 change by wjj old:(*TempPtr<':'&&*TempPtr>'/')*/
 	for(i=0; FmtStr<TempPtr; Temp[i]=*FmtStr++,i++){}	/*copy到Temp[]中*/
 	Temp[i]='\0';
 	Width=(unsigned char)atoi(Temp);/*宽度*/
@@ -883,7 +831,7 @@ unsigned char ValuePtrToStr(char *Str,char *FmtStr,va_list  ap)
 	{
 		FmtStr++;
 		TempPtr++;
-		for(;*TempPtr<='9'&&*TempPtr>='0';TempPtr++){}/*0~9 change by sunxi */
+		for(;*TempPtr<='9'&&*TempPtr>='0';TempPtr++){}/*0~9 change by wjj */
 		for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
 		Temp[i]='\0';
 		Precision=(unsigned char)atoi(Temp);
@@ -929,24 +877,6 @@ unsigned char ValuePtrToStr(char *Str,char *FmtStr,va_list  ap)
 		TempStr[i]='\0';
 
 		break;
-	case 'y': 
-		{
-			struct timespec ts;
-			struct rtc_time_t rtc;
-			ts.tv_sec=(unsigned int)(*(unsigned int *)va_arg(ap,void *));
-			ts.tv_nsec=0;
-			timespec_to_rtc(ts,&rtc,1);			
-			sprintf(TempStr,"%02d-%02d-%02d",rtc.year,rtc.month,rtc.day);
-		}
-
-		break;
-	case 'p': 
-		{
-			unsigned int ip;
-			ip=(unsigned int)(*(unsigned int *)va_arg(ap,void *));
-			sprintf(TempStr,"%03d.%03d.%03d.%03d",(ip>>24)&0xff,(ip>>16)&0xff,(ip>>8)&0xff,(ip>>0)&0xff);
-		}
-		break;		
 		
 	case 'h': switch(Type[1])	/*变量长度修饰符*/
 			  {
@@ -1052,16 +982,6 @@ void StrToValue(char *Str,char *FmtStr,void *Varible)
 		break;
 	case 'c': *(char *)Varible=*Str;
 		break;
-	case 's': 
-		{
-			char *tmpstr=(char *)Varible;
-			while(*Str!='\0')
-			{
-				*tmpstr++=*Str++;
-			}
-			*tmpstr='\0';
-		}
-		break;		
 	case 'h': 
 		switch(Type[1])
 		{
@@ -1079,37 +999,6 @@ void StrToValue(char *Str,char *FmtStr,void *Varible)
 				break;
 		}
 		break;
-	case 'p':  // IP地址处理
-#ifdef LINUX_KERNEL_APP	
-			*((int *)Varible)=in_aton(Str);
-#else
-			*((int *)Varible)=inet_addr(Str);
-#endif
-			Swap_32(Varible);
-		break;
-	case 'y':  // 年月日 处理
-		{
-			struct rtc_time_t tm;
-			struct timespec ts;
-			char tstr[32];
-			int lenth;			
-			lenth=fmt_findchardot(Str,tstr,'-');
-			if(lenth==0)return;
-			tm.year=atoi(Str);	
-			Str+=lenth+1;
-			lenth=fmt_findchardot(Str,tstr,'-');
-			if(lenth==0)return;
-			tm.month=atoi(Str);
-			Str+=lenth+1;			
-			tm.day=atoi(Str);
-			tm.hour=0;
-			tm.min=0;
-			tm.ms=0;
-			rtc_to_timespec(&tm,&ts);
-			*((int *)Varible)=ts.tv_sec;
-		}
-		break;
-		
 	}
 	
 }
@@ -1169,8 +1058,6 @@ unsigned char ScanFmtStr(char *Type,const char *ScanPtr,char *FmtStr)
 		case 's': 
 		case 'B':
 		case 'b':
-		case 'y':  // 年月日模式 
-		case 'p':  // IP模式 
 			*Type=*ScanPtr;/*数据类型标志*/
 			*FmtStr=*ScanPtr++;
 			FmtStr++;
@@ -1250,7 +1137,6 @@ void fmt_Printf(short sx,short sy,char Flags,const char *FmtStr,...)
 		BYTE mode,len;
 		BYTE *pd=(BYTE *)arrOutStr;		
 		if(Flags==MMI_FOCUS_NORMAL)mode=1;
-		else if(Flags==MMI_FOCUS_ASC5_7)mode=2;
 		else mode=0;
 		len=0;
 		while(*pd++!='\0')len++;
@@ -1804,7 +1690,7 @@ void fmt_CursorAdd(void)
 	if(!g_tModify.bModify)return;
 	fmt_CursorOff();
 	dat=g_tModify.Valstr[(int)g_tModify.Current]; /*取当前修改字符*/
-	//if(g_tModify.Type!='s') /*不是汉字修改*/
+	if(g_tModify.Type!='s') /*不是汉字修改*/
 	{
 		switch(g_tModify.Type)
 		{
@@ -1884,60 +1770,6 @@ void fmt_CursorAdd(void)
 						}
 					}			
 					break;
-				case 'p': /*ip地址处理*/
-					if(dat!='.')
-					{
-						if(dat=='9')dat='0';else dat++;
-						if(dat>'9')dat='0';
-					}
-					break;
-				case 'y': /*ip地址处理*/
-					if(dat!='-')
-					{
-						if(dat=='9')dat='0';else dat++;
-						if(dat>'9')dat='0';
-					}
-					break;
-
-				case 's':  /*字符串*/
-#ifdef PASSWORD_4_STR
-					if(dat>='0'&&dat<'9')
-					{
-						dat++;
-					}
-					else if(dat=='9')
-					{
-						dat='0';
-					}
-					else
-					{
-						dat='0';
-					}
-#else
-					if(dat>='0'&&dat<'9')
-					{
-						dat++;
-					}
-					else if(dat=='9')
-					{
-						dat='A';
-					}
-					else if(dat>='A'&&dat<'Z')
-					{
-						dat++;
-					}
-					else if(dat=='Z')
-					{						
-						dat='0';
-					}
-					else
-					{
-						dat='0';
-					}
-
-#endif
-					break;
-					
 				default:
 					dat='0';
 					break;
@@ -1971,7 +1803,7 @@ void fmt_CursorSubb(void)
 	if(!g_tModify.bModify)return;
 	fmt_CursorOff();
 	dat=g_tModify.Valstr[(int)g_tModify.Current]; /*取当前修改字符*/
-	//if(g_tModify.Type!='s') /*不是汉字修改*/
+	if(g_tModify.Type!='s') /*不是汉字修改*/
 	{
 		switch(g_tModify.Type)
 		{
@@ -2051,58 +1883,6 @@ void fmt_CursorSubb(void)
 						}
 					}
 					break;
-				case 'p': /*ip地址处理*/
-					if(dat!='.')
-					{
-						if(dat=='0')dat='9';else dat--;
-						if(dat>'9')dat='0';
-					}
-					break;
-				case 'y': /*ip地址处理*/
-					if(dat!='-')
-					{
-						if(dat=='0')dat='9';else dat--;
-						if(dat>'9')dat='0';
-					}
-					break;	
-				case 's':  /*字符串*/
-
-#ifdef PASSWORD_4_STR
-					if(dat>'0'&&dat<='9')
-					{
-						dat--;
-					}
-					else if(dat=='0')
-					{
-						dat='9';
-					}
-					else
-					{
-						dat='0';
-					}
-#else 
-					if(dat>'0'&&dat<='9')
-					{
-						dat--;
-					}
-					else if(dat=='0')
-					{
-						dat='Z';
-					}
-					else if(dat>'A'&&dat<='Z')
-					{
-						dat--;
-					}
-					else if(dat=='A')
-					{						
-						dat='9';
-					}
-					else
-					{
-						dat='0';
-					}
-#endif
-					break;				
 				default:
 					dat='0';
 					break;
@@ -2111,89 +1891,7 @@ void fmt_CursorSubb(void)
 	}
 	fmt_CursorOn();
 }
-/**************************************************************************
-函数名称:fmt_FmtstrPrecison
-函数版本:1.00 
-作者:   
-创建日期:2008.9.1     
-函数功能说明:分析格式字符串内显示的数据精度
-输入参数:
-输出参数:
-返回值:
 
-更新信息:
-更新日志1:
-日期:	  
-修改者:	  
-修改内容:  
-修改原因:
-***************************************************************************/
-
-
-static char * fmt_FmtstrPrecison(char *FmtStr,BYTE *len)
-{
-	char *TempPtr,*ret;
-	char Temp[4];
-	int i;
-	char Precision=6;		
-	FmtStr++;	/*=%*/
-	/*分解出标志字符序列*/
-	for(;*FmtStr<'0';FmtStr++){} /*+ - * # .*/
-	/*分解出数据的显示宽度*/
-	for(;(*FmtStr<='9')&&(*FmtStr>='0');FmtStr++){}/*0~9 change by sunxi old:(*TempPtr<':'&&*TempPtr>'/')*/
-	/*分解出数据的显示精度*/
-	if(*FmtStr=='.')
-	{
-		FmtStr++;
-		TempPtr=(char *)FmtStr;
-		ret=(char *)FmtStr;
-		for(;*TempPtr<='9'&&*TempPtr>='0';TempPtr++){}/*0~9 change by sunxi */
-		for(i=0;FmtStr<TempPtr;Temp[i]=*FmtStr++,i++){}
-		Temp[i]='\0';
-		Precision=(unsigned char)atoi(Temp);
-	}
-	else 
-	{		
-		ret=NULL;
-	}
-	return ret;	
-}
-/**************************************************************************
-函数名称:fmt_GetModifyValue
-函数版本:1.00 
-作者:   
-创建日期:2008.9.1     
-函数功能说明:分析编辑字符串的格式,并取得编辑状态下数据的值
-输入参数:
-输出参数:
-返回值:
-
-更新信息:
-更新日志1:
-日期:	  
-修改者:	  
-修改内容:  
-修改原因:
-***************************************************************************/
-
-void fmt_GetModifyValue(void)
-{	
-	BYTE precison,len;
-	char *p;
-
-	len = 0;
-	StrToValue(g_tModify.Valstr,g_tModify.Fmtstr,g_tModify.pValue);
-	if(g_tModify.bFmtstr&&g_tModify.Type=='f')  /*小数点可变*/
-	{
-		precison=mmi_GetFloatFactor((void *)g_tModify.pValue); /*取得小数点后的位数*/
-		p=fmt_FmtstrPrecison(g_tModify.pFmtstr,&len);
-		if(len!=precison&&p!=NULL) /*小数点后有效位数不同*/
-		{
-			*p=precison+'0';
-		}
-		strcpy(g_tModify.Fmtstr,g_tModify.pFmtstr);
-	}
-}
 /**************************************************************************
 函数名称:fmt_GetModifyValue_Single
 函数版本:1.00 

+ 1 - 3
dtu/dtu_main_t536/app/Fmt.h

@@ -28,8 +28,7 @@ enum
 {
 	MMI_FOCUS_NO=0,    //不反显
 	MMI_FOCUS_NORMAL, //正常反显
-	MMI_FOCUS_DATA,  //只反显数据
-	MMI_FOCUS_ASC5_7  // 5*7点阵asc显示
+	MMI_FOCUS_DATA  //只反显数据
 };
 
 
@@ -62,7 +61,6 @@ bool fmt_CursorLeft(void);
 bool fmt_CursorRight(void);
 void fmt_CursorAdd(void);
 void fmt_CursorSubb(void);
-void fmt_GetModifyValue(void);
 void fmt_GetModifyValue_Single(void);
 bool fmt_GetModifyType(void);
 void StrToValue(char *Str,char *FmtStr,void *Varible);

+ 3 - 0
dtu/dtu_main_t536/app/IEC101.c

@@ -4762,6 +4762,7 @@ void IEC101_SectionWrite(IEC101_DEF *pt101,u8 *ps)			//确
 	u8 *pd;
 	int num;
 	u8 cot;
+	#if 0 // TODO 定值区处理 EWen
 	WORD section;
 	if(pRunSet->wEquTypeManager)	IEC101_setion_chg_msg(pt101,ps);
 
@@ -4773,6 +4774,7 @@ void IEC101_SectionWrite(IEC101_DEF *pt101,u8 *ps)			//确
 		m_dstsection=section;
 		if(mmd_changesection(section)==M_JUMP0)	cot =0x07;
 	}	
+	#endif
 	//组织报文
 	pd=g_arrIECBuf;	
 	num=0;
@@ -4780,6 +4782,7 @@ void IEC101_SectionWrite(IEC101_DEF *pt101,u8 *ps)			//确
 	pd[num++]=0;				//信息体地址
 	pd[num++]=ps[0];                    //当前定值区
 	pd[num++]=ps[1];                    //当前定值区
+	cot = (ps[0]+(ps[1]<<8)) ? 0x47:0x07;	// 定值区为0,肯定应答,其他否定应答
 	IEC101_Asdu_Add(pt101,g_arrIECBuf,num,1,cot,200,FRAME_I);//
 	
 }

+ 4 - 2
dtu/dtu_main_t536/app/IEC104.c

@@ -4124,8 +4124,9 @@ void IEC104_setion_chg_msg(IEC104_DEF *pt104,u8 *ps)
 void IEC104_SectionWrite(IEC104_DEF *pt104,u8 *ps)			//确认帧
 {
 	BYTE *pd=&pt104->arrSendBuf[6];  //从第7个字节开始
-	BYTE cot;	// 定值区为0,肯定应答,其他否定应答
+	BYTE cot = (ps[0]+(ps[1]<<8)) ? 0x47:0x07;	// 定值区为0,肯定应答,其他否定应答
 	int num=0;
+	#if 0 // TODO 定值区处理 EWen
 	WORD section;
 	if(pRunSet->wEquTypeManager) IEC104_setion_chg_msg(pt104,ps);
 	section=ps[0]+(ps[1]<<8);	  // 定值区号
@@ -4134,7 +4135,8 @@ void IEC104_SectionWrite(IEC104_DEF *pt104,u8 *ps)			//确
 	{
 		m_dstsection=section;
 		if(mmd_changesection(section)==M_JUMP0)	cot =0x07;
-	}		
+	}	
+	#endif	
 	pd[num++]=200;		//总召唤确认帧	  1   1
 	pd[num++]=1;		//可变结构限定词  2
 	pd[num++]=cot;			//传送原因: 否定应答

+ 335 - 596
dtu/dtu_main_t536/app/LcdComm.c

@@ -41,11 +41,16 @@ LCD_COMM_DEF g_tLcdComm; // 
 DWORD dHMIDiStatus = 0Xffffffff;
 u8 *hzk_table;
 static u8 hmi_update=0;
-int g_hmi_type;
+
 u8 lcd_dot_type;		// 显示点阵显示类型
 int hzk_num;			// 汉字库中汉字个数
 int hzk_change_type;	// 当前切换的汉字库类型
-uint32_t lcd_comm_delay=0;	// 面板通讯超时
+unsigned long lcd_comm_delay=0;	// 面板通讯超时
+int g_hzk_table_flag = 0;   	//0表示使用主板的汉字库,1表示使用面板的汉字库
+
+char m_TzCount[12];
+char m_HzCount[12];
+
 
 /*------------------------------ 函数声明 -------------------------------------
 */
@@ -58,194 +63,16 @@ static void _hmi_comm_recv(BYTE *ps);
 static void _hmi_comm_send(void);
 void _hmi_uart_send(void);
 static void _send_inst(void);
-static int  _send_continue_datas(void);
-static void _send_dot_datas(void);
-
+static void _send_continue_datas(void);
+static void _get_hz_dot(char *hzdot,const char *hzk);
+static int _hmi_changehzk(u8 type);
 
 /*------------------------------ 外部函数 -------------------------------------
 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
 */
-void mainImage_Init(void)
-{
-	u32 len;
-	u8 *buf;
-	struct file * pfile;
-	loff_t pos;
-
-	g_tLcdComm.tImage.pBuf=NULL;
-	// 打开文件
-	pfile = rt_file_open("/app/data/mainImage.lcd",O_RDONLY ,0);
-	if(IS_ERR(pfile))
-	{
-		//rt_printf("\r\n打开 app/data/mainImage.lcd 失败\r\n");
-		return ;
-	}
-	// 得到文件长度
-	len = rt_file_getfile_size(pfile);
-	if(len <= 0)
-	{
-		rt_file_close(pfile,0);
-		return ;
-	}
-	
-	// 分配内存
-	buf = rt_malloc(len);
-	if((buf) == NULL)
-	{
-		rt_printf("\r\n分配mainImage.lcd内存失败\r\n");
-		rt_file_close(pfile,0);
-		return ; 	
-	}
-
-	// 读出内容
-	pos = 0;
-	if(rt_file_read(pfile,buf,len,&pos) != len)
-	{
-		rt_file_close(pfile,0);
-		rt_free(buf);
-		return ;
-	}
-	// 关闭文件
-	rt_file_close(pfile,0);
-	g_tLcdComm.tImage.pBuf=buf;
-
-	{ // 获取主接线图的内容
-
-		WORD num;
-		int i;
-		D_UNIT_DEF tUnit;
-		YC_UNIT_DEF tYc;
-		MAIN_IMAGE_DEF *pm=&g_tLcdComm.tImage;
-		BYTE *pd=buf;//主接线图的位置
-		
-		pm->sYxNum=0;
-		pm->sYcNum=0;
-		
-		pm->sImageX=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-		pm->sImageY=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-		pm->lnImageAddr=pd[0]+((DWORD)pd[1]<<8)+((DWORD)pd[2]<<16)+((DWORD)pd[3]<<24);pd+=4;
-		
-		num=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-		for(i=0;i<num;i++)  //器件初始化
-		{
-			tUnit.sx=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-			tUnit.sy=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-			tUnit.yx_di=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-			tUnit.yx_attrib=pd[0];pd+=2;
-			tUnit.yx_value=0;
-			pd+=4;	// 遥控点号	
-			tUnit.addr_close=pd[0]+((DWORD)pd[1]<<8)+((DWORD)pd[2]<<16)+((DWORD)pd[3]<<24);pd+=4;
-			tUnit.addr_open=pd[0]+((DWORD)pd[1]<<8)+((DWORD)pd[2]<<16)+((DWORD)pd[3]<<24);pd+=4;
-			tUnit.addr_third=pd[0]+((DWORD)pd[1]<<8)+((DWORD)pd[2]<<16)+((DWORD)pd[3]<<24);pd+=4;
-			pm->tYxUnits[pm->sYxNum++]=tUnit;
-			if(pm->sYxNum>=MAX_YX_UNITS)return ;
-		}
-		num=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-		for(i=0;i<num;i++)
-		{
-			tYc.sx=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-			tYc.sy=pd[0]+((WORD)pd[1]<<8);pd+=2;	
-			tYc.yc_di=pd[0]+((WORD)pd[1]<<8);pd+=2;
-			{
-				int j;
-				BYTE *p=tYc.fmtstr;
-				for(j=0;j<32;j++)
-				{
-					*p++=*pd++;
-				}
-				*p='\0';
-			}
-			pm->tYcUnits[pm->sYcNum++]=tYc;
-			if(pm->sYcNum>=MAX_YC_UNITS)return ;
-		}
-	}
-
-	m_LockIcon[0]=' ';
-	m_LockIcon[1]='\0';	
-}
-
-int mainimage_exit(void)
-{
-	if(g_tLcdComm.tImage.pBuf!=NULL)
-	{
-		rt_free(g_tLcdComm.tImage.pBuf);
-	}
-	return 0;
-}
-
-void lcd_DrawImage(short x,short y,BYTE *ps,unsigned char mode)	//画图标,index为索引值,与按键的属性定义一致
-{
-	int h,w,head;
-	short width,height,num;			//点阵高
-	BYTE *pd;
-	DOT_DATA_BUF_DEF *pdot=&g_tLcdComm.tDot;
-
-	width=(ps[1]<<8)+ps[0];
-	height=(ps[3]<<8)+ps[2];	
-	if(width>SCREENWIDTH||height>SCREENHEIGHT||(x<0||x>SCREENWIDTH)||(y<0||y>SCREENHEIGHT))
-	{
-		rt_printf("\r\n image error !width=%d height=%d",width,height);
-		return;
-	}
-	head=pdot->head;
-	pd=pdot->dot[head].dat;
-	num=0;
-	ps+=4;
-
-	pdot->dot[head].x=x;
-	pdot->dot[head].y=y;
-	pdot->dot[head].w=width;
-	pdot->dot[head].mode=mode;
-	pdot->dot[head].ex=x;	
-
-	for(h=0;h<height;h++)
-	{
-		for(w=0;w<width/8;w++)
-		{
-
-
-			pd[num++]=*ps++;
-			if(num>=230)
-			{
-				bool bline;// 换行
-				pdot->dot[head].num=num;
-				pdot->head++;
-				pdot->head&=LCD_MAX_DOT_MASK;
-				if(pdot->head==pdot->tail) /*缓冲区满了*/
-				{
-					pdot->tail++;
-					pdot->tail&=LCD_MAX_DOT_MASK;
-				}
-				head=pdot->head;
-				pd=pdot->dot[head].dat;
-				bline=((w+1)>=width/8)?true:false;
-
-				pdot->dot[head].x=x;
-				pdot->dot[head].y=(bline)?(h+1):h;
-				pdot->dot[head].w=width;
-				pdot->dot[head].mode=mode;
-				pdot->dot[head].ex=(bline)?x:(x+(w+1)*8);
-				num=0;
-			}
-		}
-
-	}
-	
-	if(num>0)
-	{
-		pdot->dot[head].num=num;
-		pdot->head++;
-		pdot->head&=LCD_MAX_DOT_MASK;
-		if(pdot->head==pdot->tail) /*缓冲区满了*/
-		{
-			pdot->tail++;
-			pdot->tail&=LCD_MAX_DOT_MASK;
-		}
-	}
-}
 
 /**************************************************************************
-函数名称:lcdcomm_init
+函数名称:InitLcdComm
 函数版本:1.00 
 作者:   
 创建日期:2008.9.1     
@@ -262,62 +89,34 @@ void lcd_DrawImage(short x,short y,BYTE *ps,unsigned char mode)	//
 修改原因:
 ***************************************************************************/
 
-void lcdcomm_init(void)
+void InitLcdComm(void)
 {
+	int ret;
 	memset((BYTE *)&g_tLcdComm,0,sizeof(g_tLcdComm));
 	memset((BYTE *)&g_tUartHMI,0,sizeof(g_tUartHMI));
-	led_init_hmi();
-	mainImage_Init();  //主接线图初始化
-	mmd_menu_cfg_init();
-	mmi_ScreenInit();	
+
+	// mmd_menu_cfg_init();
+
 	g_tLcdComm.tInit.flag=true;
 	g_tLcdComm.bRecv=true;
-	g_tLcdComm.bCall = true;
-	lcd_comm_delay = ustimer_get_origin();
-	g_dw_led[0]=0;
-	g_dw_led[1]=0;
-	g_dw_ledsave[0]=0;  		//  灯状态
-	g_dw_ledsave[1]=0;  		//  灯状态
-	// 通过面板配置灯,获取灯的状态,使用脉宽==0 黄  ==1 绿 ==2 红 通道0 ==0x55(85) 六键 管理板,其他默认6键控制单元
+	if(g_hzk_table_flag==0)
 	{
-		u32 slot;
-		// 检查状态板是否配置
-		slot = equ_get_slot_by_type(BOARD_TYPE_LCD_16LED);
-		if(slot ==0)
+		ret = hzk_read_file();
+		if (ret != 0)
 		{
-			slot = equ_get_slot_by_type(BOARD_TYPE_LCD_24LED);
-			
-			if(slot==0)     //jack.liu 2020 增加26个灯灯板定义
-			   slot = equ_get_slot_by_type(BOARD_TYPE_LCD_26LED);	
+			rt_err_set(ERR_CODE_HZK,0);
+			rt_file_del("/app/data/hzk.bin");
+			rt_printf("汉字库文件错误: %d\r\n", ret);
 		}
-		if(slot >0)
+		else
 		{
-			int i;
-			u8 index;
-			struct equ_config_do *ecd;
-			ecd = g_equ_config_do;
-			for(i=0;i<g_equ_config->do_num;i++)
-			{
-				if(ecd[i].slot== slot)
-				{
-					 index=ecd[i].index;
-					if(index>=LCD_MAX_LED)continue;
-					g_tLcdComm.tInit.para[index]=(BYTE)ecd[i].time_pulse;
-				}
-			}	
-			#ifndef DISP_SET_67KEY
-			if(g_tLcdComm.tInit.para[0]==200)
-			{
-				g_tScreen.lcd_type=LCD_TYPE_6KEY;
-			}
-			else if(g_tLcdComm.tInit.para[0]==10||g_tLcdComm.tInit.para[0]==11||g_tLcdComm.tInit.para[0]==12)  // 9键定义 10 黄 11绿 12 红
-			{
-				g_tLcdComm.tInit.para[0]-=10;
-				g_tScreen.lcd_type=LCD_TYPE_160_KEY9;
-			}
-			#endif
+			hzk_change_type = LCD_HP;
 		}
 	}
+	g_tLcdComm.dWaitT=dTCounter;
+	g_tLcdComm.bVirLcd=false;
+	g_tLcdComm.bCall = true;
+	lcd_comm_delay = ustimer_get_origin();
 }
 
 /**************************************************************************
@@ -339,6 +138,10 @@ void lcdcomm_init(void)
 ***************************************************************************/
 void HMI_Comm_App(void)  /*10毫秒调用一次*/
 {
+	// 字库初始化失败且使用本地字库模式时不进入处理
+	if(hzk_table == NULL && g_hzk_table_flag ==0)
+		return;
+
 	#if 1
 	//正在升级面板程序
 	if(is_down_program())
@@ -364,9 +167,8 @@ void HMI_Comm_App(void)  /*10
 
 	//内置GPRS拨号时有时候占用资源比较多,所以调整为15秒比较保险 
 	if ((g_tUartHMI.r_head == g_tUartHMI.r_tail)
-		&& (ustimer_get_duration(lcd_comm_delay) > 5*USTIMER_SEC))// 
+		&& (ustimer_get_duration(lcd_comm_delay) > 15*USTIMER_SEC))//3s
  	{
- 		static bool b_first=false;
 		g_tLcdComm.tInit.flag=true;
 		g_tLcdComm.b_init_OK = false;
 		if(!soe_check(EV_HMIERR))
@@ -374,46 +176,6 @@ void HMI_Comm_App(void)  /*10
 			//soe_record_ev(EV_HMIERR, 1, 0,0,0 ); 
 		}
 		
-		if(!b_first)
-		{
-			int i;
-			b_first = true;
-	
-			for(i=0;i<CFG_UART_NUM_MAX;i++)
-			{
-				// 如果硬件通道不存在,跳过
-				if(UART_CHANNEL[i]<0)continue;
-	#ifndef CFG_UART_232_DEBUG_TO_COMM	
-				// 如果此串口不是系统控制台串口,协议也不是空闲,初始化串口
-				if(UART_CHANNEL[i] != g_con_uart_index && tRunPara.tUartPara[i].wProtocol != PROTOCOL_IDLE)
-	#else
-				if(tRunPara.tUartPara[i].wProtocol != PROTOCOL_IDLE)
-	#endif
-				{	
-					if(tRunPara.tUartPara[i].wProtocol == PROTOCOL_HMI)  // 面板规约
-					{
-						int ret;
-						ret = uart_open(UART_CHANNEL[i],tRunPara.tUartPara[i].dBaud,tRunPara.tUartPara[i].wParity);
-						if (ret < 0) {
-							printf("%s: outside uart %d open failed!\n", __FUNCTION__, UART_CHANNEL[i]);
-						}
-						
-						RS_Ena_Init(i);
-						RS_Recv_Enable(i);
-						g_h_boj[0].fd = UART_CHANNEL[i];
-						user_conf_init(); //用户配置初始化(面板)
-				#ifdef CPU_FUXI
-						uart_isr_thread_create(i);
-				#endif
-
-						lcdcomm_init();
-					}
-					
-				}
-				
-			}
-		}
-
  		lcd_comm_delay = ustimer_get_origin();
 	}
 
@@ -422,10 +184,9 @@ void HMI_Comm_App(void)  /*10
 		_hmi_comm_recv(g_tUartHMI.r_buf[g_tUartHMI.r_tail]);	
 		g_tUartHMI.r_tail = (g_tUartHMI.r_tail + 1) & (UART_FRAME_MAXCNT - 1);
 		lcd_comm_delay = ustimer_get_origin();
-		g_tLcdComm.bRecv=true;
 	}
 
-	_hmi_comm_send();	
+	_hmi_comm_send();
 	#endif
 }
 
@@ -452,41 +213,17 @@ void Add_Continue_Data(BYTE x,BYTE y,BYTE *pdat,BYTE len,BYTE mode)
 	CONTINUE_DATA_BUF_DEF *ptBuf=&g_tLcdComm.tContinue;
 	CONTINUE_DATA_DEF *pt=&ptBuf->tBuf[ptBuf->head];
 	BYTE cnt;
+	BYTE attrib;
 	
 	pt->x=x;	
 	pt->y=y;
-
-	if(g_tScreen.lcd_type==LCD_TYPE_160160)
-	{
-		if(x+len>20)
-		{
-			len=20-x;
-		}
-	}
-	else if(g_tScreen.lcd_type==LCD_TYPE_128128||g_tScreen.lcd_type==LCD_TYPE_12864)
-	{
-		if(x+len>16)
-		{
-			len=16-x;
-		}
-
-	}	
-	else if(g_tScreen.lcd_type==LCD_TYPE_12232)
-	{
-		if(x+len>15)
-		{
-			len=15-x;
-		}
-	}	
 	pt->attrib=len;
+	attrib=0;
 	if(mode==1)	
 	{
 		pt->attrib|=0x80;
+		attrib=1;  //显示属性
 	}	
-	else if(mode==2)
-	{
-		pt->attrib|=0x40;
-	}
 	for(cnt=0;cnt<len;cnt++) // 汉字处理
 	{
 		pt->dat[cnt]=*pdat;
@@ -529,8 +266,6 @@ void Add_Clear_Screen(void)  //mmidrv.c  
 
 	// 字从首字开始
 	pt->tContinue.index=0;
-	memset(pt->lcdbuf,0,sizeof(pt->lcdbuf));
-	memset(pt->lcdattrib,0,sizeof(pt->lcdattrib));
 }
 
 /**************************************************************************
@@ -809,14 +544,6 @@ static void _add_inst_frame(BYTE cmd,BYTE *para,BYTE len)  //len为
 
 }
 
-void HMI_add_inst_frame(BYTE cmd,BYTE *para,BYTE len)  
-{
-	_add_inst_frame(cmd,para, len) ;
-}
-
-
-
-#if 0  // 转换汉字库点阵,stc3100是正序纵显 ,(标准字库是正序横显)
 static void _get_hz_dot(char *hzdot,const char *hzk)   
 {
 	int i;
@@ -826,6 +553,8 @@ static void _get_hz_dot(char *hzdot,const char *hzk)
 		hzdot[i]=hzk[i];
 	}	
 
+	#if 0  // 转换汉字库点阵,stc3100是正序纵显 ,(标准字库是正序横显)
+
 	for(m=0;m<8;m++)
 	{	
 		BYTE dat0=0;
@@ -844,8 +573,8 @@ static void _get_hz_dot(char *hzdot,const char *hzk)
 		hzdot[m+16]=dat2;
 		hzdot[m+24]=dat3;
 	}
+	#endif
 }
-#endif
 /**************************************************************************
 函数名称:HMI_Call
 函数版本:1.00 
@@ -881,83 +610,26 @@ static void _hmi_call(void)
 	}
 }
 
-#ifdef GD_TEST_2021  // 处理复归按键
-void lcd_FG_key(BYTE cmd,BYTE key)
-{
-	static DWORD dTKeyRst=0;	
-	static DWORD dTNoKey=0;
-	static BYTE oldkey=NO_KEY;
-	key&=KE_KEY_MASK;
-
-	if(cmd==DRV_CMD_KEY&&key==HA_KEY_RST)
-	{
-		if(dTCounter-dTKeyRst>pRunSet->resReuseFuncFilterTime*T_1s)  //复归按键满足防抖要求
-		{
-			if(key != oldkey)
-			{
-				oldkey=key;
-				// ResetHzLed(0);
-				// SignalReset(0,true);
-				if(pRunSet->resReuseFuncSelect == 1) //解锁
-				{
-					g_run_stu.rmtjs=true;
-					rt_printf("装置解锁\r\n");
-				}
-				else if(pRunSet->resReuseFuncSelect == 2)  //复位
-				{
-					rt_printf("装置复位\r\n");
-					watchdog_reset_cpu(2);	//装置复位
-				}
-			}
-			dTKeyRst=dTCounter;
-		}
-		dTNoKey=dTCounter;
-	}
-	else
-	{
-		if(dTCounter-dTNoKey>T_500ms)
-		{
-			dTKeyRst=dTCounter;
-			oldkey=NO_KEY;
-		}
-	}
-}
-#endif
-
 /**************************************************************************
 函数名称:Put_Key
 函数版本:1.00 
 作者:   
 创建日期:2008.9.1     
-
 函数功能说明:将通信来的按键值放入缓冲中
 输入参数:
 输出参数:
 返回值:
+
 更新信息:
 更新日志1:
 日期:	  
 修改者:	  
 修改内容:  
-修改原因: 
+修改原因:
 ***************************************************************************/
-static void _put_key(BYTE lnkey)
+static void _put_key(BYTE key)
 {
 	LCD_KEY_DEF *pt=&g_tLcdComm.tKey;
-	BYTE key=lnkey;
-	if(g_tScreen.lcd_type==LCD_TYPE_6KEY) //老版本按键,ESC和ENTER键互换
-	{
-		key&=KE_KEY_MASK;
-		if(key==HA_KEY_ENTER)
-		{
-			key=HA_KEY_ESC;
-		}
-		if(key==HA_KEY_ESC)
-		{
-			key=HA_KEY_ENTER;
-		}
-		key|=(lnkey&(~KE_KEY_MASK));
-	}	
 	pt->keybuf[pt->head]=key;
 	pt->head++;
 	pt->head&=LCD_KEY_MASK;
@@ -966,10 +638,22 @@ static void _put_key(BYTE lnkey)
 		pt->tail++;
 		pt->tail&=LCD_KEY_MASK;
 	}
+	#if 0
+	switch(key&~KE_KEY_LONG_BIT)
+	{
+
+		case 1:rt_printf("确认键");break;
+		case 2:rt_printf("ESC键");break;
+		case 3:rt_printf("UP键");break;
+		case 4:rt_printf("DOWN键");break;
+		case 5:rt_printf("LEFT键");break;
+		case 6:rt_printf("RIGHT键");break;
+		case 7:rt_printf("ADD键");break;
+		case 8:rt_printf("SUB键");break;
 
-	g_tLcdComm.tLight.light=LIGHT_ON;
-	g_tLcdComm.tLight.flag=true;
-	g_tScreen.lnLightTime=dTCounter;	
+		case 9:rt_printf("控制面板复归信号产生。\r\n");break;
+	}
+	#endif
 	
 }
 
@@ -994,21 +678,46 @@ static void _hmi_comm_recv(BYTE *ps)
 {
 	BYTE *pd=ps;
 	int offset=0;
-
-	g_tLcdComm.b_init_OK=true;
+	
 	switch(pd[4+offset]&0x1f)
 	{
 		case DRV_CMD_POWERON:  //上电报文
 		{
+			int ret;
 			if(pd[5+offset]==1)//上电初始化报文
 			{
 				g_tLcdComm.tInit.flag=true;
+				query_page_other_proc();
+			}
+			else
+			{
+				g_tLcdComm.b_init_OK=true;
+				rt_printf("g_tLcdComm.b_init_OK\r\n");
+			}
+
+			// 获取面板类型,并初使化菜单和LED
+			g_hmi_type = pd[7+offset];		
+
+			// 初始化之前先释放可能存在的内存,因为面板可能会重新初使化
+			menudesc_exit();
+			led_exit();
+			ret = menudesc_init(g_hmi_type);			
+			if (ret == 0)
+			{
+				hmi_update = 1;
 			}
 			else
 			{
-				g_tLcdComm.bClrScreen=true;
+				rt_printf("菜单初始化结果=%d\r\n", ret);
 			}
 			
+			
+			if(g_hzk_table_flag==0)
+			{	
+				// 获取液晶点阵类型,并转换字库
+				lcd_dot_type = pd[8+offset];
+				_hmi_changehzk(lcd_dot_type);
+			}
 		}
 		break;
 		case DRV_CMD_KEY:  //按键报文
@@ -1044,10 +753,6 @@ static void _hmi_comm_recv(BYTE *ps)
 		default:
 		break;
 	}
-
-#ifdef GD_TEST_2021  // 处理复归按键
-	lcd_FG_key((pd[4+offset]&0x1f),pd[5+offset]);
-#endif	
 }
 
 /**************************************************************************
@@ -1069,27 +774,40 @@ static void _hmi_comm_recv(BYTE *ps)
 ***************************************************************************/
 static void _hmi_comm_send(void)
 {
-	static uint32_t us_call=0;
-	static uint32_t us_lcdtest=0;
-	static uint32_t us_ledtest=0;
-	static uint32_t us_menu=0;
-	static uint32_t us_send=0;
-
+	static unsigned long us0=0;
+	static unsigned long us_lcdtest=0;
+	static unsigned long us_ledtest=0;
 	LCD_COMM_DEF *pt=&g_tLcdComm;
 
-	//pt->ReSend=0;
-	if(pt->tInit.flag)  //需初始化lcd
+	if (pt->bCall)
 	{
+		us0 = ustimer_get_origin();
+		pt->bCall = FALSE;
+	}
+
+	// 确保菜单初始化后才进行菜单操作,
+	// 确保接收完成才进行下一帧,以避免显示内容乱
+	if (hmi_update)
+	{
+		key_hmi_app();
+		menu_disp();	
+	}
+
+
+	pt->ReSend=0;
+	pt->dWaitT=dTCounter;	
+	if(pt->tInit.flag&&(!pt->bVirLcd))  //需初始化lcd
+	{
+		pt->tContinue.head=pt->tContinue.tail=0;
 		pt->tInstBuf.head=pt->tInstBuf.tail=0;
-		Add_Clear_Screen();		
 		pt->tLight.light=LIGHT_ON;
-		_add_inst_frame(HMI_CMD_INIT_LCD,pt->tInit.para,LCD_MAX_LED);  		//初始化lcd
+		_add_inst_frame(HMI_CMD_INIT_LCD,pt->tInit.para,10);  		//初始化lcd
 		_add_inst_frame(HMI_CMD_CLEAR_SCREEN,(void *)0,0);          //清屏
 		_add_inst_frame(HMI_CMD_BLIGHT,&pt->tLight.light,1);          	//点亮背光		
+		
 		pt->tInit.flag=false;
 		pt->tLight.flag=false;
 		pt->bClrScreen=false;
-		pt->bFreshLed=true;
 		hmi_update = 0;
 	}
 	else
@@ -1097,7 +815,7 @@ static void _hmi_comm_send(void)
 		if(pt->bClrScreen)  //需初始化lcd
 		{
 			_add_inst_frame(HMI_CMD_CLEAR_SCREEN,(void *)0,0);          //清屏
-			//reset_update_flag();
+			reset_update_flag();
 			pt->bClrScreen=false;
 		}
 		if(pt->tLight.flag)
@@ -1106,7 +824,6 @@ static void _hmi_comm_send(void)
 			pt->tLight.flag=false;
 			
 		}
-
 		if(pt->bTestLed && (!pt->bLcdUpdate))						
 		{
 			_add_inst_frame(HMI_CMD_LEDRUN,(void *)0,0);          //led测试
@@ -1128,7 +845,7 @@ static void _hmi_comm_send(void)
 		}
 		if(pt->bTestLcd && (!pt->bLedUpdate))						
 		{
-			_add_inst_frame(HMI_CMD_TESTLCD,(void *)0,0);          //lcd测试
+			_add_inst_frame(HMI_CMD_LCDRUN,(void *)0,0);          //lcd测试
 			
 			pt->bTestLcd=false;
 			pt->bLcdUpdate = true;
@@ -1139,7 +856,7 @@ static void _hmi_comm_send(void)
 		{
 			if (ustimer_get_duration(us_lcdtest) >= 3*USTIMER_SEC)
 			{
-				//reset_update_flag();
+				reset_update_flag();
 				pt->bLcdUpdate = false;
 			}
 			lcd_comm_delay = ustimer_get_origin();
@@ -1164,107 +881,37 @@ static void _hmi_comm_send(void)
 		// 1秒钟刷新一次LED
 		if (pt->b_init_OK)
 		{
-			static uint32_t us0_led;
-			u8 led_st[8];
-			int i;
-			if(ustimer_delay_origin2(&us0_led,USTIMER_SEC/8))
-			{
+			static unsigned long us0;
+			u8 led_st[4];
 
-				for(i=0;i<CFG_UART_NUM_MAX*2+CFG_ETH_NUM_MAX;i++)
-				{
-					if(g_run_stu.led[i])  // 232 1TX
-					{
-						led_set_pub(PUB_LED_232T1+i, LED_QUICK);	
-						g_run_stu.led[i]=0;
-					}
-				}				
-				if(g_bCommLed)
-				{
-					led_set_pub(PUB_LED_COMM, LED_QUICK);	
-					g_bCommLed=false;
-				}
-			
-				led_to_hmi();
-				if((g_dw_led[0]!=g_dw_ledsave[0])||(g_dw_led[1]!=g_dw_ledsave[1])||pt->bFreshLed)
-				{
-					led_st[0]=(BYTE)g_dw_led[0];          // 状态灯
-					led_st[1]=(BYTE)(g_dw_led[0]>>8);  // 状态灯高位
-					led_st[2]=(BYTE)(g_dw_led[0]>>16);  // 状态灯高位
-					led_st[3]=(BYTE)(g_dw_led[0]>>24);  // 状态灯高位
-					led_st[4]=(BYTE)g_dw_led[1];          // 状态灯
-					led_st[5]=(BYTE)(g_dw_led[1]>>8);  // 状态灯高位
-					led_st[6]=(BYTE)(g_dw_led[1]>>16);  // 状态灯高位
-					led_st[7]=(BYTE)(g_dw_led[1]>>24);  // 状态灯高位
-					_add_inst_frame(HMI_CMD_LED,led_st,8);          			//led点灯
-					g_dw_ledsave[0]=g_dw_led[0];
-					g_dw_ledsave[1]=g_dw_led[1];
-					pt->bFreshLed=false;					
-				}
-				for(i=0;i<CFG_UART_NUM_MAX*2+CFG_ETH_NUM_MAX;i++)
-				{
-					led_set_pub(PUB_LED_232T1+i, LED_OFF);	
-				}
-				led_set_pub(PUB_LED_COMM, LED_OFF);			
-				
-			}
-		}
-	}
-	if(!pt->bRecv)
-	{
-		if(ustimer_get_duration(us_send) >= USTIMER_SEC/2) // 发送接收超时0.5秒
-		{
-			if(pt->ReSend++>3) //重发3次 
+			if(ustimer_delay_origin2(&us0,USTIMER_SEC))
 			{
-				pt->tInit.flag=true;
-				pt->bRecv=true;
-				pt->ReSend=0;
-			}
-			else
-			{		
-				us_send= ustimer_get_origin();		
-				Sub_Uart_Frame(HMI_BOARD);
-				pt->bRecv=false;
+				led_to_hmi();
+				// zhl TODO g_dw_led有两个,暂时先用一个测试
+				led_st[0]=(BYTE)g_dw_led[0];          // 状态灯
+				led_st[1]=(BYTE)(g_dw_led[0]>>8);  // 状态灯高位
+				led_st[2]=(BYTE)(g_dw_led[0]>>16);  // 状态灯高位
+				led_st[3]=(BYTE)(g_dw_led[0]>>24);  // 状态灯高位
+				_add_inst_frame(HMI_CMD_LED,led_st,4);          			//led点灯
 			}
 		}
-		return;
 	}
-	pt->ReSend=0;
+
 	//组织报文
 	if(pt->tInstBuf.head!=pt->tInstBuf.tail)  //组织报文
 	{
-		_send_inst();
-		us_send= ustimer_get_origin();
-		pt->bRecv=false;
-
+		_send_inst();		
 	}
-	else if(pt->tDot.head!=pt->tDot.tail)  //组织报文
-	{
-		_send_dot_datas();
-		us_send= ustimer_get_origin();
-		pt->bRecv=false;
-	}	
 	else if(pt->tContinue.head!=pt->tContinue.tail)  //组织报文
 	{
-		if(_send_continue_datas()>0)
-		{
-			us_send= ustimer_get_origin();
-			pt->bRecv=false;
-		}
+		_send_continue_datas();
+		pt->bClrflag = false;
 	}	
-	else if(ustimer_get_duration(us_call) >= 200*USTIMER_MS) //无 发送数据,召唤
+	else if(pt->b_init_OK && (ustimer_get_duration(us0) >= 1*USTIMER_SEC)) //无 发送数据,召唤
 	{
-		_hmi_call();
-		us_call = ustimer_get_origin();
- 		us_send= ustimer_get_origin();
-		pt->bRecv=false;
-		pt->bCall = true;
-	}
-	else if(ustimer_get_duration(us_menu) >= 100*USTIMER_MS) // 无数据发送后再刷新菜单
-	{	
-		mmi_Menu_Task();
-		us_menu= ustimer_get_origin();
-	}
-	
+ 		_hmi_call();
+ 		pt->bCall = true;
+	}	
 }
 
 /**************************************************************************
@@ -1316,163 +963,255 @@ static void _send_inst(void)
 修改内容:  
 修改原因:
 ***************************************************************************/
-static int _send_continue_datas(void)
+#define HMI_V2
+#ifdef HMI_V2
+static void _send_continue_datas_0(void)
 {
-	int i,cnt;
-	BYTE num=0; 
+	int i;
+	BYTE num=0,cnt=0,bytenum=0; 
 //	BYTE checksum=0;
-	//BYTE *pd=g_tUartHMI.arrSendBuf;
+//	BYTE *pd=g_tUartHMI.arrSendBuf;
 	CONTINUE_DATA_BUF_DEF *ptBuf=&g_tLcdComm.tContinue; 	
 	BYTE srcbuf[UART_FRAME_LEN];
-	BYTE dstbuf[UART_FRAME_LEN];	
-	BYTE *pd=srcbuf+2;
-
-	//pd+=8+offset;	//报文长度+报文头+命令码+数据区个数,共8个字节,从第7个字节开始数据
+	BYTE dstbuf[UART_FRAME_LEN];
+	BYTE *pd=srcbuf+2;	
+//	pd+=10;	/*报文长度+报文头+命令码+数据区个数,共8个字节,从第7个字节开始数据*/
+	
 	while(ptBuf->head!=ptBuf->tail)
 	{
-		int len;
+		BYTE len;
 		CONTINUE_DATA_DEF *pt=&ptBuf->tBuf[ptBuf->tail];
-		WORD bufoffset;
-		BYTE attrib=0;
 		len=(pt->attrib&0x3f);
-		bufoffset=pt->x+(WORD)pt->y/4*20;
-		
-		if(pt->attrib&0x80)
-		{
-			attrib=((pt->attrib>>6)&0x03);
-		}
-		if((bufoffset+len)>=LCD_BUF_BYTES)
-		{
-			rt_printf("\r\n LCD BUF溢出!!!\r\n");
-			rt_printf("\r\n x=%d ,y=%d",pt->x,pt->y);
-			bufoffset=0;
-		}		
-		for(cnt=0;cnt<len;cnt++)
+		for(cnt=ptBuf->index;cnt<len;)
 		{
-			if(g_tLcdComm.lcdattrib[bufoffset]!=attrib)break;  // lcd 缓冲区数据不相等
-			if(pt->dat[cnt]>0x80)// 是汉字
+			BYTE *pdat=&pt->dat[cnt];
+			if(pdat[0]>0xa0&&pdat[1]>0xa0)  //是汉字
 			{
-				if(g_tLcdComm.lcdbuf[bufoffset]!=pt->dat[cnt]||g_tLcdComm.lcdbuf[bufoffset+1]!=pt->dat[cnt+1])break;  // lcd 缓冲区数据不相等
-				bufoffset++;
-				cnt++;
-			}
-			else
-			{
-				if(g_tLcdComm.lcdbuf[bufoffset]!=pt->dat[cnt])break;  // lcd 缓冲区数据不相等
+
+				BYTE FieldCode,BitCode;
+				BYTE hzdot[32];
+				DWORD addr;
+
+				FieldCode=pdat[0]-0xa1;	//wjw 区码
+				BitCode=pdat[1]-0xa1;	//wjw 位码
+				if(FieldCode>=15)		//15~19 ASCII码的位置
+				{
+					FieldCode-=4;
+				}
+				// 32:1个字所占的字节
+				// 区码:1个区有94个汉字,位码:即1个区中汉字的实际位置
+				addr=((DWORD)FieldCode*94+BitCode)*32;//wjw 计算出全字库的点阵地址
+				_get_hz_dot(hzdot,&hzk_table[addr]);
+				*pd++=pt->x+cnt*8;
+				*pd++=pt->y;
+				*pd++=(pt->attrib&0x80)+32;				
+				for(i=0;i<32;i++)
+				{
+					*pd++=hzdot[i];
+				}
+				num+=(32+3);
+				cnt+=2;
+				ptBuf->index+=2;
 			}
-			bufoffset++;
-		}
-		ptBuf->tail++;
-		ptBuf->tail&=LCD_MAX_CONTINUE_MASK;
-		if(cnt<len)
-		{
-			len-=cnt;
-			*pd++=(pt->x+cnt)*8;
-			*pd++=pt->y;
-			*pd++=len|(pt->attrib&0xc0);	
-			for(i=0;i<len;i++)
+			else 
 			{
-				*pd++=pt->dat[cnt];
-				g_tLcdComm.lcdbuf[bufoffset]=pt->dat[cnt];
-				g_tLcdComm.lcdattrib[bufoffset]=attrib;
-				bufoffset++;	
-				cnt++;
+				*pd++=pt->x+cnt*8;
+				*pd++=pt->y;
+				*pd++=(pt->attrib&0x80)+0x41;				
+				*pd++=pdat[0];
+				num+=(1+3);
+				cnt+=1;
+				ptBuf->index+=1;
 			}
-			num+=(3+len);
+			bytenum++;
 			if(num>200)break;
+		}		
+		if(cnt>=len)
+		{
+			ptBuf->tail++;
+			ptBuf->tail&=LCD_MAX_CONTINUE_MASK;
+			ptBuf->index=0;
 		}
-
+		if(num>200)break;
 	}	
-	if(num>0)
-	{
-		pd=srcbuf;
-		*pd++=HMI_CMD_WRITE_DATAS; //命令码	
-		*pd++=num; //数目
-		(void)protocol_packet(srcbuf, (int)(num+6),  MAIN_BOARD, HMI_BOARD, dstbuf);	
 
-		//添加到缓存区
-		Add_Uart_Frame(HMI_BOARD, (int)dstbuf[1] + 6, dstbuf);	
-	}
-	return num;
-}
+	pd=srcbuf;
+	*pd++=HMI_CMD_WRITE_DATAS; //命令码	
+	*pd++=bytenum; //数目
 
-/**************************************************************************
-函数名称:Send_dot_Datas
-函数版本:1.00 
-作者:   
-创建日期:2008.9.1     
-函数功能说明:主程序发送菜单数据命令
-输入参数:
-输出参数:
-返回值:
+	(void)protocol_packet(srcbuf, (int)num+2,  MAIN_BOARD, HMI_BOARD, dstbuf);	
 
-更新信息:
-更新日志1:
-日期:	  
-修改者:	  
-修改内容:  
-修改原因:
-***************************************************************************/
-static void _send_dot_datas(void)
+	//添加到缓存区
+	Add_Uart_Frame(HMI_BOARD, (int)dstbuf[1] + 6, dstbuf);	
+}
+
+static void _send_continue_datas_1(void)
 {
 	int i;
-	DOT_DATA_BUF_DEF *ptBuf=&g_tLcdComm.tDot; 	
+	BYTE num=0; 
+//	BYTE checksum=0;
+	//BYTE *pd=g_tUartHMI.arrSendBuf;
+	CONTINUE_DATA_BUF_DEF *ptBuf=&g_tLcdComm.tContinue; 	
+	int offset=0;//offend=0;
 	BYTE srcbuf[UART_FRAME_LEN];
 	BYTE dstbuf[UART_FRAME_LEN];	
 	BYTE *pd=srcbuf+2;
-	int num=0;;
 
+	//pd+=8+offset;	//报文长度+报文头+命令码+数据区个数,共8个字节,从第7个字节开始数据
 	while(ptBuf->head!=ptBuf->tail)
 	{
-		DOT_DATA_DEF *pt=&ptBuf->dot[ptBuf->tail];
-		ptBuf->tail++;
-		ptBuf->tail&=LCD_MAX_DOT_MASK;
-		
-		*pd++=(BYTE)pt->x;
-		*pd++=(BYTE)(pt->x>>8);
-		*pd++=(BYTE)pt->y;
-		*pd++=(BYTE)(pt->y>>8);
-
-		*pd++=(BYTE)pt->w;
-		*pd++=(BYTE)(pt->w>>8);
-
-		*pd++=(BYTE)pt->ex;
-		*pd++=(BYTE)(pt->ex>>8);
-		*pd++=pt->mode;
-		*pd++=pt->num;
-		for(i=0;i<pt->num;i++)
+		int len;
+		CONTINUE_DATA_DEF *pt=&ptBuf->tBuf[ptBuf->tail];
+
+		len=(pt->attrib&0x3f);
+		*pd++=pt->x;
+		*pd++=pt->y;
+		*pd++=pt->attrib;	
+		printf("ptBuf->tail=%d, x=%02x, y=%02x, attrib=%02x\n", 
+			ptBuf->tail, pt->x, pt->y, pt->attrib); // zhl TODO 打印
+		for(i=0;i<len;i++)
 		{
 			*pd++=pt->dat[i];
 		}
-		num+=pt->num+10;
-		if((num+ptBuf->dot[ptBuf->tail].num)>230)
-		{
-			break;
-		}
+		num+=(3+len);
+		ptBuf->tail++;
+		ptBuf->tail&=LCD_MAX_CONTINUE_MASK;
+		if(num>200)break;
+	}	
+
+	#if 0
+	pd=g_tUartHMI.arrSendBuf;
+	*pd++=0x68;
+	*pd++=num+6+offset;
+	*pd++=num+6+offset;
+	*pd++=0x68;	
+	*pd++=HMI_CMD_WRITE_DATAS; //命令码	
+	*pd++=num; //数目
+	//计算校验和
+	pd=&g_tUartHMI.arrSendBuf[4];
+	for(i=0;i<g_tUartHMI.arrSendBuf[1];i++)
+	{
+		checksum+=*pd++;
+	}	
+	*pd++=checksum;
+	#else
+	pd=srcbuf;
+	*pd++=HMI_CMD_WRITE_DATAS; //命令码	
+	*pd++=num; //数目
+	#endif
+	(void)protocol_packet(srcbuf, (int)(num+6+offset),  MAIN_BOARD, HMI_BOARD, dstbuf);	
+
+	//添加到缓存区
+	Add_Uart_Frame(HMI_BOARD, (int)dstbuf[1] + 6, dstbuf);	
+}
+static void _send_continue_datas(void)
+{
+	if(g_hzk_table_flag==0)
+	{
+		_send_continue_datas_0();
 	}
-	if(num>0)
+	else
 	{
-		pd=srcbuf;
-		*pd++=HMI_CMD_WRITE_DOTS; //命令码	
-		*pd++=num; //数目
-		(void)protocol_packet(srcbuf, (int)(num+6),  MAIN_BOARD, HMI_BOARD, dstbuf);	
-		//添加到缓存区
-		Add_Uart_Frame(HMI_BOARD, (int)dstbuf[1] + 6, dstbuf);	
+		_send_continue_datas_1();
 	}
+	
 }
 
+#else
+static void _send_continue_datas(void)
+{
+	int i;
+	BYTE num=0,cnt=0,bytenum=0; 
+//	BYTE checksum=0;
+//	BYTE *pd=g_tUartHMI.arrSendBuf;
+	CONTINUE_DATA_BUF_DEF *ptBuf=&g_tLcdComm.tContinue; 	
+	BYTE srcbuf[UART_FRAME_LEN];
+	BYTE dstbuf[UART_FRAME_LEN];
+	BYTE *pd=srcbuf+2;	
+//	pd+=10;	/*报文长度+报文头+命令码+数据区个数,共8个字节,从第7个字节开始数据*/
+	
+	while(ptBuf->head!=ptBuf->tail)
+	{
+		BYTE len;
+		CONTINUE_DATA_DEF *pt=&ptBuf->tBuf[ptBuf->tail];
+		len=(pt->attrib&0x3f);
+		for(cnt=ptBuf->index;cnt<len;)
+		{
+			BYTE *pdat=&pt->dat[cnt];
+			if(pdat[0]>0xa0&&pdat[1]>0xa0)  //是汉字
+			{
+
+				BYTE FieldCode,BitCode;
+				BYTE hzdot[32];
+				DWORD addr;
+
+				FieldCode=pdat[0]-0xa1;	//wjw 区码
+				BitCode=pdat[1]-0xa1;	//wjw 位码
+				if(FieldCode>=15)		//15~19 ASCII码的位置
+				{
+					FieldCode-=4;
+				}
+				// 32:1个字所占的字节
+				// 区码:1个区有94个汉字,位码:即1个区中汉字的实际位置
+				addr=((DWORD)FieldCode*94+BitCode)*32;//wjw 计算出全字库的点阵地址
+				_get_hz_dot(hzdot,&hzk_table[addr]);
+				*pd++=pt->x+cnt*8;
+				*pd++=pt->y;
+				*pd++=(pt->attrib&0x80)+32;				
+				for(i=0;i<32;i++)
+				{
+					*pd++=hzdot[i];
+				}
+				num+=(32+3);
+				cnt+=2;
+				ptBuf->index+=2;
+			}
+			else 
+			{
+				*pd++=pt->x+cnt*8;
+				*pd++=pt->y;
+				*pd++=(pt->attrib&0x80)+0x41;				
+				*pd++=pdat[0];
+				num+=(1+3);
+				cnt+=1;
+				ptBuf->index+=1;
+			}
+			bytenum++;
+			if(num>200)break;
+		}		
+		if(cnt>=len)
+		{
+			ptBuf->tail++;
+			ptBuf->tail&=LCD_MAX_CONTINUE_MASK;
+			ptBuf->index=0;
+		}
+		if(num>200)break;
+	}	
+
+	pd=srcbuf;
+	*pd++=HMI_CMD_WRITE_DATAS; //命令码	
+	*pd++=bytenum; //数目
+
+	(void)protocol_packet(srcbuf, (int)num+2,  MAIN_BOARD, HMI_BOARD, dstbuf);	
+
+	//添加到缓存区
+	Add_Uart_Frame(HMI_BOARD, (int)dstbuf[1] + 6, dstbuf);	
+
+}
+
+#endif
 
 /******************************************************************************
 函数名称:	_hmi_changehzk
 函数版本:	01.01
-创建作者:	xxxxxx
+创建作者:	钟务贵
 创建日期:	2015-07-16
 函数说明:	根据液晶点阵类型,转换字库,原始字库为横向正序
 参数说明:	type:液晶点阵类型
 返回值:  	无
 修改记录:	
 */
- int _hmi_changehzk(u8 type)
+static int _hmi_changehzk(u8 type)
 {
 	int i, j, k, n, ch, data_idx;
 	u8 hz[32], data[32];

+ 22 - 106
dtu/dtu_main_t536/app/LcdComm.h

@@ -53,10 +53,9 @@ enum
 #define SCREEN_ROWS           5    //屏幕的共多少行
 #define SCREEN_BYTES        (SCREEN_LINE_BYTES*SCREEN_ROWS)
 
-#define LCD_MAX_LED      32  // lcd 液晶面板最大灯个数
 /*按键定义*/
 #define HA_KEY_ENTER	1
-#define HA_KEY_ESC		2  // 老版本6键,ENTER=2 ESC=1
+#define HA_KEY_ESC		2
 #define HA_KEY_UP		3
 #define HA_KEY_DOWN		4
 #define HA_KEY_LEFT		5
@@ -64,19 +63,12 @@ enum
 #define HA_KEY_ADD		7
 #define HA_KEY_SUB		8
 #define HA_KEY_RST		9   //区号
-//2019-9
-#define HA_KEY_YUK		10
-#define HA_KEY_HZ		11
-#define HA_KEY_FZ		12
-
-
 
 #define NO_KEY          0xff
 #define KE_KEY_LONG_BIT	(0x80)
 
 #define KE_KEY_MASK  0x7f
 
-#define LCD_BUF_BYTES (160*160/8/4)
 
 /*hmi发来的命令*/
 #define HMI_CMD_POLL  				0x00 /*查询命令*/
@@ -84,19 +76,14 @@ enum
 #define HMI_CMD_CLEAR_SCREEN  		0x02/*清全屏*/
 #define HMI_CMD_WRITE_SINGLE		0x03/*写数据*/
 #define HMI_CMD_WRITE_DATAS			0x04/*写连续数据*/
-#define HMI_CMD_WRITE_DOTS			0x05/*写点阵数据*/
-
 #define HMI_CMD_BLIGHT				0x08/*背光控制*/
 #define HMI_CMD_LED  				0x09/*面板灯状态*/
-#define HMI_CMD_TESTLCD				0x0A/*对比度设置*/
+#define HMI_CMD_RATE  				0x0A/*对比度设置*/
 #define HMI_CMD_WIRELESS  			0x0B/*遥控器*/
 #define HMI_CMD_LEDRUN  			0x0C/*跑马灯*/
 #define HMI_CMD_LCDRUN  			0x0D/*LCD测试*/
 #define HMI_CMD_GPRS				0x0E  /*GPRS*/
 #define HMI_CMD_DOWN  				0x0F/*数据下载*/
-
-#define HMI_CMD_LINE				0x10/*划线*/
-
 #define HMI_CMD_RESPOND				0x20// 响应面板帧
 
 #define DRV_CMD_TEMP            	0x18 /*lcd驱动板上电报文*/
@@ -117,64 +104,21 @@ enum
 #define LCD_INTRUST_ADD 1
 #define LCD_INTRUST_SUB 0
 
-#define LCD_KEY_MASK 0x07
+// #define LCD_KEY_MASK 0x07
+#define LCD_KEY_MASK 0x7f						 // modify by zhy 20201103	增加按键缓存个数
 #define LCD_KEY_MAX (LCD_KEY_MASK+1)
 
 /*发给驱动板的指令缓冲区*/
-#define LCD_MAX_INST_MASK 0x07   //发给驱动板的指令最大缓冲个数
+// #define LCD_MAX_INST_MASK 0x07   //发给驱动板的指令最大缓冲个数
+#define LCD_MAX_INST_MASK 0x7f   				  //发给驱动板的指令最大缓冲个数		modify by zhy 20201103	增加缓存命令个数
 #define LCD_MAX_INST_BUFS (LCD_MAX_INST_MASK+1)   //发给驱动板的指令最大缓冲个数
 /*发给驱动板的数据定义*/
 #define LCD_MAX_CONTINUE_MASK   0x7f
 #define LCD_MAX_CONTINUE_BUFS   (LCD_MAX_CONTINUE_MASK+1)
 
-#define LCD_MAX_DOT_MASK   0x3f
-#define LCD_MAX_DOT_BUFS   (LCD_MAX_CONTINUE_MASK+1)
-
-
 #define	UART_FRAME_MAXCNT		8  //最大帧数
 /*------------------------------ 类型结构 -------------------------------------
 */
-
-/*******主界面图形定义******************/
-
-typedef struct  D_UNIT			//4 个字节 整个菜单信息,最大菜单号,域数统计,410
-{								//主要是为了出错处理
-	WORD  sx;
-	WORD  sy;
-	WORD  yx_di;
-	WORD  yx_attrib;
-	BYTE  yx_value;
-	//BYTE  yx_save;
-	DWORD   addr_close;
-	DWORD   addr_open;
-	DWORD   addr_third;
-}D_UNIT_DEF;
-
-typedef struct  YC_UNIT			//4 个字节 整个菜单信息,最大菜单号,域数统计,410
-{								//主要是为了出错处理
-	WORD  sx;
-	WORD  sy;
-	WORD  yc_di;
-	BYTE  fmtstr[34];
-}YC_UNIT_DEF;
-
-#define MAX_YX_UNITS 80
-#define MAX_YC_UNITS 80
-typedef struct  MainImage			//4 个字节 整个菜单信息,最大菜单号,域数统计,410
-{								//主要是为了出错处理
-	char *pBuf;
-	unsigned short  sImageX;
-	unsigned short  sImageY;
-	uint32_t   lnImageAddr;
-
-	unsigned short sYxNum;
-	unsigned short sYcNum;
-	D_UNIT_DEF  tYxUnits[MAX_YX_UNITS];
-	YC_UNIT_DEF  tYcUnits[MAX_YC_UNITS];
-} MAIN_IMAGE_DEF;
-
-
-
 typedef struct LCD_KEY
 {
 	BYTE tail;
@@ -214,41 +158,12 @@ typedef struct CONTINUE_DATA_BUF //
 	CONTINUE_DATA_DEF tBuf[LCD_MAX_CONTINUE_BUFS];
 }CONTINUE_DATA_BUF_DEF;
 
-
-typedef struct DOT_DATA_DEF  //连续数据结构
-{
-	short x;
-	short y;
-	short w;
-	short ex;
-	BYTE num;
-	BYTE mode;
-	BYTE dat[230];
-}DOT_DATA_DEF;
-
-
-typedef struct dot_DATA_BUF // 点阵数据
-{
-	BYTE tail;
-	BYTE head;
-	DOT_DATA_DEF  dot[LCD_MAX_DOT_BUFS];
-}DOT_DATA_BUF_DEF;
-
-
 /*初始化状态定义*/
 typedef struct INIT_DATA
-{
-	bool flag;
-	BYTE para[LCD_MAX_LED];
-}PARA_DEF;
-
-/*初始化状态定义*/
-typedef struct LINE_DATA
 {
 	bool flag;
 	BYTE para[10];
-}LINE_DEF;
-
+}INIT_DEF;
 
 /*背光灯状态缓冲区*/
 typedef struct LIGHT
@@ -272,30 +187,32 @@ typedef struct TELE
 typedef struct LCD_COMM
 {
 	bool bRecv;
+	BYTE wait;
 	BYTE ReSend;
 	bool bClrScreen;
+	bool bClrflag;
 	bool b_init_OK;
+	bool bVirLcd;
+	bool bErrComm;
 	bool bTestLed;
 	bool bTestLcd;
 	bool bTeleMatch;
 	bool bTeleClrMatch;
 	bool bLcdUpdate;
 	bool bLedUpdate;
-	bool bLock;
-	bool bFreshLed;
-	PARA_DEF tInit;
+	BYTE ExtraCommNo;	//外部通信端口
+	DWORD dwTemprate;
+	DWORD dWaitT;
+	INIT_DEF tInit;
 	LIGHT_DEF tLight;
 	LCDINTRUST_DEF tLcdIntrust;
 	LCD_INST_BUF_DEF tInstBuf;
 	CONTINUE_DATA_BUF_DEF  tContinue;
 	LCD_KEY_DEF tKey;	
 	TELE_DEF tTele;
-	bool bCall;	
-	bool bRefresh;
-	BYTE lcdbuf[LCD_BUF_BYTES];  //备份液晶显示缓冲区,在发送时判断,没有改变的不发送,提高刷新速断,高位代表刷新标志
-	BYTE lcdattrib[LCD_BUF_BYTES];  //备份液晶显示缓冲区,在发送时判断,没有改变的不发送,提高刷新速断,高位代表刷新标志
-	MAIN_IMAGE_DEF tImage;
-	DOT_DATA_BUF_DEF tDot;
+	bool bGps;
+	BYTE arrGpsData[64];
+	bool bCall;		
 }LCD_COMM_DEF;
 
 struct hmi
@@ -334,7 +251,9 @@ typedef struct UART_COMM
 extern DWORD dHMIDiStatus;
 extern LCD_COMM_DEF g_tLcdComm;
 extern UART_COMM g_tUartHMI;
-extern int g_hmi_type;
+
+extern char m_TzCount[12];
+extern char m_HzCount[12];
 
 /*------------------------------ 函数声明 -------------------------------------
 */
@@ -342,13 +261,10 @@ void Add_Continue_Data(BYTE x,BYTE y,BYTE *pdat,BYTE len,BYTE mode);
 void Add_Clear_Screen(void);
 void add_led_test(u8 test_no);
 BYTE  Get_Key(void);
-void lcdcomm_init(void);
+void InitLcdComm(void);
 void HMI_Comm_App(void);
 void HMI_Board_Recv(int len,BYTE *para);
 void add_rmt_pair(u8 pair);
 int hzk_exit(void);
-void HMI_add_inst_frame(BYTE cmd,BYTE *para,BYTE len)  ;
-void lcd_DrawImage(short x,short y,BYTE *pd,unsigned char model);	//画图标,index为索引值,与按键的属性定义一致
-int mainimage_exit(void);
 
 #endif

+ 3 - 3
dtu/dtu_main_t536/app/PDA_FILE.c

@@ -72,7 +72,7 @@ static void _PDA_file_state_reset(void);
 extern void pda_data_echo(BYTE cmd,BYTE sum,BYTE *para);
 int printf_filePDA(void);
 
-static const char * szPdaTool = "ZHFS PDA DTU TOOL V1.00.01";
+static const char * szPdaTool = "ZHOL PDA DTU TOOL V1.00.01";
 
 struct filePDA p_filePDA= {0};
 
@@ -116,7 +116,7 @@ int PDA_TransFile(PDA_COMM *pt,unsigned char *buf)
 			// 复位状态机
 			_PDA_file_state_reset();
 
-			sprintf(cmd_buf+2,"ZHFS " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
+			sprintf(cmd_buf+2,"ZHOL " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
 			cmd_len = strlen(cmd_buf+2)+1+2;
 			if(memcmp(buf+1,szPdaTool,20) != 0) // 具体版本号暂时不检查(匹配V1.XX.XX)
 			{
@@ -134,7 +134,7 @@ int PDA_TransFile(PDA_COMM *pt,unsigned char *buf)
 			// 复位状态机
 			_PDA_file_state_reset();
 			
-			sprintf(cmd_buf+2,"ZHFS " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
+			sprintf(cmd_buf+2,"ZHOL " EQUIP_NAME_STRING "版本号:V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF, VER_TIME "CRC:%04XH",m_CodeCrc);
 			cmd_len = strlen(cmd_buf+2)+1+2;
 			if(memcmp(buf+1,szPdaTool,20) != 0) // 具体版本号暂时不检查(匹配V1.XX.XX)
 			{

+ 24 - 1
dtu/dtu_main_t536/app/Sys.c

@@ -269,7 +269,7 @@ void SystemInit(void)
   #ifndef GW_AREA_MAIN_2021
 	FA_Init();	
 #endif
-	lcdcomm_init(); 
+	InitLcdComm();
 	ReadUqua();
 #ifndef GW_AREA_MAIN_2021
 	fa_g_init();
@@ -2637,6 +2637,29 @@ bool check_fault(void)
 	return false;	
 }
 
+void clear_tfd_fault(void)
+{
+	int sw;
+	for(sw=0;sw<g_sw_num;sw++)		
+	{
+		TRELAY_T *pR=&g_tRelay[sw];
+	
+		// 复归停复电逻辑
+		pR->uTFDDZ.bFlag.RE_Power = 0;
+		pR->uTFDDZ.bFlag.JH_PowerCut = 0;
+		pR->uTFDDZ.bFlag.GZ_PowerCut = 0;
+		pR->uTFDDZ.bFlag.JY_Fault = 0;
+		pR->uTFDDZ.bFlag.IS_Run= 0;
+		ResetTR(&pR->tGZ_Powercut_30s);
+		ResetTR(&pR->tJH_Powercut_30s);
+		ResetTR(&pR->tFDU_Powerrestore_30s);
+		ResetTR(&pR->tFDI_Powerrestore_30s);
+		ResetTR(&pR->tFDU_Charge_30s);
+		ResetTR(&pR->tFDI_Charge_30s);
+		ResetTR(&pR->tCharge_30s);
+	}
+	
+}
 
 /******************************************************************************
 函数名称:	_yk_polling

+ 28 - 0
dtu/dtu_main_t536/app/Sys.h

@@ -189,6 +189,33 @@ enum
 
 /*------------------------------ 类型结构 -------------------------------------
 */
+typedef struct EVENT_SHOW
+{
+	EVENT_STRUCT tEv;
+	BYTE   namestr[24];
+	BYTE   valuestr[24];
+	BYTE   str[8][24];
+	WORD wCurrent;
+	WORD wNumber;
+	WORD wIndex;
+	WORD year;
+	WORD month;
+	WORD day;
+	WORD hour;
+	WORD min;
+	WORD sec;
+	WORD ms;
+	short   sParaCur;
+	short   sParaNum;
+
+}EVENT_SHOW;
+
+typedef union SET_VALUE
+{
+	float ff;
+	uint32_t tt; // 注意64位的long为64位,32位系统为32位
+}SET_VALUE;
+
 typedef struct EQUIP_INF
 {
 	WORD wType;       	// 保护类型码    
@@ -297,6 +324,7 @@ char *get_comm_name(int index);
 char *get_yk_owner(u8 owner);
 int bat_begin_time(void);
 bool check_fault(void);
+void clear_tfd_fault(void);
 
 #ifdef FUNC_RESET_EQU
 extern bool gb_ResetEqu;

+ 1 - 1
dtu/dtu_main_t536/app/app.c

@@ -75,7 +75,7 @@ INIT_FUNC g_app_exit_func[]=
 	FA_exit,
 #endif
 	led_exit,
-	mainimage_exit,
+	menudesc_exit,
 	auth_exit, // sunxi 20191204 added
 	//pw_quality_exit,
 };

+ 412 - 0
dtu/dtu_main_t536/app/file_led.c

@@ -0,0 +1,412 @@
+/******************************************************************************
+版权所有:	珠海欧力配网自动化股份有限公司
+文件名称:	file_led.c
+文件版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020-03-13
+功能说明:	故障指示灯记忆文件
+其它说明:
+修改记录:
+*/
+/*------------------------------- 头文件 --------------------------------------
+*/
+#include "head.h"
+ 
+/*------------------------------- 宏定义 --------------------------------------
+*/
+
+
+/*------------------------------ 类型结构 -------------------------------------
+*/
+
+/*------------------------------ 全局变量 -------------------------------------
+*/
+u32 g_file_led_sign;
+struct file_led_res 		*g_file_led_read;	
+struct file_led_res 		g_file_led_write[SWITCH_NUM_MAX];	
+struct file 				*file_led_handle;				  // 故障LED状态bin文件句柄
+
+/*------------------------------ 局部变量 -------------------------------------
+*/
+// 文件CRC校验
+u16 g_crc_file_led_res;
+
+/*------------------------------ 函数声明 -------------------------------------
+*/
+static int _file_led_init(void);
+static int _file_led_creat(void);
+static int _file_led_write(void);
+
+/*------------------------------ 外部函数 -------------------------------------
+外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
+*/
+/******************************************************************************
+函数名称:	file_led_init
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	故障LED状态系统初始化
+参数说明:
+返回值:	
+	0:		成功
+	其它:	失败
+修改记录:	
+*/
+int file_led_init(void)
+{
+	int i;
+	unsigned long us,us0;
+
+	i = _file_led_init();
+	if (i != 0)
+	{
+		rt_printf("iret = %d\r\n", i);
+		rt_file_del("/app/data/file_led.bin");
+		us0 = ustimer_get_origin();
+		i = _file_led_creat();
+		us = ustimer_get_duration(us0);
+		rt_printf("初始化故障LED记录文件, ret=%d, 耗时 t=%dus\r\n", i, us);
+	}
+	return i;
+}
+
+
+/******************************************************************************
+函数名称:	_file_led_init
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	故障LED状态初始化调用
+参数说明:
+返回值:	
+	0:		成功
+	其它:	失败
+修改记录:	
+*/
+int _file_led_init(void)
+{
+	int j;
+	u32 len;
+	u8 *buf;
+	u8 *tmp;
+	struct file_led_res_head *brh;
+	loff_t pos;
+
+	// 打开文件
+	file_led_handle = rt_file_open("/app/data/file_led.bin",O_RDWR ,0655);
+	if(IS_ERR(file_led_handle))
+	{
+		return -1;
+	}
+
+	// 得到文件长度
+	// 得到文件长度
+	len = rt_file_getfile_size(file_led_handle);
+	if(len <= 0)
+	{
+		rt_file_close(file_led_handle,0);
+		return -1;
+	}
+	
+	// 分配内存
+	buf = rt_malloc(len);
+	if((buf) == NULL)
+	{
+		rt_file_close(file_led_handle,0);
+		return -2; 	
+	}
+
+	//保存原指针,便于以后释放内存
+	tmp = buf;
+	// 读出内容
+	pos = 0;
+	if(rt_file_read(file_led_handle,buf,len,&pos) != len)
+	{
+		rt_file_close(file_led_handle,0);
+		rt_free(buf);
+		return -3;
+	}
+
+	// 检查CRC
+	g_crc_file_led_res = CrcStr(buf,len-2);
+	if(g_crc_file_led_res != *(u16*)(buf+len-2))
+	{
+		rt_free(buf);
+		return -4;
+	}
+
+    // 检查文件签名
+	brh = (struct file_led_res_head*)buf;
+	if(brh->cfh.signature != SIG_FILE_LED_RES_FILE)
+	{
+		rt_free(buf);
+		return -5;
+	}
+
+	// rt_printf("运行到这里....file_led_addr=%d,file_led_num=%d\r\n",brh->file_led_addr,brh->file_led_num);
+	// 检查文件长度
+	if(len < sizeof(*brh) + brh->file_led_num*sizeof(struct file_led_res)+ 2)
+	{
+		rt_free(buf);
+		return -6; 	
+	}
+
+	// 文件头的长度写入了file_led_addr
+	g_file_led_read = (struct file_led_res *)(buf + brh->file_led_addr);
+
+	// 初始化故障LED状态结构体
+	memset(g_file_led_write,0,sizeof(g_file_led_write));
+
+	for(j=0;j<brh->file_led_num;j++)
+	{
+		g_file_led_write[j].led_hw=g_file_led_read[j].led_hw;
+		g_file_led_write[j].led_tw=g_file_led_read[j].led_tw;
+		g_file_led_write[j].led_gl=g_file_led_read[j].led_gl;
+		g_file_led_write[j].led_jd=g_file_led_read[j].led_jd;
+	}
+
+	buf = tmp;
+	//释放内存
+	rt_free(buf);
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	file_led_exit
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	故障LED状态文件句柄退出
+参数说明:
+返回值:	
+	0:		成功
+	其它:	失败
+修改记录:	
+*/
+int file_led_exit(void)
+{
+	// 清除文件指针
+	if(file_led_handle != 0)
+	{
+		rt_file_close(file_led_handle,0);
+		file_led_handle = 0;
+	}
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_file_led_creat
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	创建LED显示灯状态文件
+参数说明:
+返回值:	
+	0:		成功
+	其它:	失败
+修改记录:	
+*/
+int _file_led_creat(void)
+{
+	unsigned int i,file_length;
+	u16 crc16;
+	char *p;
+	loff_t pos;
+	int ret;
+	
+	struct file_led_res_head	fh;
+	struct file_led_res desc;
+
+	// 配置文件头
+	memset(&fh,0,sizeof(fh));
+	fh.cfh.signature = SIG_FILE_LED_RES_FILE;
+	fh.cfh.version = 0X01010101;
+
+	fh.file_led_addr = FILE_ADDR_ALGIN(sizeof(fh));
+	// 故障LED状态数据容量
+	fh.file_led_num = SWITCH_NUM_MAX;			
+
+	// 整个文件长度(文件头长度+数据长度)
+	file_length = FILE_ADDR_ALGIN(fh.file_led_addr + fh.file_led_num * sizeof(struct file_led_res));
+
+	// 分配并初始化空间
+	p = rt_malloc(file_length + 2); //加crc长度
+	if(!p)
+	{
+		return -1;
+	}
+	memset(p,0,file_length);
+
+	// 写入文件头
+	memcpy(p,(char *)&fh,sizeof(fh));
+	
+	// 写LED状态数据
+	for(i=0; i<fh.file_led_num; i++)
+	{
+		memset(&desc,0,sizeof(desc));
+		
+		desc.led_hw = g_file_led_write[i].led_hw;
+		desc.led_tw = g_file_led_write[i].led_tw;
+		desc.led_gl = g_file_led_write[i].led_gl;
+		// desc.led_gl = 2;
+		desc.led_jd = g_file_led_write[i].led_jd;
+	
+		memcpy(p + fh.file_led_addr + i*sizeof(desc), (char *)&desc, sizeof(desc));		
+	}
+
+	// 写入LED状态文件
+	file_led_handle = rt_file_open("/app/data/file_led.bin",O_CREAT|O_RDWR|O_TRUNC,0644);
+	if(IS_ERR(file_led_handle))
+	{
+		rt_free(p);
+		return -1;
+	}
+
+	// 计算CRC
+	crc16 = CrcStr(p,file_length);
+	memcpy(p+file_length,&crc16,2);
+	
+	pos = 0;
+	ret=rt_file_write(file_led_handle,p,file_length + 2,&pos);
+
+	// 打开文件句柄程序退出前不再关闭
+	// rt_file_close(file_led_handle,0);
+
+	rt_free(p);	
+	
+	rt_printf("led creat len=%d\r\n",ret);
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	file_led_write
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	记录LED显示灯状态
+参数说明:
+返回值:	
+			无
+修改记录:	
+*/
+void file_led_write(void)
+{
+	static unsigned long us0=0;
+	unsigned long us;
+		 
+	// 标志置位延时5秒处理一次
+	us = 5*USTIMER_SEC;
+	if(ustimer_delay_origin2(&us0,us) != 1)
+	{
+		return;
+	}
+	if (g_file_led_sign)
+	{
+		_file_led_write();
+		g_file_led_sign = 0;
+	}
+}
+
+/******************************************************************************
+函数名称:	_file_led_write
+函数版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020年3月20日
+函数说明:	写故障显示灯状态到LED状态文件
+参数说明:
+返回值:	
+	0:		成功
+	其它:	失败
+修改记录:	
+*/
+int _file_led_write(void)
+{
+	unsigned int i,file_length;
+	u16 crc16;
+	char *p;
+	loff_t pos;
+	unsigned int ret;
+	
+	struct file_led_res_head	fh;
+	struct file_led_res desc;
+
+	// 更新记录
+	if (file_led_handle ==0)
+	{
+		return -1;
+	}
+
+	// 配置文件头
+	memset(&fh,0,sizeof(fh));
+	fh.cfh.signature = SIG_FILE_LED_RES_FILE;
+	fh.cfh.version = 0X01010101;
+
+	fh.file_led_addr = FILE_ADDR_ALGIN(sizeof(fh));
+	// 故障LED状态数据容量
+	fh.file_led_num = SWITCH_NUM_MAX;			
+
+	// 整个文件长度(文件头长度+数据长度)
+	file_length = FILE_ADDR_ALGIN(fh.file_led_addr + fh.file_led_num * sizeof(struct file_led_res));
+
+	// 分配并初始化空间
+	p = rt_malloc(file_length + 2); //加crc长度
+	if(!p)
+	{
+		return -2;
+	}
+	memset(p,0,file_length);
+
+	// 写入文件头
+	memcpy(p,(char *)&fh,sizeof(fh));
+
+	// 写LED状态数据
+	for(i=0; i<fh.file_led_num; i++)
+	{
+		memset(&desc,0,sizeof(desc));
+		
+		desc.led_hw = g_file_led_write[i].led_hw;
+		desc.led_tw = g_file_led_write[i].led_tw;
+		desc.led_gl = g_file_led_write[i].led_gl;
+		desc.led_jd = g_file_led_write[i].led_jd;
+	
+		memcpy(p + fh.file_led_addr + i*sizeof(desc), (char *)&desc, sizeof(desc));		
+	}
+
+	// 计算CRC
+	crc16 = CrcStr(p,file_length);
+	memcpy(p+file_length,&crc16,2);
+	
+	pos = 0;
+	ret=rt_file_write(file_led_handle,p,file_length + 2,&pos);
+
+	if (ret != file_length + 2)
+	{
+		rt_free(p);	
+		rt_printf("led save error ret=%d\r\n",ret);
+		return -3;
+	}
+
+	rt_free(p);	
+	
+	rt_printf("led save len=%d\r\n",ret);
+
+	return 0;
+}
+
+/*------------------------------ 内部函数 -------------------------------------
+内部函数以下划线‘_’开头,不需要检查参数的合法性.
+*/
+
+
+/*------------------------------ 测试函数 -------------------------------------
+一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
+进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
+*/
+
+/*------------------------------ 文件结束 -------------------------------------
+*/
+
+

+ 61 - 0
dtu/dtu_main_t536/app/file_led.h

@@ -0,0 +1,61 @@
+/******************************************************************************
+版权所有:	珠海欧力配网自动化股份有限公司
+文件名称:	file_led.h
+文件版本:	01.00
+创建作者:	赵海洋
+创建日期:	2020-03-13
+功能说明:	故障指示灯记忆文件
+其它说明:
+修改记录:
+*/
+#ifndef _FILE_LED_H
+#define _FILE_LED_H
+/*------------------------------- 头文件 --------------------------------------
+*/
+
+
+/*------------------------------- 宏定义 --------------------------------------
+*/
+
+
+
+/*------------------------------ 类型结构 -------------------------------------
+*/
+// LED状态文件头
+struct file_led_res_head
+{
+	// 配置文件头
+	struct cfg_file_head cfh;	
+	// 板卡描述
+	u32	file_led_addr;		//起始地址
+	u32	file_led_num;		//存储总量
+	
+};
+
+// 已配置开关结构体
+struct file_led_res
+{
+	u8 led_hw;		// 开关合位
+	u8 led_tw;		// 开关分位
+	u8 led_gl;		// 保护过流
+	u8 led_jd;		// 保护接地
+};
+
+
+/*------------------------------ 函数声明 -------------------------------------
+*/
+
+extern struct file_led_res			g_file_led_write[SWITCH_NUM_MAX];
+extern u32 g_file_led_sign;
+
+int file_led_init(void);
+int file_led_exit(void);
+void file_led_write(void);
+
+#endif //_EQU_H
+
+/*------------------------------ 文件结束 -------------------------------------
+*/
+
+
+

+ 7 - 2
dtu/dtu_main_t536/app/head.h

@@ -112,9 +112,14 @@
 
 #include "Fmt.h"
 #include "LcdComm.h"
-#include "MmiDrv.h"
 
-#include "MmiData.h"
+//zhl add
+#include "key_menu.h"
+#include "menudesc.h"
+#include "file_led.h"
+//zhl ÆÁ±Î
+// #include "MmiDrv.h"
+// #include "MmiData.h"
 
 /*ͨÐż°ÆäËûÍ·Îļþ*/
 #include "iectable.h"

+ 6072 - 0
dtu/dtu_main_t536/app/key_menu.c

@@ -0,0 +1,6072 @@
+
+/******************************************************************************
+版权所有:	深圳市金宏威实业发展有限公司 
+文件名称:	key_menu.c
+文件版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-29
+功能说明:	按键菜单管理
+其它说明:
+修改记录:
+*/
+
+/*------------------------------- 头文件 --------------------------------------
+*/
+#include "head.h"
+#include "key_menu.h"
+/*------------------------------- 宏定义 --------------------------------------
+*/
+// 密码定义
+#define PASS_WORD_USE	0000
+#define PASS_WORD_ALL	1234
+#define PASS_WORD_SUPER 321
+
+/*------------------------------ 全局变量 -------------------------------------
+*/
+EVENT_SHOW event_cur;  				// 当前查询事件
+EVENT_SHOW event_Auto; 				// 突发弹出事件的结构
+
+SET_VALUE m_SetBuf[MAX_SET_NUMBER];	// 定义定值查看及整定时的buf
+static TSETTABLE *pset;				// 取当前编辑的设置查表
+u8 g_slavemenu;						// 保留次级菜单
+u8 g_mastermenu;					// 保留上级菜单
+u8 strGprsInf[20][24];
+
+u32 rmtpair_dely[2][2]={{0, 0},{0, 0}};	// 用于遥控器配对延时返回
+u32 gprs_info_up[2]={0, 0};
+
+int ac_adjust_result=0;				// 交流校准结果
+int  g_gprs_info_num;				// GPRS信息个数
+
+SET_VALUE g_netpara[PARA_NUM*4];	// 网卡类型定值
+SET_VALUE g_timepara[2*3];			// 时间类型定值
+
+static TSETTABLE *run_para_pick_set=NULL;  //运行参数
+static SET_VALUE *run_para_setbuf=NULL;    //运行参数setbuf
+
+/*------------------------------ 函数声明 -------------------------------------
+*/
+static int _key_menu(u8 key);
+static int _key_set(u8 key);
+static int _key_query_page(u8 key);
+static int _key_query_line(u8 key);
+static int _key_action(u8 key);
+static int _esc_key_menu(void);
+static int _esc_key_set(void);
+static int _esc_key_action(void);
+static int _up_key_menu(void);
+static int _down_key_menu(void);
+static int _left_key_menu(void);
+static int _left_key_set_query(void);
+static int _left_key_set_modify(void);
+static int _left_key_sjsoe(u16 addr);
+static int _left_key_czsoe(void);
+static int _left_key_query(void);
+static int _left_key_action(void);
+static int _right_key_menu(void);
+static int _right_key_set_query(void);
+static int _right_key_set_modify(void);
+static int _right_key_sjsoe(u16 addr);
+static int _right_key_czsoe(void);
+static int _right_key_action(void);
+static int _add_key_set(void);
+static int _add_key_query(void);
+static int _sub_key_query(void);
+static int _sub_key_set(void);
+static int _enter_key_menu(void);
+static int _enter_key_set(void);
+static int _enter_key_action(void);
+static int _enter_menu_init(void);
+static int _check_slave_menu(u8 menu_m, u8 cur_focus);
+static int _wnd_item_num_init(void);
+static int _soe_init(u16 addr, u16 soe_index, u16 soe_number, u16 soe_cur);
+static int _soe_show(EVENT_STRUCT *pe);
+static int _soe_auto_check(void);
+static int _info_err_init(void);
+static int _info_debug_init(void);
+static int _info_gprs_init(void);
+static int _info_equ_init(u8 menu_no, u8 wnd_no);
+static int _passerr_init(void);
+static int _rmt_pair_init(void);
+static int _rmt_delpair_init(void);
+static int _save_result_init(u8 result);
+static int _ac_adjust_result_init(int result);
+static int _set_init(u8 type);
+static int _set_change_disp(void);
+static int _set_modify_update(int cur_focus);
+static int _set_get_dispdata(int no, int setno, struct set_dis *pt, const TSETTABLE *pTable, SET_VALUE *setbuf);
+static int _set_fmt_init_modify(u8 index, struct set_dis *pt, const char *FmtStr,...);
+static int _set_spcl_fmt_init_modify(int type, u8 index, struct set_dis *pt, const char *FmtStr,...);
+static int _set_change_type(const TSETTABLE *pSet,int num,SET_VALUE *setbuf);
+static int _set_is_integer(u16 type);
+static int _set_is_have_point(void);
+static int _set_move_point(int bFlag);
+static int _set_get_modify_value(void);
+static char * _set_fmtstr_Precison(char *FmtStr,BYTE *len);
+static int _set_get_float_disp(void *pdat);
+static void _set_change_set(const TSETTABLE *pSet,int num, int index);
+static int _set_check_set(const TSETTABLE *pSet,int num,SET_VALUE *setbuf);
+static int _set_net_init(void);
+static int _set_time_init(int set_no);
+static int _set_net_save(void);
+static int _set_time_save(void);
+static int _set_save_func(u8 menu);
+static int _password_check(u8 code);
+int _reset_page_dis(void);
+int _blk_light_app(u8 key);
+static void _save_result_autoback(void);
+int _rmt_pair_dely(u8 key);
+static int _gprs_disp_update(void);
+int gprs_net_get_gprs_info(void);
+
+unsigned long mktimehms(const unsigned int hour,const unsigned int min, const unsigned int sec);
+int timespec_to_rtchms(struct timespec ts, struct rtc_time_t * p_rtc,int is_round);
+
+/*------------------------------ 外部函数 -------------------------------------
+*/
+/******************************************************************************
+函数名称:	key_hmi_app
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	按键翻屏应用
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int key_hmi_app(void)
+{
+	u8 key;
+	int update_ret=0;
+	
+	key = Get_Key();
+
+	key = _rmt_pair_dely(key);
+	
+	switch (g_page_cur.pagetype)
+	{
+		case MENU_TYPE:
+		case MENU_TYPE_CH8:
+			update_ret = _key_menu(key);
+		break;
+
+		case SET_TYPE:
+			update_ret = _key_set(key);
+		break;
+
+		case QUERY_PAGE_TYPE:
+			update_ret = _key_query_page(key);
+		break;
+
+		case QUERY_1LINE_TYPE:
+			update_ret = _key_query_line(key);
+		break;
+
+		case ACTION_TYPE:
+			update_ret = _key_action(key);
+		break;
+	}
+	
+	// 有效或有突发事件才更新
+	if ((update_ret == 0)
+		|| (_soe_auto_check()==0)
+		|| (_gprs_disp_update()==0))
+	{
+		reset_update_flag();
+	}
+
+	// 背光处理
+	_blk_light_app(key);
+	_save_result_autoback();
+	return 0;
+}
+
+/**************************************************************************
+函数名称:mmd_InitDefaultEquipSet
+函数版本:1.00 
+作者:   
+创建日期:2008.9.1     
+函数功能说明:恢复出厂设置,定值,定值区信息,压板,内部定值,参数均设为默认值,
+              清事件记录、操作记录,运行定值区0 ,有效区一个 0
+输入参数:
+输出参数:
+返回值:
+
+更新信息:
+更新日志1:
+日期:	  
+修改者:	  
+修改内容:  
+修改原因:
+***************************************************************************/
+int init_default_equip_set(int value)
+{
+	GetDefPara((float*)m_SetBuf,EQUIP_PARA_NUMBER,&tEquipParaTable[0]); //装置参数默认
+	//调试网口参数做特殊处理。调试网口的默认参数以UBOOT中的环境变量为默认值.
+	GetDefDebugNetPara();
+	SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]);
+
+	GetDefSet((float*)m_SetBuf);
+	SaveSet(m_runsection,(void *)m_SetBuf);
+
+	GetDefPara((float*)m_SetBuf,CSTSET_NUMBER,&tCstSetTable[0]);//定值默认
+	SavePara((void *)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]);
+
+	tSecInfo.sCurSec=0;         // 当前运行定值区为 0区
+	SavePassword(INIT_PASSWORD);  // 密码初始化
+	soe_clear_ev(); 				// 清事件记录
+	soe_clear_opt() ;   			// 清操作记录
+	soe_record_opt(EV_INIT_EQUIP,0);	// 记录操作记录
+	tSecInfo.sCurSec=0;
+	MakeRunSet(true); 			// 将当前运行定值区转换为运行定值区
+	MakeRunPara(false, true);  		// 转换参数到运行参数区
+
+	rt_printf("恢复为出厂设置\r\n");
+	return 0;	
+}
+
+/******************************************************************************
+函数名称:	check_cur_wnd_item
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	获取当前屏分配的实体数
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int check_cur_wnd_item(void)
+{	
+	// 当前屏号离屏总数还差一屏时,当前屏分配实体数为每屏可容纳的最大数(cur_wnd从0开始计数)
+	if ((g_page_cur.cur_wnd+2) <= g_page_cur.wnd_num)
+	{
+		g_page_cur.cur_wnd_item = g_page_cur.wnd_item;
+	}
+	else
+	{
+		// 最后一屏分配的实体数为总数减其他屏实体数
+		g_page_cur.cur_wnd_item = g_page_cur.item_num - g_page_cur.wnd_item*(g_page_cur.wnd_num-1);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	gprs_get_info
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	获取当前屏分配的实体数
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int gprs_get_info(void)
+{
+	u8 *pd=tGprsInf.data;
+	int num=0;
+	
+	//获取内部GPRS状态信息
+	num = mmd_get_gprs_info();
+	
+	g_gprs_info_num = num;
+	if(num > 0) 
+	{	
+		return num;
+	}
+	
+	if(!tGprsInf.bInf)
+	{
+		return 0;
+	}
+	tGprsInf.bInf=false;
+	
+	if((pd[0]|(pd[1]<<8))==0x0001)
+	{
+		strcpy(strGprsInf[num++],"模块状态 :正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"模块状态 :异常");
+
+	}
+
+	if((pd[2]|(pd[3]<<8))==0x0001)
+	{
+		strcpy(strGprsInf[num++],"SIM卡状态:正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"SIM卡状态:异常");
+
+	}
+
+	if((pd[4]|(pd[5]<<8))==0x0001)
+	{
+		strcpy(strGprsInf[num++],"PPP拨号  :正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"PPP拨号  :异常");
+
+	}
+
+	sprintf(strGprsInf[num++],"信号强度 :%2d",(pd[16]|(pd[17]<<8)));
+	// SIM卡IP
+	sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[36],pd[37],pd[38],pd[39]);	
+
+	// CH1是否正常,端口是多少,IP1
+	if((pd[6]|(pd[7]<<8))==0x0001)
+	{
+		sprintf(strGprsInf[num++],"CH1:正常 %d",(pd[44]|(pd[45]<<8)));
+	}
+	else
+	{
+		sprintf(strGprsInf[num++],"CH1:异常 %d",(pd[44]|(pd[45]<<8)));
+	}
+	sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[40],pd[41],pd[42],pd[43]);		
+
+	// CH2是否正常,端口是多少,IP2
+	if((pd[8]|(pd[9]<<8))==0x0001)
+	{
+		sprintf(strGprsInf[num++],"CH2:正常 %d",(pd[50]|(pd[51]<<8)));
+	}
+	else
+	{
+		sprintf(strGprsInf[num++],"CH2:异常 %d",(pd[50]|(pd[51]<<8)));
+	}
+	sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[46],pd[47],pd[48],pd[49]);	
+
+	strcpy(strGprsInf[num++],"频段:自适应");
+	strcpy(strGprsInf[num++],"流量(秒):");
+	sprintf(strGprsInf[num++],"%d",(pd[26]|(pd[27]<<8)|(pd[28]<<16)|(pd[29]<<24)));
+	strcpy(strGprsInf[num++],"流量(B) :");
+	sprintf(strGprsInf[num++],"%d",(pd[30]|(pd[31]<<8)|(pd[32]<<16)|(pd[33]<<24)));
+
+	if((pd[14]|(pd[15]<<8))==0x0001)
+	{
+		strcpy(strGprsInf[num++],"重启状态:重启");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"重启状态:未重启");
+	}
+
+	g_gprs_info_num = num;
+
+	return num;
+}
+/*------------------------------ 内部函数 -------------------------------------
+*/
+/******************************************************************************
+函数名称:	_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	按键翻菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _key_menu(u8 key)
+{
+	int update_ret=0;
+
+	if (key == NO_KEY)
+		return -1;
+
+	switch (key)
+	{
+		case HA_KEY_ESC:
+			update_ret = _esc_key_menu();
+			Add_Clear_Screen();
+		break;
+
+		case HA_KEY_RST:
+			SignalReset(0,false);
+			update_ret = -1;
+			g_file_led_sign = 1;			// 故障LED状态文件记录标志	
+			g_protect_restore = 1;
+			clear_tfd_fault();
+		break;
+
+		case HA_KEY_UP:
+			update_ret = _up_key_menu();
+		break;
+
+		case HA_KEY_DOWN:
+			update_ret = _down_key_menu();
+		break;
+
+		case HA_KEY_LEFT:
+			update_ret = _left_key_menu();
+		break;
+
+		case HA_KEY_RIGHT:
+			update_ret = _right_key_menu();
+		break;
+
+		case HA_KEY_ADD:
+			update_ret = _up_key_menu();
+		break;
+		
+		case HA_KEY_SUB:
+			update_ret = _down_key_menu();
+		break;
+
+		case HA_KEY_ENTER:
+		{
+			update_ret = _enter_key_menu();
+			Add_Clear_Screen();
+		}
+		break;
+
+		default:
+			update_ret = -1;
+		break;
+	}
+	
+	return update_ret;
+}
+
+/******************************************************************************
+函数名称:	_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	设置类人机操作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _key_set(u8 key)
+{
+	int update_ret=0;
+
+	if (key == NO_KEY)
+		return -1;
+
+	switch (key)
+	{
+		case HA_KEY_ESC:
+			update_ret = _esc_key_set();
+			Add_Clear_Screen();
+		break;
+
+		case HA_KEY_RST:
+		{
+			SignalReset(0,false);
+			update_ret = -1;
+			g_file_led_sign = 1;			// 故障LED状态文件记录标志
+			g_protect_restore = 1;
+			clear_tfd_fault();
+		}
+		break;
+
+		case HA_KEY_UP:
+			g_set_dis[g_page_cur.cur_focus].modify = 0;
+			update_ret = _left_key_set_query();
+			g_set_dis[g_page_cur.cur_focus].modify = 1;
+		break;
+
+		case HA_KEY_DOWN:
+			g_set_dis[g_page_cur.cur_focus].modify = 0;
+			update_ret = _right_key_set_query();
+			g_set_dis[g_page_cur.cur_focus].modify = 1;
+		break;
+
+		case HA_KEY_LEFT:
+			if (g_set_dis[g_page_cur.cur_focus].modify)
+			{
+				update_ret = _left_key_set_modify();				
+			}
+			else
+			{
+				update_ret = _left_key_set_query();
+			}
+		break;
+
+		case HA_KEY_RIGHT:
+			if (g_set_dis[g_page_cur.cur_focus].modify)
+			{
+				update_ret = _right_key_set_modify();				
+			}
+			else
+			{
+				update_ret = _right_key_set_query();
+			}
+		break;
+
+		case HA_KEY_ADD:
+			if (g_set_dis[g_page_cur.cur_focus].modify)
+			{
+				update_ret = _add_key_set();
+			}
+		break;
+
+		case HA_KEY_SUB:
+			if (g_set_dis[g_page_cur.cur_focus].modify)
+			{
+				update_ret = _sub_key_set();
+			}
+		break;
+
+		case HA_KEY_ENTER:
+		{
+			update_ret = _enter_key_set();
+		}
+		break;
+
+		default:
+			update_ret = -1;
+		break;
+	}
+	
+	return update_ret;
+}
+
+/******************************************************************************
+函数名称:	_key_query_page
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	页面查询类人机操作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _key_query_page(u8 key)
+{
+	int update_ret=0;
+
+	if (key == NO_KEY)
+		return -1;
+
+	switch (key)
+	{
+		case HA_KEY_ESC:
+			update_ret = _esc_key_menu();
+			if (rmtpair_dely[0][0])
+			{
+				rmtpair_dely[0][0] = 0;
+			}
+			if (rmtpair_dely[1][0])
+			{
+				rmtpair_dely[1][0] = 0;
+			}
+			if (gprs_info_up[0])
+			{
+				gprs_info_up[0] = 0;
+			}
+			Add_Clear_Screen();
+		break;
+
+		case HA_KEY_RST:
+		{
+			SignalReset(0,false);
+			update_ret = -1;
+			g_file_led_sign = 1;			// 故障LED状态文件记录标志	
+			g_protect_restore = 1;
+			clear_tfd_fault();
+		}
+		break;
+		
+		case HA_KEY_UP:
+		case HA_KEY_LEFT:
+		{
+			if ((g_page_cur.menu_cur == MENU_SJSOE)
+				|| (g_page_cur.menu_cur == MENU_EVENT))
+			{			
+				update_ret = _left_key_sjsoe(EEP_SOE_ADDR);
+			}
+			else if (g_page_cur.menu_cur == MENU_CZSOE)
+			{
+				update_ret = _left_key_czsoe();
+			}
+			else if ((g_page_cur.menu_cur == MENU_INFO_ERR)
+				|| (g_page_cur.menu_cur == MENU_INFO_DEBUG)
+				|| (g_page_cur.menu_cur == MENU_INFO_GPRS))
+			{
+				update_ret = _left_key_query();				
+			}
+			else if ( (g_page_cur.menu_cur == MENU_INFO_EQU)
+			        ||(g_page_cur.menu_cur == MENU_COMM_PARA) )
+            {
+                update_ret = _sub_key_query();
+                _info_equ_init(g_page_cur.menu_cur, g_page_cur.cur_wnd);
+            }
+			else if ( (g_page_cur.menu_cur == MENU_INFO_YX)
+			        ||(g_page_cur.menu_cur == MENU_INFO_YC) )
+            {
+                update_ret = _sub_key_query();
+            }
+			Add_Clear_Screen();
+		}
+
+		break;
+
+		case HA_KEY_DOWN:
+		case HA_KEY_RIGHT:
+		{
+			if ((g_page_cur.menu_cur == MENU_SJSOE)
+				|| (g_page_cur.menu_cur == MENU_EVENT))
+			{			
+				update_ret = _right_key_sjsoe(EEP_SOE_ADDR);
+			}
+			else if (g_page_cur.menu_cur == MENU_CZSOE)
+			{
+				update_ret = _right_key_czsoe();
+			}
+			else if ((g_page_cur.menu_cur == MENU_INFO_ERR)
+				|| (g_page_cur.menu_cur == MENU_INFO_DEBUG)
+				|| (g_page_cur.menu_cur == MENU_INFO_GPRS))
+			{
+				update_ret = _add_key_query();				
+			}
+			else if ( (g_page_cur.menu_cur == MENU_INFO_EQU)
+			        ||(g_page_cur.menu_cur == MENU_COMM_PARA))
+            {
+                update_ret = _add_key_query();
+                _info_equ_init(g_page_cur.menu_cur, g_page_cur.cur_wnd);
+            }
+			else if ( (g_page_cur.menu_cur == MENU_INFO_YX)
+			        ||(g_page_cur.menu_cur == MENU_INFO_YC))
+            {
+                update_ret = _add_key_query();
+            }
+
+			Add_Clear_Screen();
+		}
+		break;
+		
+		case HA_KEY_ADD:
+			if (gprs_info_up[0])
+			{
+				IEC101_PH_GprsInfo();
+			}
+			else if ( (g_page_cur.menu_cur == MENU_INFO_EQU)
+			        ||(g_page_cur.menu_cur == MENU_COMM_PARA))
+            {
+				update_ret = _add_key_query();
+                _info_equ_init(g_page_cur.menu_cur, g_page_cur.cur_wnd);
+				Add_Clear_Screen();
+				break;
+            }
+			update_ret = _add_key_query();
+			Add_Clear_Screen();
+		break;
+		
+		case HA_KEY_SUB:
+			if (gprs_info_up[0])
+			{
+				IEC101_PH_GprsInfo();
+			}
+			else if ( (g_page_cur.menu_cur == MENU_INFO_EQU)
+			        ||(g_page_cur.menu_cur == MENU_COMM_PARA))
+            {
+				update_ret = _sub_key_query();
+                _info_equ_init(g_page_cur.menu_cur, g_page_cur.cur_wnd);
+				Add_Clear_Screen();
+				break;
+            }
+			update_ret = _sub_key_query();
+			Add_Clear_Screen();
+		break;
+
+		case HA_KEY_ENTER:
+			update_ret = -1;
+		break;
+
+		default:
+			update_ret = -1;
+		break;
+	}
+
+	return update_ret;
+}
+
+/******************************************************************************
+函数名称:	_key_query_line
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	行查询类人机操作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _key_query_line(u8 key)
+{
+	int update_ret = 0;
+
+	if (key == NO_KEY)
+		return -1;
+
+	switch (key)
+	{
+		case HA_KEY_ESC:
+			update_ret = _esc_key_menu();
+			Add_Clear_Screen();
+		break;
+
+		case HA_KEY_RST:	
+		{
+			SignalReset(0,false);
+			update_ret = -1;
+			g_file_led_sign = 1;			// 故障LED状态文件记录标志	
+			g_protect_restore = 1;
+			clear_tfd_fault();
+		}
+		break;
+
+		case HA_KEY_UP:
+		case HA_KEY_LEFT:
+		case HA_KEY_SUB:
+			update_ret = _left_key_query();
+			if (update_ret==0)
+			{
+				Add_Clear_Screen();
+			}
+		break;
+
+		case HA_KEY_DOWN:
+		case HA_KEY_RIGHT:
+		case HA_KEY_ADD:
+			update_ret = _add_key_query();
+			if (update_ret==0)
+			{
+				Add_Clear_Screen();
+			}
+		break;
+
+		case HA_KEY_ENTER:
+			update_ret = -1;
+		break;
+
+		default:
+			update_ret = -1;
+		break;
+	}	
+	return update_ret;
+}
+
+/******************************************************************************
+函数名称:	_key_action
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	动作类人机操作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _key_action(u8 key)
+{
+	int update_ret=0;
+
+	if (key == NO_KEY)
+		return -1;
+
+	switch (key)
+	{
+		case HA_KEY_ESC:
+		{
+			update_ret = _esc_key_action();
+			Add_Clear_Screen();
+		}
+		break;
+
+		case HA_KEY_RST:
+		{
+			SignalReset(0,false);
+			update_ret = -1;
+			g_file_led_sign = 1;			// 故障LED状态文件记录标志	
+			g_protect_restore = 1;
+			clear_tfd_fault();
+		}
+		break;
+
+		case HA_KEY_UP:
+		case HA_KEY_LEFT:
+			update_ret = _left_key_action();
+		break;
+
+		case HA_KEY_DOWN:
+		case HA_KEY_RIGHT:
+			update_ret = _right_key_action();			
+		break;
+
+		case HA_KEY_ADD:
+		case HA_KEY_SUB:
+			update_ret = -1;
+		break;
+
+		case HA_KEY_ENTER:
+		{
+			update_ret = _enter_key_action();
+			if (update_ret == 0)
+			{
+				Add_Clear_Screen();
+			}
+		}
+		break;
+
+		default:
+			update_ret = -1;
+		break;
+	}
+	
+	return update_ret;
+}
+
+/******************************************************************************
+函数名称:	_up_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	上键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _up_key_menu(void)
+{
+	// 当前聚焦点未到当前屏最小,减一
+	if (g_page_cur.cur_focus > 1)
+	{
+		g_page_cur.cur_focus -= 2;
+	}
+	else
+	{
+		// 当前屏非最小,上翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			g_page_cur.cur_wnd--;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+		}
+		else
+		{
+			// 否则聚焦点移至当前屏最末
+			g_page_cur.cur_focus = g_page_cur.cur_wnd_item-1;
+		}				
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_down_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _down_key_menu(void)
+{
+	// 当前聚焦点加一
+	if (g_page_cur.cur_focus < (g_page_cur.cur_wnd_item-2))
+	{
+		g_page_cur.cur_focus += 2;
+	}
+	else
+	{
+		// 当前屏非最大,下翻一屏
+		if (g_page_cur.cur_wnd < (g_page_cur.wnd_num-1))
+		{
+			g_page_cur.cur_wnd++;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+		}
+		// 聚焦移至最首
+		g_page_cur.cur_focus = 0;
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_menu(void)
+{
+	// 当前聚焦点未到当前屏最小,减一
+	if (g_page_cur.cur_focus > 0)
+	{
+		g_page_cur.cur_focus--;
+	}
+	else
+	{
+		// 当前屏非最小,上翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			g_page_cur.cur_wnd--;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+		}
+		else
+		{
+			// 否则聚焦点移至当前屏最末
+			g_page_cur.cur_focus = g_page_cur.cur_wnd_item-1;
+		}				
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_set_query
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-定值查询
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_set_query(void)
+{
+	// 当前聚焦点未到当前屏最小,减一
+	if (g_page_cur.cur_focus > 0)
+	{
+		// 当前聚焦定值重新刷新
+		g_item_update.data[g_page_cur.cur_focus] = 1;
+
+		g_set_dis[g_page_cur.cur_focus].cursor = 0;
+		
+		// 聚焦移位
+		g_page_cur.cur_focus--;
+		
+		// 新聚焦定值重新刷新
+		g_item_update.data[g_page_cur.cur_focus] = 1;
+
+		g_set_dis[g_page_cur.cur_focus].cursor = 0;
+
+		// 不刷新其他项
+		return -1;
+	}
+	else
+	{
+		// 当前屏非最小,上翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			Add_Clear_Screen();
+			g_page_cur.cur_wnd--;
+			check_cur_wnd_item();			
+			_set_change_disp();
+			g_page_cur.cur_focus=g_page_cur.cur_wnd_item-1;
+		}
+		else
+		{
+			Add_Clear_Screen();
+			g_page_cur.cur_wnd = g_page_cur.wnd_num-1;
+			check_cur_wnd_item();			
+			_set_change_disp();
+			g_page_cur.cur_focus = g_page_cur.cur_wnd_item-1;
+		}				
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_set_modify
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-设置左移
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_set_modify(void)
+{
+	u8 focus;
+
+	// 当前屏内聚焦的定值
+	focus = g_page_cur.cur_focus;
+
+	if (g_set_dis[focus].list)	// 列表型定值
+	{
+		return -1;
+	}
+
+	// 数字型定值左移
+	if (g_set_dis[focus].cursor > 0)
+	{
+		g_set_dis[focus].cursor--;
+
+	}
+	else
+	{
+		g_set_dis[focus].cursor = g_set_dis[focus].lenth-1;
+	}
+
+	// 如果左移后的项是小数点,且当前类型为浮点型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '.')
+		&& (g_set_dis[focus].type == 'F'))
+	{
+		g_set_dis[focus].cursor--;			
+	}
+
+	// 如果左移后的项是小数点,且当前类型为网卡地址型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '.')
+		&& g_set_dis[focus].spcl_type == DISP_IP)
+	{
+		g_set_dis[focus].cursor--;			
+	}
+
+	// 如果左移后的项是横杠,且当前类型为年月日型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '-')
+		&& g_set_dis[focus].spcl_type == DISP_YMD)
+	{
+		g_set_dis[focus].cursor--;			
+	}
+
+	// 如果左移后的项是':',且当前类型为时分秒型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == ':')
+		&& g_set_dis[focus].spcl_type == DISP_HMS)
+	{
+		g_set_dis[focus].cursor--;			
+	}
+
+	// 当前聚焦定值重新刷新
+	g_item_update.data[g_page_cur.cur_focus] = 1;
+	
+	return -1;
+}
+
+/******************************************************************************
+函数名称:	_left_key_sjsoe
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-事件记录
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_sjsoe(u16 addr)
+{
+	if(g_soe_info.wEvNumber > 1)
+	{
+		if(event_cur.wCurrent == 1)
+		{
+			event_cur.wCurrent = g_soe_info.wEvNumber;
+		}
+		else
+		{
+			event_cur.wCurrent--;
+		}				
+		
+		if(event_cur.wIndex > 0)
+		{
+			event_cur.wIndex--;
+		}
+		else
+		{
+			if(g_soe_info.wEvNumber == MAX_EVENT_NUMBER)
+			{
+				event_cur.wIndex = MAX_EVENT_NUMBER-1;
+			}
+			else
+			{
+				event_cur.wIndex = g_soe_info.wEvIndex;
+			}
+		}
+		_soe_init(addr, event_cur.wIndex, g_soe_info.wEvNumber, event_cur.wCurrent);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_czsoe
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-操作记录
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_czsoe(void)
+{
+	if(g_soe_info.wOpNumber > 1)
+	{
+		if(event_cur.wCurrent == 1)
+		{
+			event_cur.wCurrent = g_soe_info.wOpNumber;
+		}
+		else
+		{
+			event_cur.wCurrent--;
+		}				
+		
+		if(event_cur.wIndex > 0)
+		{
+			event_cur.wIndex--;
+		}
+		else
+		{
+			if(g_soe_info.wOpNumber == MAX_EVENT_NUMBER)
+			{
+				event_cur.wIndex = MAX_EVENT_NUMBER-1;
+			}
+			else
+			{
+				event_cur.wIndex = g_soe_info.wOpIndex;
+			}
+		}
+		_soe_init(EEP_OPERATE_ADDR, event_cur.wIndex, g_soe_info.wOpNumber, event_cur.wCurrent);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_query
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-查询
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_query(void)
+{
+	if (g_page_cur.wnd_num > 1)
+	{
+		// 当前屏非最小,上翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			g_page_cur.cur_wnd--;			
+		}
+		else
+		{
+			g_page_cur.cur_wnd = g_page_cur.wnd_num-1;
+		}
+		check_cur_wnd_item();
+	}
+	else
+	{
+		return 1;
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_left_key_action
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	左键-动作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _left_key_action(void)
+{
+	// 当前聚焦点未到当前屏最小,减一
+	if (g_page_cur.cur_focus > 0)
+	{
+		g_page_cur.cur_focus--;
+	}
+	else
+	{
+		// 当前屏非最小,上翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			g_page_cur.cur_wnd--;
+			check_cur_wnd_item();
+			Add_Clear_Screen();			
+		}
+		else
+		{
+			g_page_cur.cur_wnd = g_page_cur.wnd_num-1;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+			g_page_cur.cur_focus = g_page_cur.cur_wnd_item-1;
+		}
+		memset(g_action.action, 0, 10);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_right_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_menu(void)
+{
+	// 当前聚焦点加一
+	if (g_page_cur.cur_focus < (g_page_cur.cur_wnd_item-1))
+	{
+		g_page_cur.cur_focus++;
+	}
+	else
+	{
+		// 当前屏非最大,下翻一屏
+		if (g_page_cur.cur_wnd < (g_page_cur.wnd_num-1))
+		{
+			g_page_cur.cur_wnd++;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+		}
+		// 聚焦移至最首
+		g_page_cur.cur_focus = 0;
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_right_key_set_query
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-定值查询
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_set_query(void)
+{
+	// 当前聚焦点未到当前屏最小,加一
+	if (g_page_cur.cur_focus < (g_page_cur.cur_wnd_item-1))
+	{
+		// 当前聚焦定值重新刷新
+		g_item_update.data[g_page_cur.cur_focus] = 1;
+
+		g_set_dis[g_page_cur.cur_focus].cursor = 0;
+		
+		// 聚焦移位
+		g_page_cur.cur_focus++;
+
+		g_set_dis[g_page_cur.cur_focus].cursor = 0;
+		
+		// 新聚焦定值重新刷新
+		g_item_update.data[g_page_cur.cur_focus] = 1;
+
+		// 不刷新其他项
+		return -1;
+	}
+	else
+	{
+		// 当前屏非最小,下翻一屏
+		if (g_page_cur.cur_wnd < (g_page_cur.wnd_num-1))
+		{
+			Add_Clear_Screen();
+			g_page_cur.cur_wnd++;
+			check_cur_wnd_item();			
+			_set_change_disp();
+			g_page_cur.cur_focus = 0;
+		}
+		else
+		{
+			Add_Clear_Screen();
+			g_page_cur.cur_wnd = 0;
+			check_cur_wnd_item();			
+			_set_change_disp();
+			g_page_cur.cur_focus = 0;
+		}				
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_right_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_set_modify(void)
+{
+	u8 focus;
+
+	// 当前屏内聚焦的定值
+	focus = g_page_cur.cur_focus;
+
+	if (g_set_dis[focus].list)	// 列表型定值
+	{
+		return -1;
+	}
+
+	// 数字型定值左移
+	if (g_set_dis[focus].cursor < g_set_dis[focus].lenth-1)
+	{
+		g_set_dis[focus].cursor++;
+	}
+	else
+	{
+		g_set_dis[focus].cursor = 0;
+	}
+
+	// 如果左移后的项是小数点,且当前类型为浮点型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '.')
+		&& (g_set_dis[focus].type == 'F'))
+	{
+		g_set_dis[focus].cursor++;			
+	}
+
+	// 如果左移后的项是小数点,且当前类型为网卡地址型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '.')
+		&& g_set_dis[focus].spcl_type == DISP_IP)
+	{
+		g_set_dis[focus].cursor++;			
+	}
+
+	// 如果左移后的项是横杠,且当前类型为年月日型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == '-')
+		&& g_set_dis[focus].spcl_type == DISP_YMD)
+	{
+		g_set_dis[focus].cursor++;			
+	}
+
+	// 如果左移后的项是':',且当前类型为时分秒型,再左移一位
+	if ((g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] == ':')
+		&& g_set_dis[focus].spcl_type == DISP_HMS)
+	{
+		g_set_dis[focus].cursor++;			
+	}
+
+	// 当前聚焦定值重新刷新
+	g_item_update.data[g_page_cur.cur_focus] = 1;
+
+	
+	return -1;
+}
+
+/******************************************************************************
+函数名称:	_right_key_sjsoe
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-事件记录
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_sjsoe(u16 addr)
+{
+	if(g_soe_info.wEvNumber > 1)
+	{
+		if(event_cur.wCurrent == g_soe_info.wEvNumber)
+		{
+			event_cur.wCurrent = 1;
+		}
+		else
+		{
+			event_cur.wCurrent++;
+		}				
+		
+		if(event_cur.wIndex < (g_soe_info.wEvNumber-1))
+		{
+			event_cur.wIndex++;
+		}
+		else
+		{
+			event_cur.wIndex = 0;
+		}
+		_soe_init(addr, event_cur.wIndex, g_soe_info.wEvNumber, event_cur.wCurrent);
+	}	
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_right_key_czsoe
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-事件记录
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_czsoe(void)
+{
+	if(g_soe_info.wOpNumber > 1)
+	{
+		if(event_cur.wCurrent == g_soe_info.wOpNumber)
+		{
+			event_cur.wCurrent = 1;
+		}
+		else
+		{
+			event_cur.wCurrent++;
+		}				
+		
+		if(event_cur.wIndex < (g_soe_info.wOpNumber-1))
+		{
+			event_cur.wIndex++;
+		}
+		else
+		{
+			event_cur.wIndex = 0;
+		}
+		_soe_init(EEP_OPERATE_ADDR, event_cur.wIndex, g_soe_info.wOpNumber, event_cur.wCurrent);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_right_key_action
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	右键-动作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _right_key_action(void)
+{
+	// 当前聚焦点加一
+	if (g_page_cur.cur_focus < (g_page_cur.cur_wnd_item-1))
+	{
+		g_page_cur.cur_focus++;
+	}
+	else
+	{
+		// 当前屏非最大,下翻一屏
+		if (g_page_cur.cur_wnd < (g_page_cur.wnd_num-1))
+		{
+			g_page_cur.cur_wnd++;
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+			g_page_cur.cur_focus = 0;
+		}
+		else
+		{			
+			g_page_cur.cur_wnd = 0;
+			check_cur_wnd_item();	
+			Add_Clear_Screen();
+			g_page_cur.cur_focus = 0;
+		}		
+		memset(g_action.action, 0, 10);
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_add_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	加键-设置
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _add_key_set(void)
+{
+	u8 focus, index;
+	int no, no1;
+	int value;
+	char dat;
+
+	// 当前屏内聚焦的定值
+	focus = g_page_cur.cur_focus;
+
+	if (g_page_cur.cur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+	}
+	
+	// 当前设置项No,即对应定值列表	
+	no = focus + index;
+	no1 = 0;
+	if (g_pub_setdisp.type == MENU_FIX_PUB)
+	{
+		no = g_pub_setdisp.no[no];
+	}
+	else if (g_sw_setdisp.type == MENU_GLBH)
+	{
+		no = class_GLBH.idx[no];
+		no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_GLBH.sw_idx;
+	}
+    else if (g_sw_setdisp.type == MENU_LXBH)
+    {
+        no = class_LXBH.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_LXBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_JDBH)
+    {
+        no = class_JDBH.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_JDBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_RECLOSE)
+    {
+        no = class_reclose.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_reclose.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_BH_STATUS)
+    {
+        no = class_BH_sts.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_BH_sts.sw_idx;
+    }
+	else if (g_sw_setdisp.type == MENU_DLYX)
+    {
+        no = class_DLYX.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_DLYX.sw_idx;
+    }
+	else if (g_sw_setdisp.type == MENU_HJS)
+    {
+        no = class_HJS.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_HJS.sw_idx;
+    }
+	else if (g_equip_paradisp.type == MENU_PARA)
+	{
+		no = g_equip_paradisp.no[no];
+	}
+    else if (g_faultRst_setdisp.type == MENU_FAULT_RESET)
+    {
+        no = g_faultRst_setdisp.no[no];
+    }
+    else if (g_rmt_para_disp.type == MENU_RUN_PARA)
+    {
+        //do nothing
+    }
+	else if (g_cst_setdisp.type == MENU_INFIX)
+	{
+		no = g_cst_setdisp.no[no];
+	}
+
+	// 定值修改
+	if (g_set_dis[focus].list)	// 列表型定值
+	{
+		value = (WORD)m_SetBuf[no1+no].ff;
+		if (value < (pset[no].listnum-1))
+		{
+			value++;
+		}
+		else
+		{	
+			value = 0;
+		}
+		m_SetBuf[no1+no].ff = (float)value;
+	}
+	else	// 数字型定值
+	{
+		dat = g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor];	// 取当前修改字符
+		if(g_set_dis[focus].type != 's') // 不是汉字修改
+		{
+			switch(g_set_dis[focus].type)
+			{
+				case 'o': // 8进制有符号整数
+				{
+					if(dat=='7')dat='0';else dat++;
+					if(dat>'7')dat='0';
+				}
+				break;
+				
+				case 'u': // 10进制无符号整数
+				{
+					if(dat=='9')dat='0';else dat++;
+					if(dat>'9')dat='0';
+				}
+				break;
+				
+				case 'x': // 16进制无符号整数,小写
+				{
+					switch(dat)
+					{
+						case '9':	dat='a';	break;
+						case 'f':	dat='0';	break;
+						default:	dat++;		break;
+					}
+				}
+				break;
+				
+				case 'X':  // 16进制无符号整数,大写
+				{
+					switch(dat)
+					{
+						case '9':	dat='A';	break;
+						case 'F':	dat='0';	break;
+						default:	dat++;		break;
+					}
+				}
+				break;
+				
+				case 'c': // 输出单个字符
+				{
+					if(dat=='9')dat='0';else dat++;
+					if(dat>'9')dat='0';
+				}
+				break;
+				
+				case 'B':
+				case 'b':  // 2进制数
+				{
+					if(dat=='1')dat='0';else dat='1';
+				}
+				break;
+				
+				case 'd':  // 10进制有符号整数
+				case 'i': 
+				{
+					if(g_set_dis[focus].cursor == 0)
+					{
+						dat=' ';
+					}
+					else
+					{
+						switch(dat)
+						{
+							case '9':   dat='0';break;
+							default:	dat++;	break;
+						}
+						if(dat<'0'||dat>'9')dat='0';
+					}
+				}
+				break;
+				
+				case 'f':  // 浮点数
+				case 'F':  // 浮点数
+				{
+					if(g_set_dis[focus].cursor == 0)
+					{
+						dat=' ';
+					}
+					else
+					{
+						switch(dat)
+						{
+							case '9':
+								if((g_set_dis[focus].cursor == g_set_dis[focus].lenth-1)
+									&& (!_set_is_have_point()))
+								{
+									dat='.';  /*防止没有小数点的情况出现*/
+								}
+								else
+								{
+									dat='0';
+								}
+							break;
+							
+							case '.':	
+								_set_move_point(1);
+							break;
+							
+							default:
+								if(dat>='0' && dat<='9')
+								{
+									dat++;
+								}
+								else 
+								{
+									dat='0';							
+								}
+							break;
+						}
+					}	
+				}
+				break;
+				
+				default:
+				{
+					dat='0';
+				}
+				break;
+			}
+
+			// 修改内容装载入字符串
+			if(dat!='.')
+			{
+				g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] = dat;
+			}
+		}
+
+		// 将修改内容转换为数值
+		_set_get_modify_value();
+	}
+
+	// 更新显示
+	_set_modify_update(g_page_cur.cur_focus);
+	
+	// 当前聚焦定值重新刷新
+	g_item_update.data[g_page_cur.cur_focus] = 1;
+
+	return -1;
+}
+
+/******************************************************************************
+函数名称:	_add_key_query
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	加键-查询
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _add_key_query(void)
+{
+	// 仅一屏,不翻屏
+	if (g_page_cur.wnd_num > 1)
+	{		
+		// 当前屏非最大,下翻一屏
+		if (g_page_cur.cur_wnd < (g_page_cur.wnd_num-1))
+		{
+			g_page_cur.cur_wnd++;
+		}		
+		else
+		{
+			g_page_cur.cur_wnd = 0;
+		}
+		check_cur_wnd_item();
+	}
+	else
+	{
+		return 1;
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_sub_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	减键-设置
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _sub_key_set(void)
+{
+	u8 focus, index;
+	int no, no1;
+	int value;
+	char dat;
+
+	// 当前屏内聚焦的定值
+	focus = g_page_cur.cur_focus;
+
+	if (g_page_cur.cur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+	}
+	
+	// 当前设置项No,即对应定值列表	
+	no = focus + index;
+	no1 = 0;
+	if (g_pub_setdisp.type == MENU_FIX_PUB)
+	{
+		no = g_pub_setdisp.no[no];
+	}
+	else if (g_sw_setdisp.type == MENU_GLBH)
+	{
+        no  = class_GLBH.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_GLBH.sw_idx;
+	}
+    else if (g_sw_setdisp.type == MENU_LXBH)
+    {
+        no  = class_LXBH.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_LXBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_JDBH)
+    {
+        no  = class_JDBH.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_JDBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_RECLOSE)
+    {
+        no  = class_reclose.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_reclose.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_BH_STATUS)
+    {
+        no  = class_BH_sts.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_BH_sts.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_DLYX)
+    {
+        no  = class_DLYX.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_DLYX.sw_idx;
+    }
+	else if (g_sw_setdisp.type == MENU_HJS)
+    {
+        no  = class_HJS.idx[no];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_HJS.sw_idx;
+    }
+	else if (g_equip_paradisp.type == MENU_PARA)
+	{
+		no = g_equip_paradisp.no[no];
+	}
+    else if (g_faultRst_setdisp.type == MENU_FAULT_RESET)
+    {
+        no = g_faultRst_setdisp.no[no];
+    }
+    else if (g_rmt_para_disp.type == MENU_RUN_PARA)
+    {
+        //do nothing
+    }
+	else if (g_cst_setdisp.type == MENU_INFIX)
+	{
+		no = g_cst_setdisp.no[no];
+	}
+	
+	// 定值修改
+	if (g_set_dis[focus].list)	// 列表型定值
+	{
+		value = (WORD)m_SetBuf[no1+no].ff;
+		if (value > 0)
+		{
+			value--;
+		}
+		else
+		{	
+			value = pset[no].listnum-1;
+		}
+		m_SetBuf[no1+no].ff = (float)value;
+	}
+	else	// 数字型定值
+	{
+		dat = g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor];	// 取当前修改字符
+		if(g_set_dis[focus].type != 's') // 不是汉字修改
+		{
+			switch(g_set_dis[focus].type)
+			{
+				case 'o': // 8进制有符号整数
+				{
+					if(dat=='0')dat='7';else dat--;
+					if(dat<'0')dat='7';
+				}
+				break;
+				
+				case 'u': // 10进制无符号整数
+				{
+					if(dat=='0')dat='9';else dat--;
+					if(dat<'0')dat='9';
+				}
+				break;
+				
+				case 'x': // 16进制无符号整数,小写
+				{
+					switch(dat)
+					{
+						case 'a':	dat='9';	break;
+						case '0':	dat='f';	break;
+						default:	dat--;		break;
+					}
+				}
+				break;
+				
+				case 'X':  // 16进制无符号整数,大写
+				{
+					switch(dat)
+					{
+						case 'A':	dat='9';	break;
+						case '0':	dat='F';	break;
+						default:	dat--;		break;
+					}
+				}
+				break;
+				
+				case 'c': // 输出单个字符
+				{
+					if(dat=='0')dat='9';else dat--;
+					if(dat<'0')dat='9';
+				}
+				break;
+				
+				case 'B':
+				case 'b':  // 2进制数
+				{
+					if(dat=='0')dat='1';else dat='0';
+				}
+				break;
+				
+				case 'd':  // 10进制有符号整数
+				case 'i': 
+				{
+					if(g_set_dis[focus].cursor == 0)
+					{
+						dat=' ';
+					}
+					else
+					{
+						switch(dat)
+						{
+							case '0':   dat='9';break;
+							default:	dat--;	break;
+						}
+						if(dat<'0'||dat>'9')dat='0';
+					}
+				}
+				break;
+				
+				case 'f':  // 浮点数
+				case 'F':  // 浮点数
+				{
+					if(g_set_dis[focus].cursor == 0)
+					{
+						dat=' ';
+					}
+					else
+					{
+						switch(dat)
+						{
+							case '9':
+								if((g_set_dis[focus].cursor == g_set_dis[focus].lenth-1)
+									&& (!_set_is_have_point()))
+								{
+									dat='.';  /*防止没有小数点的情况出现*/
+								}
+								else
+								{
+									dat='0';
+								}
+							break;
+							
+							case '.':	
+								_set_move_point(0);
+							break;
+							
+							default:
+								if(dat>='0' && dat<='9')
+								{
+									dat--;
+								}
+								else 
+								{
+									dat='0';							
+								}
+							break;
+						}
+					}	
+				}
+				break;
+				
+				default:
+				{
+					dat='0';
+				}
+				break;
+			}
+
+			// 修改内容装载入字符串
+			if(dat!='.')
+			{
+				g_set_dis[focus].str[SET_DATA][g_set_dis[focus].cursor] = dat;
+			}
+		}
+
+		// 将修改内容转换为数值
+		_set_get_modify_value();
+	}
+
+	// 更新显示
+	_set_modify_update(g_page_cur.cur_focus);
+	
+	// 当前聚焦定值重新刷新
+	g_item_update.data[g_page_cur.cur_focus] = 1;
+	
+	return -1;
+}
+/******************************************************************************
+函数名称:	_sub_key_query
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	减键-查询
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _sub_key_query(void)
+{
+	// 仅一屏,不翻屏
+	if (g_page_cur.wnd_num > 1)
+	{		
+		// 当前屏非最大,下翻一屏
+		if (g_page_cur.cur_wnd > 0)
+		{
+			g_page_cur.cur_wnd--;
+		}		
+		else
+		{
+			g_page_cur.cur_wnd = g_page_cur.wnd_num-1;
+		}
+		check_cur_wnd_item();
+	}
+	else
+	{
+		return 1;
+	}
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_esc_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	返回键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _esc_key_menu(void)
+{
+	// 保留当前菜单现场
+	g_item_update.autoback = 0;
+	g_page_cur.cur_focus = 0;
+	g_page_cur.cur_wnd = 0;
+	check_cur_wnd_item();
+	page_table[g_page_cur.menu_cur] = g_page_cur;
+
+	// 返回上一级菜单
+	g_page_cur = page_table[g_page_cur.menu_m];
+	check_cur_wnd_item();
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_esc_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	返回键-设置
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _esc_key_set(void)
+{
+	u8 master_menu;
+
+	// 保留当前编辑状态,以便返回
+	g_page_set = g_page_cur;
+
+	// 保留当前菜单现场
+	g_page_cur.cur_focus = 0;
+	g_page_cur.cur_wnd = 0;
+	check_cur_wnd_item();
+	page_table[g_page_cur.menu_cur] = g_page_cur;
+
+	// 如果退出时需保存确认
+	if (menu_base_table[g_page_cur.menu_cur].save)
+	{
+		// 取出上级页面
+		master_menu = g_page_cur.menu_m;
+		// 暂存当前页面
+		g_mastermenu = g_page_cur.menu_cur;
+		
+		// 进入保存页面
+		g_page_cur = page_table[MENU_SAVE];			
+		check_cur_wnd_item();
+		if (g_mastermenu == MENU_GLBH || g_mastermenu == MENU_LXBH
+			|| g_mastermenu == MENU_JDBH || g_mastermenu == MENU_RECLOSE || g_mastermenu == MENU_BH_STATUS
+			|| g_mastermenu == MENU_DLYX || g_mastermenu == MENU_HJS)
+		{
+			g_page_cur.menu_m = MENU_FIX_SW1 + class_GLBH.sw_idx;
+		}
+		else g_page_cur.menu_m = master_menu;
+	}
+	else
+	{
+		// 直接保存并退出
+		// 返回上一级菜单
+		g_page_cur = page_table[g_page_cur.menu_m];
+		check_cur_wnd_item();
+	}	
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_esc_key_action
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	返回键-动作
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _esc_key_action(void)
+{
+	// 保留当前菜单现场
+	g_page_cur.cur_focus = 0;
+	g_page_cur.cur_wnd = 0;
+	check_cur_wnd_item();
+	page_table[g_page_cur.menu_cur] = g_page_cur;
+
+	// 如果是保存页面,返回保存前编辑状态
+	if (g_page_cur.menu_cur == MENU_SAVE)
+	{		
+		//g_page_cur = page_table[g_mastermenu];
+		g_page_cur = g_page_set;
+		check_cur_wnd_item();
+		return 0;
+	}
+
+	// 返回上一级菜单
+	g_page_cur = page_table[g_page_cur.menu_m];
+	check_cur_wnd_item();
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_enter_key_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	确认键-菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _enter_key_menu(void)
+{
+	u8 master_menu, slave_menu;
+	u8 code;	
+	
+	// 取出当前级菜单
+	master_menu = g_page_cur.menu_cur;
+
+	// 保留当前级别操作
+	page_table[g_page_cur.menu_cur] = g_page_cur;
+
+	// 检索次级菜单
+	slave_menu = _check_slave_menu(g_page_cur.menu_cur, g_page_cur.wnd_item*g_page_cur.cur_wnd + g_page_cur.cur_focus);
+
+	code = menu_base_table[slave_menu].code;
+	// 需密码进入的菜单
+	if (code)
+	{
+		g_page_cur = page_table[MENU_PASSWORD];
+		check_cur_wnd_item();
+		g_page_cur.menu_m = master_menu;
+		g_slavemenu = slave_menu;
+	}
+	// 不需密码进入的菜单
+	else
+	{
+		g_page_cur = page_table[slave_menu];
+		check_cur_wnd_item();
+	}
+
+	// 初始化部分未初始化的页面
+	_enter_menu_init();
+	
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_enter_key_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	确认键-设置
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _enter_key_set(void)
+{
+	u8 code;
+	
+	// 如果是密码页面,进入密码检查
+	if (g_page_cur.menu_cur == MENU_PASSWORD)
+	{			
+		code = menu_base_table[g_slavemenu].code;
+		Add_Clear_Screen();
+		_password_check(code);		
+		return 0;
+	}
+	
+	// 切换编辑和查看状态
+	g_set_dis[g_page_cur.cur_focus].cursor = 0;
+	g_set_dis[g_page_cur.cur_focus].modify = g_set_dis[g_page_cur.cur_focus].modify ? 0 : 1;
+
+	// 刷新一次数据显示
+	g_item_update.data[g_page_cur.cur_focus] = 1;
+	return -1;
+}
+
+/******************************************************************************
+函数名称:	_enter_key_action
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	确认键-动作类
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _enter_key_action(void)
+{
+	u8 master_menu, result;
+
+	switch(g_page_cur.menu_cur)
+	{
+		case MENU_SAVE:	// 如果是保存页面
+		{
+			// 确认
+			if (g_page_cur.cur_focus == 0)
+			{
+				// 保留当前菜单现场
+				g_page_cur.cur_focus = 0;
+				g_page_cur.cur_wnd = 0;
+				check_cur_wnd_item();
+				page_table[g_page_cur.menu_cur] = g_page_cur;
+
+				// 取出上级菜单
+				master_menu = g_page_cur.menu_m;
+
+				// 固化定值
+				result = _set_save_func(g_mastermenu);
+				
+				// 进入保存结果页面
+				g_page_cur = page_table[MENU_SAVE_RESULT];
+				check_cur_wnd_item();
+				g_page_cur.menu_m = master_menu;			
+				_save_result_init(result);
+
+				// 定值设置越限页面
+				
+			}
+			// 取消
+			else if (g_page_cur.cur_focus == 1)
+			{
+			    if(g_mastermenu == MENU_RUN_PARA) {
+		            rt_free(run_para_pick_set);
+		            rt_free(run_para_setbuf);
+		            run_para_pick_set = NULL;
+		            run_para_setbuf   = NULL;
+			    }
+				_esc_key_menu();
+			}
+		}
+		break;
+
+		case MENU_TEST_KC://对应关系还需修改 问题 zwg
+		{			
+			u8 index=0;
+			if (g_page_cur.cur_wnd > 0)
+			{
+				index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+			}
+
+			if (g_action.action[g_page_cur.cur_focus] == 0)
+			{
+				bMaintain_test = 1;
+				if (g_equ_config_do[g_cfg_index.kc[g_page_cur.cur_focus+index][0]].owner == 0)
+				{
+					sw_do_pub(g_cfg_index.kc[g_page_cur.cur_focus+index][1],SW_DO_TYPE_ON);
+				}
+				else
+				{
+					//DTU4 需单独合一下预置继电器
+					sw_do(g_equ_config_do[g_cfg_index.kc[g_page_cur.cur_focus+index][0]].owner-1, \
+					g_cfg_index.kc[g_page_cur.cur_focus+index][1],SW_DO_TYPE_SELECT_ON);
+
+					sw_do(g_equ_config_do[g_cfg_index.kc[g_page_cur.cur_focus+index][0]].owner-1, 
+						  g_cfg_index.kc[g_page_cur.cur_focus+index][1], 
+						  SW_DO_TYPE_ON);
+				}	
+				ustimer_delay(250*USTIMER_MS);
+				bMaintain_test = 0;
+				g_action.action[g_page_cur.cur_focus] = 1;
+			}
+			else
+			{
+				g_action.action[g_page_cur.cur_focus] = 0;				
+			}
+
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+
+			return -1;
+		}
+		break;
+
+		case MENU_BAT:
+		{			
+			u8 index =0;
+			if (g_page_cur.cur_wnd > 0)
+			{
+				index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+			}
+
+			if (g_action.action[g_page_cur.cur_focus] == 0)
+			{
+				if (g_equ_config_do[g_cfg_index.kc[g_page_cur.cur_focus+index+PUB_DO_DCHH][0]].owner == 0)
+				{
+					sw_do_pub(g_cfg_index.kc[g_page_cur.cur_focus+index+PUB_DO_DCHH][1],SW_DO_TYPE_ON);
+
+					if (g_cfg_index.kc[g_page_cur.cur_focus+index+PUB_DO_DCHH][1] == PUB_DO_DCHH)
+					{
+						g_batt_mana.hhstart_from = FROM_DEVICE;
+					}
+					if (g_cfg_index.kc[g_page_cur.cur_focus+index+PUB_DO_DCHH][1] == PUB_DO_HHTC)
+					{
+						g_batt_mana.hhquit_from = FROM_DEVICE;
+					}
+				}
+				g_action.action[g_page_cur.cur_focus] = 1;
+			}
+			else
+			{
+				g_action.action[g_page_cur.cur_focus] = 0;
+			}
+
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+
+			return -1;
+		}
+		break;
+
+		case MENU_CLR:
+		{
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_CLR_SJ)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					soe_clear_ev();
+					soe_record_opt(EV_CLEAR_SOE,0);
+					g_action.action[g_page_cur.cur_focus] = 1;
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}
+			}
+			else if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_CLR_CZ)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					soe_clear_opt();
+					soe_record_opt(EV_CLEAR_OPE,0);
+					g_action.action[g_page_cur.cur_focus] = 1;
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}
+			}
+
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+			
+			return -1;
+		}
+		break;
+
+		case MENU_TEST_HMI:
+		{
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_TEST_LCD)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					add_led_test(TEST_LCD);
+					g_action.action[g_page_cur.cur_focus] = 1;
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}				
+			}
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_TEST_LED)
+			{
+				if(g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					add_led_test(TEST_LED);
+					g_action.action[g_page_cur.cur_focus] = 1;
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}				
+			}
+
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+			
+			return -1;
+		}
+		break;
+
+		case MENU_ADJUST_AC:
+		{
+			if (g_action.action[g_page_cur.cur_focus] == 0)
+			{
+				ac_adjust_result = sw_auto_adjust(-1);
+
+				if (ac_adjust_result == 0)
+				{
+					g_action.action[g_page_cur.cur_focus] = 1;
+				}
+				else
+				{
+					// 保存页面
+					page_table[g_page_cur.menu_cur] = g_page_cur;
+	
+					// 进入校准失败页面
+					g_page_cur = page_table[MENU_ADJUST_RESULT];
+
+					check_cur_wnd_item();
+					
+					// 初始化部分未初始化的页面
+					_enter_menu_init();
+					
+					return 0;
+				}
+			}
+			else
+			{
+				g_action.action[g_page_cur.cur_focus] = 0;
+			}				
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+
+			return -1;
+		}
+		break;
+
+		case MENU_ADJUST_DC:
+		{
+			int ret=0;
+			static int adjust_flag=0;
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_ADJUST_DC10)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					ret = sw_adjust_dc_0();
+					if (ret == 0)
+					{
+						g_action.action[g_page_cur.cur_focus] = 1;
+						adjust_flag = 1;
+					}
+					else
+					{
+						g_action.action[g_page_cur.cur_focus] = 2;
+					}
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}	
+			}
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_ADJUST_DC50)
+			{
+				if ((g_action.action[g_page_cur.cur_focus] == 0) && (adjust_flag == 1))
+				{
+					ret = sw_adjust_dc_1();
+					adjust_flag = 0;
+					if (ret == 0)
+					{
+						g_action.action[g_page_cur.cur_focus] = 1;
+					}
+					else
+					{
+						g_action.action[g_page_cur.cur_focus] = 2;
+					}
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}	
+			}
+			g_item_update.data[g_page_cur.cur_focus] = 1;
+
+			return -1;
+		}
+		break;
+
+		case MENU_RMT:	// 如果是保存页面
+		{
+			if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_RMT_PAIR)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{	
+					g_action.action[g_page_cur.cur_focus] = 1;
+
+					add_rmt_pair(RMT_PAIR);
+					// 保存页面
+					page_table[g_page_cur.menu_cur] = g_page_cur;
+	
+					// 进入遥控器配对页面
+					g_page_cur = page_table[MENU_RMT_PAIR];
+
+					check_cur_wnd_item();
+					// 初始化部分未初始化的页面
+					_enter_menu_init();
+
+					// 启动计时
+					rmtpair_dely[0][0] = 1;
+					rmtpair_dely[0][1] = ustimer_get_origin();
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}				
+			}
+			else if (g_page_cur.page_item[g_page_cur.cur_focus].no == ITEM_DEL_PAIR)
+			{
+				if (g_action.action[g_page_cur.cur_focus] == 0)
+				{
+					g_action.action[g_page_cur.cur_focus] = 1;
+					add_rmt_pair(RMT_CLRPAIR);
+					// 保存页面
+					page_table[g_page_cur.menu_cur] = g_page_cur;
+
+					// 进入遥控器配对页面
+					g_page_cur = page_table[MENU_DEL_PAIR];
+
+					check_cur_wnd_item();
+					
+					// 初始化部分未初始化的页面
+					_enter_menu_init();
+					
+					// 启动计时
+					rmtpair_dely[1][0] = 1;
+					rmtpair_dely[1][1] = ustimer_get_origin();
+				}
+				else
+				{
+					g_action.action[g_page_cur.cur_focus] = 0;
+				}				
+			}
+		}
+		break;
+
+	}
+	
+	return 0;
+}
+
+/******************************************************************************
+函数版本:   01.01
+创建作者:   康文广
+创建日期:   2021-6-15
+函数说明:   根据给定长度截断字符串
+参数说明:   pin_str:截断前的字符串
+             pout_str:截断后的字符串 (含结束符)
+             cutoff_len: 截断长度
+返回值:     返回截断后的字符串长度
+修改记录:
+*/
+static u8 _cutoff_string(char *pin_str, char *pout_str, u8 cutoff_len)
+{
+    u8  i=0;
+    u8  cnt=0;
+
+    i=0;
+    while((i < cutoff_len) && (pin_str[i] !=0)) {
+        if((u8)pin_str[i] > 0x80) {
+            if(i+2 <= cutoff_len){
+                pout_str[cnt++] = pin_str[i];
+                pout_str[cnt++] = pin_str[i+1];
+                i += 2;
+            }else{  //half
+                break;
+            }
+        }else{
+            pout_str[cnt++] = pin_str[i];
+            i++;
+        }
+    }
+    pout_str[cnt] = 0;
+
+    return  cnt;
+}
+
+/******************************************************************************
+函数名称:	_check_slave_menu
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	获取子菜单
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _check_slave_menu(u8 menu_m, u8 cur_focus)
+{
+	int i;
+
+	for (i=0; i<slave_menu_num; i++)
+	{
+		if (menu_m == slave_table[i].menu_m)
+		{
+			return slave_table[i].menu_s[cur_focus];
+		}
+	}
+	return -1;
+}
+
+/******************************************************************************
+函数名称:	_wnd_item_num_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	实体、屏数初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _wnd_item_num_init(void)
+{
+	// 页面分配的总屏数
+	if (g_page_cur.item_num <= g_page_cur.wnd_item)
+	{
+		g_page_cur.wnd_num = 1;
+	}
+	else
+	{
+		g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+		if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+		{
+			g_page_cur.wnd_num++;
+		}
+	}
+
+	// 获取当前屏分配的实体数
+	check_cur_wnd_item();
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_enter_menu_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	初始化之前未初始化的内容
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _enter_menu_init(void)
+{	
+	switch (g_page_cur.menu_cur)
+	{
+
+#if ((SWITCH_NUM_MAX == 16) || (SWITCH_NUM_MAX == 6) || (SWITCH_NUM_MAX == 4) || (SWITCH_NUM_MAX == 1) )
+		case MENU_FIX_SW1:
+#if ((SWITCH_NUM_MAX == 16) || (SWITCH_NUM_MAX == 6) || (SWITCH_NUM_MAX == 4) )			
+		case MENU_FIX_SW2:
+		case MENU_FIX_SW3:
+		case MENU_FIX_SW4:
+#endif	
+#if ((SWITCH_NUM_MAX == 16) || (SWITCH_NUM_MAX == 6) )			
+		case MENU_FIX_SW5:
+		case MENU_FIX_SW6:
+#endif	
+#if SWITCH_NUM_MAX == 16
+		case MENU_FIX_SW7:
+		case MENU_FIX_SW8:
+		case MENU_FIX_SW9:
+		case MENU_FIX_SW10:
+		case MENU_FIX_SW11:
+		case MENU_FIX_SW12:
+		case MENU_FIX_SW13:
+		case MENU_FIX_SW14:
+		case MENU_FIX_SW15:
+		case MENU_FIX_SW16:
+#endif	
+
+		{
+		    class_GLBH.sw_idx = g_page_cur.menu_cur - MENU_FIX_SW1;
+		    class_LXBH.sw_idx = g_page_cur.menu_cur - MENU_FIX_SW1;
+		    class_JDBH.sw_idx = g_page_cur.menu_cur - MENU_FIX_SW1;
+		    class_reclose.sw_idx = g_page_cur.menu_cur - MENU_FIX_SW1;
+			class_BH_sts.sw_idx =  g_page_cur.menu_cur - MENU_FIX_SW1;
+			class_DLYX.sw_idx =  g_page_cur.menu_cur - MENU_FIX_SW1;
+			class_HJS.sw_idx =  g_page_cur.menu_cur - MENU_FIX_SW1;
+		    g_page_cur.cur_wnd_item = sw_menu_num;
+		}
+		break;
+#endif
+		case MENU_FIX_PUB:
+		case MENU_PARA:
+		case MENU_RUN_PARA:
+		case MENU_FAULT_RESET:
+		case MENU_INFIX:
+		case MENU_TIMESET:
+		case MENU_PASSWORD:
+		case MENU_CODE:
+		{
+			_set_init(g_page_cur.menu_cur);
+		}
+		break;
+		
+        case MENU_GLBH:
+        case MENU_LXBH:
+        case MENU_JDBH:
+        case MENU_RECLOSE:
+		case MENU_BH_STATUS:
+		case MENU_DLYX:
+		case MENU_HJS:
+        {
+            _set_init(g_page_cur.menu_cur);
+        }
+		break;
+
+		case MENU_TIME:
+		{
+			g_page_cur.wnd_num = 1;
+			g_page_cur.cur_wnd = 0;
+		}
+		break;
+	
+		case MENU_SJSOE:
+		{
+			_soe_init(EEP_SOE_ADDR, g_soe_info.wEvIndex, g_soe_info.wEvNumber, g_soe_info.wEvNumber);
+			event_cur.wIndex = g_soe_info.wEvIndex;
+			event_cur.wNumber = g_soe_info.wEvNumber;
+			event_cur.wCurrent = g_soe_info.wEvNumber;
+		}
+		break;
+
+		case MENU_CZSOE:
+		{
+			_soe_init(EEP_OPERATE_ADDR, g_soe_info.wOpIndex, g_soe_info.wOpNumber, g_soe_info.wOpNumber);
+			event_cur.wIndex = g_soe_info.wOpIndex;
+			event_cur.wNumber = g_soe_info.wOpNumber;
+			event_cur.wCurrent = g_soe_info.wOpNumber;
+		}
+		break;
+
+		case MENU_INFO_EQU:
+		case MENU_COMM_PARA:
+        {
+            _info_equ_init(g_page_cur.menu_cur, g_page_cur.cur_wnd);
+        }
+        break;
+
+		case MENU_INFO_YX:
+		case MENU_INFO_YC:
+        {
+
+        }
+        break;
+
+		case MENU_INFO_ERR:
+		{
+			_info_err_init();
+		}
+		break;
+
+		case MENU_INFO_DEBUG:
+		{
+			_info_debug_init();
+		}
+		break;
+
+		case MENU_INFO_GPRS:
+		{
+			IEC101_PH_GprsInfo();
+			_info_gprs_init();
+		}
+		break;
+		
+		case MENU_PASSERR:
+		{
+			_passerr_init();
+		}
+		break;
+
+		case MENU_TEST_KC:
+		case MENU_CLR:
+		case MENU_ADJUST_AC:
+		case MENU_ADJUST_DC:	
+		case MENU_RMT:
+		{
+			memset(g_action.action, 0, 10);
+		}
+		break;
+
+		case MENU_RMT_PAIR:
+		{
+			_rmt_pair_init();
+		}
+		break;
+
+		case MENU_DEL_PAIR:
+		{
+			_rmt_delpair_init();
+		}
+		break;
+
+		case MENU_ADJUST_RESULT:
+		{
+			_ac_adjust_result_init(ac_adjust_result);
+		}
+		break;		
+	}
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_soe_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	记录查询初始化
+参数说明:	无
+返回值:  	成功返回0
+修改记录:	
+*/
+static int _soe_init(u16 addr, u16 soe_index, u16 soe_number, u16 soe_cur)
+{
+	u16 address;
+	EVENT_STRUCT tEv;
+	int soe_null=0;
+
+	_reset_page_dis();	
+	
+	// 无事件产生
+	switch (addr)
+	{
+		case EEP_SOE_ADDR:
+		{
+			if(g_soe_info.wEvNumber==0)
+			{
+				strcpy(g_page_dis.str[0],"无事件记录信息");
+				g_page_dis.str_num = 1;
+				soe_null = 1;
+			}
+		}
+		break;
+
+		case EEP_OPERATE_ADDR:
+		{
+			if(g_soe_info.wOpNumber==0)
+			{
+				strcpy(g_page_dis.str[0],"无操作记录信息");
+				g_page_dis.str_num = 1;
+				soe_null = 1;
+			}
+		}
+		break;
+	}
+
+	if (!soe_null)
+	{
+		// 读出最新条目
+		address = addr + soe_index * (sizeof(EVENT_SAVE)) + 4;
+		e2prom_read(address, (u8 *)&tEv, sizeof(EVENT_STRUCT)); 
+
+		// 刚进入事件时,显示最新的事件
+		g_page_dis.no_cur = soe_cur;
+		g_page_dis.no_num = soe_number;	
+		g_page_dis.no_index = soe_index;
+
+		// 获取打印内容
+		_soe_show(&tEv);
+	}
+
+	if (addr == 0)
+	{
+		event_Auto.tEv = g_soe_queue.soe[g_soe_info.wDpAutoShow].es_ev;
+
+		// 刚进入事件时,显示最新的事件
+		g_page_dis.no_cur = soe_cur;
+		g_page_dis.no_num = soe_number;	
+		g_page_dis.no_index = soe_index;
+
+		_soe_show(&event_Auto.tEv);
+		event_cur.wIndex = g_soe_info.wEvIndex;
+		event_cur.wNumber = g_soe_info.wEvNumber;
+		event_cur.wCurrent = g_soe_info.wEvNumber;		
+	}
+	// 需显示行
+	g_page_cur.item_num = g_page_dis.str_num;
+
+	g_page_cur.cur_wnd = 0;
+	_wnd_item_num_init();
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_soe_show
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	打印记录
+参数说明:	常用到"%-16.16s",是为了写满一行,以避免出现花屏
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _soe_show(EVENT_STRUCT *pe)
+{
+	EVENT_STRUCT *er = pe;
+	struct page_dis *p = &g_page_dis;
+	char tmpstr[24]={0};
+	char tmpstr1[24]={0};
+	struct rtc_time_t tTime;
+	u8 soe_type;
+
+	// 初始化
+	p->str_num = 0;	
+
+	// 将事件的时间转为rtc_time方式
+	timespec_to_rtc(er->ts,&tTime,1);
+
+	if (lcdtype != SMALL)
+	{	
+		// 第一行
+		// 填写序号、年月日
+		sprintf((char *)p->str[p->str_num++], "%02d-%02d-%02d %03d/%03d", 
+			tTime.year, 
+			tTime.month, 
+			tTime.day,
+			p->no_cur,
+			p->no_num);
+		// 第二行
+		// 填写时分秒毫秒
+		sprintf((char *)p->str[p->str_num++], "%02d:%02d:%02d.%03d    ", 
+			tTime.hour, 
+			tTime.min, 
+			(tTime.ms/1000), 
+			(tTime.ms%1000));
+
+	}
+	else
+	{
+		// 第一行
+		// 填写时分秒毫秒
+		sprintf((char *)p->str[p->str_num++], "%03d %02d:%02d:%02d.%03d", 
+			p->no_cur,
+			tTime.hour, 
+			tTime.min, 
+			(tTime.ms/1000), 
+			(tTime.ms%1000));
+
+	}
+
+	// 事件记录,操作记录
+	soe_type = er->ev_type&SOE_TYPE_MASK;
+	if(soe_type==SOE_TYPE_EV || soe_type==SOE_TYPE_OPT)   
+	{
+		int i;
+		int ev_sw=0;
+//		int len=0;
+		u16 code;
+		const SOE_DEF * psoe;
+		
+		if(er->ev_code>=EV_NUMBER)
+		{
+			// 第三行
+			// 填写事件名称
+			sprintf(tmpstr, "错误代码:%d", er->ev_code);
+			sprintf((char *)p->str[p->str_num++], "%-16.16s", tmpstr);
+			return 0;
+		}		
+
+		if (er->ev_code < EV_SW_NUM)
+		{
+			code = er->ev_code;
+			ev_sw = 1;
+		}
+		else if ((er->ev_code >= EV_SW_NUM)&& (er->ev_code < EV_PUB_START))
+		{
+			code = er->ev_code % EV_SW_NUM;
+			ev_sw = (er->ev_code / EV_SW_NUM) + 1;
+		}
+		else
+		{
+			code = er->ev_code - EV_SW_NUM*(SWITCH_NUM_MAX-1);
+		}
+		
+		#if SWITCH_NUM_MAX != 1
+		{
+			if ((ev_sw > 0) && (ev_sw < SWITCH_NUM_MAX))
+			{
+				sprintf(p->str[p->str_num++],"开关%02d ",ev_sw);
+			//	len = strlen(p->str[p->str_num]);
+			}
+		}
+		#endif
+
+		psoe=&tAllSOE[code];		
+		
+		// 置1 ,产生,显示参数
+		if(soe_ev_is_on(er))
+		{		
+			// 第三行
+			// 填写事件名称
+			sprintf((char *)p->str[p->str_num++], "%-16.16s", psoe->strName);
+
+			// 第四行~第六行
+			// 填写故障记录			
+			for(i=0;i<3;i++)
+			{
+				u8 index = (psoe->Attrib[i]&0x1f);
+				
+				if(index)
+				{
+					switch((psoe->Attrib[i]>>5)&0x07)
+					{
+						case 0:  // 浮点数
+							FUC_Get_LongValue_String(er->ev_arg[i],tmpstr1);
+							sprintf((char*)tmpstr,"%s=%s%s",ev_para[index].strName,tmpstr1,g_unit[ev_para[index].byNo].name);
+						break;
+						
+						case 1: // 整型值
+							sprintf(tmpstr,"%s=%d%s",ev_para[index].strName,er->ev_arg[i],g_unit[ev_para[index].byNo].name);
+						break;
+
+						case 2: // 遥控操作,为适应液晶的显示尺寸,将遥遥控来源拆成两行 zwg
+						{
+							BYTE sw=(er->ev_arg[0]>>8)&0xff; //开关号
+							BYTE no=(er->ev_arg[0]>>0)&0xff;	//序号
+							char *ykowner;
+							ykowner=get_yk_owner((er->ev_arg[0]>>16)&0xff);
+							if(sw==0)
+							{
+								if (i==0)
+								{
+									sprintf(tmpstr,"%s",ykowner);
+								}
+								else if (i==1)
+								{
+									sprintf(tmpstr,"公共开出%02d",no);
+								}								
+							}
+							else
+							{
+								if (i==0)
+								{
+									sprintf(tmpstr,"%s",ykowner);
+								}
+								else if (i==1)
+								{
+									sprintf(tmpstr,"开关%02d开出%02d",sw,no);	// 修复遥控事件记录查询不显示开关号的问题 	modify by zhy 20201016
+								}
+							}
+						}						
+						break;
+												
+						case 3: // 压板操作
+						{
+							strcpy(tmpstr,"投入");
+						}						
+						break;	
+							
+						default:strcpy(tmpstr,"参数错误");		
+						break;
+					}
+					if (((psoe->Attrib[i]>>5)&0x07) == 3)
+					{
+						memset(p->str[p->str_num--], 0, 18);
+						strcpy((char *)p->str[p->str_num],psoe->strName);
+						strcat((char *)p->str[p->str_num++],tmpstr);
+					}
+					else
+					{
+						sprintf((char *)p->str[p->str_num++],"%-16.16s",tmpstr);
+					}
+				}
+			}
+		}
+		// 置 0,显示返回值
+		else 
+		{
+			// 第三行
+			// 填写事件名称
+			strcpy((char *)p->str[p->str_num],psoe->strName);
+			strcat((char *)p->str[p->str_num++],ev_back[(psoe->soe_def&0x03)]);
+		}
+		
+	}
+	// 遥信变位记录
+	else  if(soe_type==SOE_TYPE_YX)
+	{
+		u8 solt=(u8)(er->ev_code>>8);	//板卡号
+		u8 dino=(u8)(er->ev_code);		//遥信号
+	
+		// 第三行
+		// 填写事件名称
+		// 采用160x160液晶显示遥信乱码	  add by zhy 2020.08.03
+		// sprintf((char *)p->str[p->str_num], "%-14.14s", equ_di_name(solt,dino)); //开入对应的开关遥信名称
+		if(soe_ev_is_on(er)) // 置1 ,产生,显示参数
+		{
+			strcpy(tmpstr,"合");
+		}
+		else
+		{
+			strcpy(tmpstr,"分");
+
+		}
+		strcpy((char *)p->str[p->str_num],equ_di_name(solt,dino));	// add by zhy 2020.08.03
+		strcat((char *)p->str[p->str_num++],tmpstr);
+	}	
+ 	else  if(soe_type==SOE_TYPE_LNK )
+	{
+		char name[TRANS_SZ_BUF_LEN];
+		LINK_TABLE * lt;
+
+		lt = (LINK_TABLE *)er->ev_arg[0];
+		tbl_getname(RES_TYPE_YX,lt->tbl_index,name);
+
+		// 第三行
+		// 填写事件名称
+		// name[0] = 0;
+		sprintf((char *)p->str[p->str_num], "%-16.16s", name); //开入对应的开关遥信名称
+		if(soe_ev_is_on(er)) // 置1 ,产生,显示参数
+		{
+			strcpy(tmpstr,"合");
+		}
+		else
+		{
+			strcpy(tmpstr,"分");
+
+		}
+		strcat((char *)p->str[p->str_num++],tmpstr);
+	}	
+ 	// 双点变位记录
+ 	else if(soe_type==SOE_TYPE_DPI)
+	{
+		sprintf((char *)p->str[p->str_num++],"双点[%04x]: %d",g_di_db_table[er->ev_code].cp,er->ev_value); 
+ 	}
+ 	// PLC变位记录
+ 	else if(soe_type==SOE_TYPE_PLC)
+	{
+		int  index;
+ 	    int  cutoffLen;
+ 	    char name[TRANS_SZ_BUF_LEN]={0};
+        int  chars_per_line = sizeof(p->str[0])- 2;
+
+		sprintf((char *)p->str[p->str_num++],"PLC[%04x]: 值%d",g_plc[er->ev_code].cp, er->ev_value);
+
+		index = tbl_cp2index(g_plc[er->ev_code].cp);
+		if(index >= 0){
+		    tbl_getname(RES_TYPE_YX, index, name);
+		    if(strlen(name) > chars_per_line) {
+		        cutoffLen = _cutoff_string(name, (char *)p->str[p->str_num], chars_per_line);
+		        p->str[p->str_num++][chars_per_line] = 0;
+		        _cutoff_string(name+cutoffLen, (char *)p->str[p->str_num++], chars_per_line);
+		    }else{
+		        _cutoff_string(name, (char *)p->str[p->str_num++], chars_per_line);
+		    }
+		    p->str[p->str_num][chars_per_line] = 0;
+
+		}
+ 	}
+	else
+	{
+		sprintf(tmpstr,"未知类型:%d",er->ev_code);
+		sprintf((char *)p->str[p->str_num++],"%-16.16s",tmpstr);
+	}		
+
+	if (lcdtype == SMALL)
+	{
+		// 最后一行
+		// 填写序号、年月日
+		sprintf((char *)p->str[p->str_num++], "20%02d-%02d-%02d", 
+			tTime.year, 
+			tTime.month, 
+			tTime.day);
+		sprintf((char *)p->str[p->str_num++], "%02d:%02d:%02d.%03d", 
+			tTime.hour, 
+			tTime.min, 
+			(tTime.ms/1000), 
+			(tTime.ms%1000));
+
+	}
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_soe_auto_check
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	突发事件巡检
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _soe_auto_check(void)
+{
+	if(g_page_cur.menu_cur != MENU_MAIN 
+	&&g_page_cur.menu_cur != MENU_EVENT) // 主菜单弹窗
+	{
+		g_soe_info.bDpNew = false;
+		return -2;
+	}
+
+	if(!g_soe_info.bDpNew) //没有事件产生
+	{
+		return -1;
+	}
+	g_soe_info.bDpNew = false;
+
+	// 若背光关闭,即打开背光
+	if (g_tLcdComm.tLight.light != LIGHT_ON)
+	{
+		g_tLcdComm.tLight.light = LIGHT_ON;
+		g_tLcdComm.tLight.flag = true;
+	}
+	
+	// 进入突发事件页面
+	g_page_cur = page_table[MENU_EVENT];
+	check_cur_wnd_item();
+	g_page_cur.menu_m = MENU_MAIN;
+
+	// 若面板未清屏,即清屏
+	if (!g_tLcdComm.bClrflag)
+	{
+		Add_Clear_Screen();
+		g_tLcdComm.bClrflag = true;
+	}
+	else
+	{
+		//清发送缓冲区
+		g_tLcdComm.tContinue.head=g_tLcdComm.tContinue.tail=0;
+		g_tLcdComm.tContinue.index=0;
+	}
+
+	_soe_init(EEP_SOE_ADDR, g_soe_info.wEvIndex, g_soe_info.wEvNumber, g_soe_info.wEvNumber);
+	event_cur.wIndex = g_soe_info.wEvIndex;
+	event_cur.wNumber = g_soe_info.wEvNumber;
+	event_cur.wCurrent = g_soe_info.wEvNumber;
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_info_err_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	错误信息显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _info_err_init(void)
+{
+	int i, j=0;
+	int err[8];
+	int errno=0;
+	for(i=0;i<ERR_CODE_NUM;i++)
+	{
+		if(rt_err_test(i)>0)
+		{
+			errno++;
+			err[j] = i;
+			j++;
+		}		
+	}
+
+	// 需显示行
+	// 错误信息少于8个,更新实体总数
+	if(errno == 0)
+	{
+		g_page_cur.item_num = 1;
+	}	
+	else if (errno < INFO_ERR_QUERY)
+	{
+		g_page_cur.item_num = errno;
+	}
+	
+	if(errno == 0)
+	{
+		strcpy(g_page_dis.str[0],"无错误信息");
+	}
+	else
+	{
+		for (i=0; i<errno; i++)
+		{
+			sprintf(g_page_dis.str[i],"%-17.17s",rt_err_msg(err[i]));
+		}
+	}
+	
+	_wnd_item_num_init();
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_info_debug_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	调试信息显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _info_debug_init(void)
+{
+	int i=0;
+	int debug_port;
+	char * acteth;
+
+	// 取出调试网口
+	acteth = env_get_info(ENV_ETHACT);
+	if(acteth != NULL)
+	{
+		if(strcmp(acteth,"FEC0") == 0)
+		{
+			debug_port = 0;	
+		}
+		else if(strcmp(acteth,"FEC1") == 0)
+		{
+			debug_port = 1;	
+		}
+		else if(strcmp(acteth,"DM9000") == 0)
+		{
+			debug_port = 2;	
+		} 
+		else 
+		{
+			debug_port = 0;			
+		}	
+		
+	}
+	else 
+	{
+		debug_port = 0;			
+			
+	}
+
+	sprintf(g_page_dis.str[i++],"调试串口:%d",g_con_uart_index);
+	strcpy(g_page_dis.str[i++],"115200,无校验");
+	
+	sprintf(g_page_dis.str[i++],"调试网口:%d",debug_port+1);
+	
+	strcpy(g_page_dis.str[i++],"I P 地址:");
+	sprintf(g_page_dis.str[i++],"%s",env_get_info(ENV_IPADDR));
+	
+	strcpy(g_page_dis.str[i++],"MASK地址:");
+	sprintf(g_page_dis.str[i++],"%s",env_get_info(ENV_NETMASK));
+	
+	strcpy(g_page_dis.str[i++],"GATE地址:");
+	sprintf(g_page_dis.str[i++],"%s",env_get_info(ENV_GATEWAYIP));	
+
+	_wnd_item_num_init();
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_info_gprs_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	GPRS信息显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _info_gprs_init(void)
+{
+	int i, num;
+	
+	//获取内部GPRS状态信息
+	num = gprs_get_info();
+
+	// 如果有信息,存入显示缓存
+	if (num != 0)
+	{
+		g_page_dis.str_num = num;
+		for (i=0; i<g_page_dis.str_num; i++)
+		{
+			memcpy(&g_page_dis.str[i], &strGprsInf[i], 18);
+		}
+	}
+	// 如果没有信息,且是第一次刷新,进入等待页面
+	else if (!gprs_info_up[0])
+	{
+		strcpy(g_page_dis.str[0],"  信息获取中... ");
+		g_page_dis.str_num = 1;
+	}	
+
+	if ((!gprs_info_up[0]) || (g_page_cur.item_num != g_page_dis.str_num))
+	{
+		// 需显示行
+		g_page_cur.item_num = g_page_dis.str_num;
+		_wnd_item_num_init();
+		gprs_info_up[0] = 1;
+		gprs_info_up[1] = ustimer_get_origin();
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数说明:   装置信息显示初始化
+函数版本:   01.01
+创建作者:   KangWenguang
+创建日期:   2021-06-10
+参数说明:   无
+返回值:    成功返回0.
+修改记录:
+*/
+#define  max_line_char   18
+
+struct _disp_page
+{
+     u8  begin;
+     u8  end;
+     u8  lines;
+};
+static struct _disp_page s_disp_equ[] =
+{
+    {FIXED_SET_EQU,   FIXED_SET_HVR,   9},  //公司名 用两行显示
+    {FIXED_SET_SVR,   FIXED_SET_TPE,   8},
+    {FIXED_SET_ID,    FIXED_SET_MAC1,  5},  //终端ID号用两行显示
+};
+static int s_disp_equ_pages = sizeof( s_disp_equ ) / sizeof(s_disp_equ[0]);
+
+static struct _disp_page s_disp_comm_para[] =
+{ 
+   {0,    0,  0},  
+};
+static int s_disp_comm_pages = sizeof( s_disp_comm_para ) / sizeof(s_disp_comm_para[0]);
+
+
+static int _info_equ_init(u8 menu_no, u8 wnd_no)
+{
+    int  i=0;
+    int  idx=0;
+    int  len=0;
+    int  cutoff_len;
+    int  line_num = INFO_EQU_QUERY;
+    char buf[48] ={0};
+    int  begin, end;
+
+    if(menu_no == MENU_INFO_EQU) {
+        begin    = s_disp_equ[wnd_no].begin;
+        end      = s_disp_equ[wnd_no].end;
+        line_num = s_disp_equ[wnd_no].lines;
+    }else{  //MENU_COMM_PARA
+        begin    = s_disp_comm_para[wnd_no].begin;
+        end      = s_disp_comm_para[wnd_no].end;
+        line_num = s_disp_comm_para[wnd_no].lines;
+    }
+
+	for ( i = 0; i < 16; i++)
+	{
+		memset(g_page_dis.str[i], 0, sizeof(u8)*20);
+	}
+
+    for(i=begin; i<=end && idx <line_num; i++) {
+        //name
+        sprintf(buf, "%s[%04X]:", tfixedsettable[i].name, tfixedsettable[i].di);
+        cutoff_len = _cutoff_string(buf, g_page_dis.str[idx], max_line_char);
+        g_page_dis.str[idx][cutoff_len] = 0;
+        idx++;
+
+        len = strlen(buf);
+        if(len >= max_line_char) {
+            cutoff_len = _cutoff_string(buf+cutoff_len, (char *)g_page_dis.str[idx], max_line_char);
+            g_page_dis.str[idx][cutoff_len] = 0;
+            idx++;
+        }
+
+        //content
+        set_get_fixed_arg(i,buf,48);
+        cutoff_len = _cutoff_string(buf, g_page_dis.str[idx], max_line_char);
+        g_page_dis.str[idx][cutoff_len] = 0;
+        idx++;
+
+        len = strlen(buf);
+        if(len >= max_line_char) {
+            cutoff_len = _cutoff_string(buf+cutoff_len, (char *)g_page_dis.str[idx], max_line_char);
+            g_page_dis.str[idx][cutoff_len] = 0;
+            idx++;
+        }
+    }
+
+    if(menu_no == MENU_INFO_EQU) {
+        for(i=0; i<s_disp_equ_pages; i++) {
+            g_page_cur.item_num += s_disp_equ[wnd_no].lines;
+        }
+        g_page_cur.wnd_num  = s_disp_equ_pages;
+
+    }else{   //MENU_COMM_PARA
+        for(i=0; i<s_disp_comm_pages; i++) {
+            g_page_cur.item_num += s_disp_comm_para[wnd_no].lines;
+        }
+        g_page_cur.wnd_num  = s_disp_comm_pages;
+    }
+
+    g_page_cur.wnd_item = INFO_EQU_QUERY;
+    g_page_cur.cur_wnd_item = line_num;
+
+    return 0;
+}
+
+/******************************************************************************
+函数名称:	_passerr_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	密码错误显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _passerr_init(void)
+{
+	int i=0;
+
+	strcpy(g_page_dis.str[i++],"    输入密码    ");	
+	strcpy(g_page_dis.str[i++],"  密码输入错误  ");
+	_wnd_item_num_init();
+
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_rmt_pair_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	遥控器配对显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _rmt_pair_init(void)
+{
+	int i=0;
+
+	strcpy(g_page_dis.str[i++]," 请在30秒内按下 ");	
+	strcpy(g_page_dis.str[i++],"  遥控器任意键  ");
+	_wnd_item_num_init();
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_rmt_delpair_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	遥控器清除配对显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _rmt_delpair_init(void)
+{
+	int i=0;
+
+	strcpy(g_page_dis.str[i++],"请耐心等待10秒后 ");	
+	strcpy(g_page_dis.str[i++],"  再操作遥控器  ");
+	_wnd_item_num_init();
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_save_result_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	保存结果显示初始化
+参数说明:	result:0 成功,1 失败
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _save_result_init(u8 result)
+{
+	strcpy(g_page_dis.str[0],"保存");
+
+	if (result == 1)
+	{
+		//保存成功自动返回上一级菜单,失败时则不自动返回
+		g_item_update.autoback = 1;
+		g_item_update.autoback_dly = dTCounter;
+
+		strcat(g_page_dis.str[0],"成功");
+	}
+	else
+	{
+		strcat(g_page_dis.str[0],"失败");
+	}
+	
+	_wnd_item_num_init();
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_ac_adjust_result_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	交流校准结果显示初始化
+参数说明:	result:0 成功,1 失败
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _ac_adjust_result_init(int result)
+{
+
+	if(result == 0)
+	{
+		strcpy(g_page_dis.str[0],"通道校正成功");
+	}
+	else if(result == -1)
+	{
+		strcpy(g_page_dis.str[0],"输入校正值太大");
+	}
+	else if(result == -2)
+	{
+		strcpy(g_page_dis.str[0],"通道系数超范围");
+	}
+	else if(result == -3)
+	{
+		strcpy(g_page_dis.str[0],"输入角度值太小");
+	}
+	else if(result == -4)
+	{
+		strcpy(g_page_dis.str[0],"输入角度值太小");
+	}
+	else if(result == -5)
+	{
+		strcpy(g_page_dis.str[0],"角度系数超范围");
+	}
+	else if(result == -6)
+	{
+		strcpy(g_page_dis.str[0],"系数保存错误");
+	}
+	else 
+	{
+		strcpy(g_page_dis.str[0],"未知错误");
+	}
+	
+	_wnd_item_num_init();
+	return 0;
+}
+/******************************************************************************
+函数名称:	_set_get_list_man_len
+函数版本:	01.01
+创建作者:	 
+创建日期:	2017-5-18
+函数说明:	获取list字符串的最大长度
+参数说明:	
+			pTable: 整定值参数表结构
+返回值:  	list字符串的最大长度.
+修改记录:	
+*/
+static int _set_get_list_man_len(const TSETTABLE *pTable)
+{
+	int i;
+	int len=0, max=0;
+
+	for(i=0; i< pTable->listnum;i++)
+	{
+		len = strlen(pTable->list[i].str);
+		if(len > max )
+		{
+			max = len;
+		}
+	}
+
+	return max;
+}
+static int _get_i_by_sw0idx(u8 sw0idx)
+{
+    int i;
+
+    for(i=0; i<g_rmt_para_disp.sw0_idx_sum; i++ ){
+        if(g_rmt_para_disp.sw0_idx[i] == sw0idx){
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+static int _get_rmt_para_val(void)
+{
+    int i;
+    int offset=0;
+    TSETTABLE *psettbl =NULL;
+    struct grp_pick *pgroup =NULL;
+    char buf[20] ={0};
+    u8  idx_cnt[256] = {0};
+    int find_i = 0;
+
+    //公共定值
+    psettbl = (TSETTABLE *)&tPubSetTable[0];
+    if(!ReadSet(m_runsection,(void *)m_SetBuf))
+    {
+        rt_err_set(ERR_CODE_SET,0);
+        GetDefSet((float*)m_SetBuf);
+    }
+
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_PUSET];
+    for(i=0; i< pgroup->num; i++){
+        run_para_pick_set[pgroup->rmt_idx[i]] = psettbl[pgroup->grp_idx[i]];
+        run_para_setbuf[pgroup->rmt_idx[i]]   = m_SetBuf[pgroup->grp_idx[i]];
+    }
+
+    //开关定值
+    psettbl = (TSETTABLE *)&tSwSetTable[0];
+    if(!ReadSet(m_runsection,(void *)m_SetBuf))
+    {
+        rt_err_set(ERR_CODE_SET,0);
+        GetDefSet((float*)m_SetBuf);
+    }
+
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_SWSET];
+    for(i=0; i< pgroup->num; i++){
+        TSETTABLE *psettmp =NULL;
+
+        run_para_pick_set[pgroup->rmt_idx[i]] = psettbl[pgroup->grp_idx[i]];
+
+        //修改定值名称
+        psettmp = &run_para_pick_set[pgroup->rmt_idx[i]];
+
+        find_i = _get_i_by_sw0idx( pgroup->grp_idx[i]);
+		// rt_printf("RMT_GRP_SWSET find_i=%d grp_idx[%d]=%d index=%d type=%d, name=%s \r\n", find_i, i, pgroup->grp_idx[i], pgroup->rmt_idx[i],psettmp->wType, psettmp->szName);
+        if(find_i >= 0) {
+            snprintf(buf, 20, "L%02d%s", idx_cnt[find_i]+1, psettmp->szName);
+            strncpy(psettmp->szName, buf, 20);
+			// rt_printf("RMT_GRP_SWSET index=%d type=%d, name=%s \r\n", pgroup->rmt_idx[i],psettmp->wType, psettmp->szName);
+            offset = PUB_SET_NUMBER + idx_cnt[find_i]*SW_SET_NUMBER;
+            idx_cnt[find_i]++;
+
+        }else{
+            offset = PUB_SET_NUMBER;
+        }
+
+        _cutoff_string(psettmp->szName, psettmp->szName, 19);
+
+        run_para_setbuf[pgroup->rmt_idx[i]] = m_SetBuf[offset + pgroup->grp_idx[i]];
+    }
+
+    //装置参数
+    psettbl = (TSETTABLE *)&tEquipParaTable[0];
+    if(!ReadPara((void*)m_SetBuf, EEP_EQUIP_PARA_ADDR, EQUIP_PARA_NUMBER, psettbl))
+    {
+        rt_err_set(ERR_CODE_EQU_PARA,0);
+        GetDefPara((void*)m_SetBuf, EQUIP_PARA_NUMBER, psettbl);
+    }
+
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_EQSET];
+    for(i=0; i< pgroup->num; i++){
+        run_para_pick_set[pgroup->rmt_idx[i]] = psettbl[pgroup->grp_idx[i]];
+        run_para_setbuf[pgroup->rmt_idx[i]]   = m_SetBuf[pgroup->grp_idx[i]];
+    }
+
+	//内部定值
+    psettbl = (TSETTABLE *)&tCstSetTable[0];
+    if(!ReadPara((void*)m_SetBuf, EEP_CSTSET_ADDR, CSTSET_NUMBER, psettbl))
+    {
+        rt_err_set(ERR_CODE_SET_IN,0);
+        GetDefPara((float*)m_SetBuf, CSTSET_NUMBER, psettbl);
+    }
+ 
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_CSSET];
+    for(i=0; i< pgroup->num; i++){
+        run_para_pick_set[pgroup->rmt_idx[i]] = psettbl[pgroup->grp_idx[i]];
+        run_para_setbuf[pgroup->rmt_idx[i]]   = m_SetBuf[pgroup->grp_idx[i]];
+        // rt_printf("RMT_GRP_CSSET index=%d type=%d, name=%s \r\n", pgroup->rmt_idx[i],run_para_pick_set[pgroup->rmt_idx[i]].wType, run_para_pick_set[pgroup->rmt_idx[i]].szName);
+    }
+
+
+    return 0;
+}
+
+static int _save_rmt_para_val(u8 sw_num)
+{
+    int i;
+    int sw=0;
+    int offset=0;
+    TSETTABLE *psettbl =NULL;
+    struct grp_pick *pgroup =NULL;
+    u8  idx_cnt[16] = {0};
+    int find_i = 0;
+
+    _set_change_set(&run_para_pick_set[0], g_rmt_para_disp.total, offset);
+	
+    memcpy(&run_para_setbuf[0], &m_SetBuf[0], g_rmt_para_disp.total *sizeof(SET_VALUE));
+	
+    //---公共定值----
+    if(!ReadSet(m_runsection,(void *)m_SetBuf))
+    {
+        rt_err_set(ERR_CODE_SET,0);
+        GetDefSet((float*)m_SetBuf);
+    }
+    //更新相应值
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_PUSET];
+    for(i=0; i< pgroup->num; i++){
+        m_SetBuf[pgroup->grp_idx[i]] = run_para_setbuf[pgroup->rmt_idx[i]];
+    }
+
+    if(!_set_check_set(&tPubSetTable[0], PUB_SET_NUMBER, m_SetBuf))
+    {
+        soe_record_opt(EV_SET_FAIL,0);
+        return -11;
+    }
+    else if(SaveSet(m_runsection,(void *)m_SetBuf))
+    {
+        soe_record_opt(EV_SET_OK,0);
+        MakeRunSet(false);
+        rt_err_clr(ERR_CODE_SET,0);
+    }
+    else
+    {
+        soe_record_opt(EV_SET_FAIL,0);
+        return -12;
+    }
+	
+    //---开关定值----
+    if(!ReadSet(m_runsection,(void *)m_SetBuf))
+    {
+        rt_err_set(ERR_CODE_SET,0);
+        GetDefSet((float*)m_SetBuf);
+    }
+    //更新相应值
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_SWSET];
+    for(i=0; i< pgroup->num; i++) {
+        find_i = _get_i_by_sw0idx( pgroup->grp_idx[i]);
+        if(find_i >= 0) {
+            offset = PUB_SET_NUMBER + idx_cnt[find_i]*SW_SET_NUMBER;
+            idx_cnt[find_i]++;
+
+        }else{
+            offset = PUB_SET_NUMBER;
+        }
+        m_SetBuf[offset + pgroup->grp_idx[i]] = run_para_setbuf[pgroup->rmt_idx[i]];
+    }
+	
+    for(sw=0; sw < sw_num; sw++){
+        offset = PUB_SET_NUMBER + sw*SW_SET_NUMBER;
+        if(!_set_check_set(&tSwSetTable[0], SW_SET_NUMBER, &m_SetBuf[offset]))
+        {
+            soe_record_opt(EV_SET_FAIL,0);
+            return -21;
+        }
+    }
+
+    if(SaveSet(m_runsection,(void *)m_SetBuf))
+    {
+        soe_record_opt(EV_SET_OK,0);
+        MakeRunSet(false);
+        rt_err_clr(ERR_CODE_SET,0);
+    }
+    else
+    {
+        soe_record_opt(EV_SET_FAIL,0);
+        return -22;
+    }
+	
+    //---装置参数----
+    psettbl = (TSETTABLE *)&tEquipParaTable[0];
+    if(!ReadPara((void*)m_SetBuf, EEP_EQUIP_PARA_ADDR, EQUIP_PARA_NUMBER, psettbl))
+    {
+        rt_err_set(ERR_CODE_EQU_PARA,0);
+        GetDefPara((void*)m_SetBuf, EQUIP_PARA_NUMBER, psettbl);
+    }
+    //更新相应值
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_EQSET];
+    for(i=0; i< pgroup->num; i++){
+        m_SetBuf[pgroup->grp_idx[i]] = run_para_setbuf[pgroup->rmt_idx[i]];
+    }
+
+    if(!_set_check_set(&tEquipParaTable[0], EQUIP_PARA_NUMBER, m_SetBuf))
+    {
+        soe_record_opt(EV_EQUPARA_FAIL,0);
+        return -31;
+    }
+    else if(SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]))
+    {
+        soe_record_opt(EV_EQUPARA_OK,0);
+        MakeRunPara(false, false);
+        rt_err_clr(ERR_CODE_EQU_PARA,0);
+    }
+    else
+    {
+        soe_record_opt(EV_EQUPARA_FAIL,0);
+        return -32;
+    }
+
+	//---内部定值----
+    psettbl = (TSETTABLE *)&tCstSetTable[0];
+    if(!ReadPara((void*)m_SetBuf, EEP_CSTSET_ADDR, CSTSET_NUMBER, psettbl))
+    {
+        rt_err_set(ERR_CODE_SET_IN,0);
+        GetDefPara((float*)m_SetBuf, CSTSET_NUMBER, psettbl);
+    }
+    //更新相应值
+    pgroup = &g_rmt_para_disp.pgrp[RMT_GRP_CSSET];
+    for(i=0; i< pgroup->num; i++){
+        m_SetBuf[pgroup->grp_idx[i]] = run_para_setbuf[pgroup->rmt_idx[i]];
+    }
+ 
+    if(!_set_check_set(&tCstSetTable[0], CSTSET_NUMBER, m_SetBuf))
+    {
+        soe_record_opt(EV_CSTSET_FAIL,0);
+        return -33;
+    }
+    else if(SavePara((void *)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]))
+    {
+        soe_record_opt(EV_CSTSET_OK,0);
+        MakeRunPara(false, false);
+        rt_err_clr(ERR_CODE_SET_IN,0);
+    }
+    else
+    {
+        soe_record_opt(EV_CSTSET_FAIL,0);
+        return -34;
+    }
+
+    return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	定值显示初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_init(u8 type)
+{
+	int i, no=0, no1=0,	num=0, index=0;
+
+	// 清除之前页面的g_set_dis
+	memset(g_set_dis, 0, sizeof(g_set_dis));
+
+	// 清除菜单类型
+	g_sw_setdisp.type = 0;
+	g_equip_paradisp.type = 0;
+	g_cst_setdisp.type    = 0;
+	g_pub_setdisp.type    = 0;
+	g_rmt_para_disp.type  = 0;
+	g_faultRst_setdisp.type=0;
+
+	// 读取定值
+	switch(type)
+	{
+		case MENU_FIX:
+		{
+		    //do nothing
+		}
+		break;
+		
+		case MENU_FIX_PUB:
+		{
+			num = PUB_SET_NUMBER;
+			index = 0;
+			if(!ReadSet(m_runsection,(void *)m_SetBuf))
+			{
+				rt_err_set(ERR_CODE_SET,0);
+				GetDefSet((float*)m_SetBuf);
+			}
+			pset = (TSETTABLE *)&tPubSetTable[0];
+			g_pub_setdisp.type = type;
+			
+			// 更新公共保护定值数量
+			g_page_cur.item_num = g_pub_setdisp.num;
+
+			// 重新分配窗体
+			g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+			if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+			{
+				g_page_cur.wnd_num++;
+			}
+		}
+		break;
+
+		case MENU_GLBH:
+		case MENU_LXBH:
+		case MENU_JDBH:
+        case MENU_RECLOSE:
+		case MENU_BH_STATUS:
+		case MENU_DLYX:
+		case MENU_HJS:
+		{
+            u16 sw_index =0, bh_num =0;
+            if(type == MENU_GLBH){
+                sw_index = class_GLBH.sw_idx;
+                bh_num   = class_GLBH.num;
+            }else if(type == MENU_LXBH){
+                sw_index = class_LXBH.sw_idx;
+                bh_num   = class_LXBH.num;
+            }else if(type == MENU_JDBH){
+                sw_index = class_JDBH.sw_idx;
+                bh_num   = class_JDBH.num;
+            }else if(type == MENU_RECLOSE){
+                sw_index = class_reclose.sw_idx;
+                bh_num   = class_reclose.num;
+            }
+			else if(type == MENU_BH_STATUS){
+				sw_index = class_BH_sts.sw_idx;
+				bh_num   = class_BH_sts.num;
+			}
+			else if(type == MENU_DLYX){
+				sw_index = class_DLYX.sw_idx;
+				bh_num   = class_DLYX.num;
+			}
+			else if(type == MENU_HJS){
+				sw_index = class_HJS.sw_idx;
+				bh_num   = class_HJS.num;
+			}
+			num = SW_SET_NUMBER;
+		    index = PUB_SET_NUMBER + sw_index*SW_SET_NUMBER;
+			if(!ReadSet(m_runsection,(void *)m_SetBuf))
+			{
+				rt_err_set(ERR_CODE_SET,0);
+				GetDefSet((float*)m_SetBuf);
+			}
+			pset = (TSETTABLE *)&tSwSetTable[0];
+			g_sw_setdisp.type = type;
+			
+			// 更新开关保护定值数量
+			g_page_cur.item_num = bh_num;
+
+			// 重新分配窗体
+			g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+			if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+			{
+				g_page_cur.wnd_num++;
+			}
+		}
+		break;
+
+		case MENU_PARA:
+		{
+			num = EQUIP_PARA_NUMBER;
+			index = 0;
+			pset = (TSETTABLE *)&tEquipParaTable[0];
+			if(!ReadPara((void*)m_SetBuf, EEP_EQUIP_PARA_ADDR, num, pset))
+			{
+				rt_err_set(ERR_CODE_EQU_PARA,0);
+				GetDefPara((void*)m_SetBuf,num,pset);
+			}
+
+			// 网卡参数初始化
+			_set_net_init();
+
+			// 时钟参数初始化
+			_set_time_init(PARA_BATBEGIN_YMD);
+			
+			g_equip_paradisp.type = type;
+			
+			// 更新装置参数数量
+			g_page_cur.item_num = g_equip_paradisp.num;	
+
+			// 重新分配窗体
+			g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+			if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+			{
+				g_page_cur.wnd_num++;
+			}
+		}
+		break;
+		
+        case MENU_FAULT_RESET:
+        {
+            num = EQUIP_PARA_NUMBER;
+            index = 0;
+            pset = (TSETTABLE *)&tEquipParaTable[0];
+            if(!ReadPara((void*)m_SetBuf, EEP_EQUIP_PARA_ADDR, num, pset))
+            {
+                rt_err_set(ERR_CODE_EQU_PARA,0);
+                GetDefPara((void*)m_SetBuf,num,pset);
+            }
+
+            g_faultRst_setdisp.type = type;
+
+            // 更新装置参数数量
+            g_page_cur.item_num = g_faultRst_setdisp.num;
+
+            // 重新分配窗体
+            g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+            if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+            {
+                g_page_cur.wnd_num++;
+            }
+        }
+        break;
+
+        case MENU_RUN_PARA:
+        {
+
+            if(run_para_pick_set != NULL) {
+                rt_printf("[%s , %d] free run_para_pick_set ERROR! \r\n", __func__, __LINE__);
+                rt_free(run_para_pick_set);
+            }
+            if(run_para_setbuf != NULL) {
+                rt_printf("[%s , %d] free run_para_setbuf ERROR! \r\n", __func__, __LINE__);
+                rt_free(run_para_setbuf);
+            }
+
+            // 分配内存
+            run_para_pick_set = rt_malloc(g_rmt_para_disp.total * 2 * sizeof(TSETTABLE));
+            if(run_para_pick_set == NULL)
+            {
+                rt_printf("[%s , %d] MENU_RUN_PARA rt_malloc FAIL !\r\n", __func__, __LINE__ );
+                break;
+            }
+            run_para_setbuf = rt_malloc(g_rmt_para_disp.total * 2 * sizeof(SET_VALUE));
+            if(run_para_setbuf == NULL){
+                rt_printf("[%s , %d] MENU_RUN_PARA rt_malloc setbuf FAIL !\r\n", __func__, __LINE__ );
+                break;
+            }
+
+            _get_rmt_para_val();
+
+
+            pset = (TSETTABLE *)&run_para_pick_set[0];
+            memcpy(&m_SetBuf[0], &run_para_setbuf[0], g_rmt_para_disp.total *sizeof(SET_VALUE));
+            index = 0;
+            num   = g_rmt_para_disp.total;
+
+            g_rmt_para_disp.type = type;
+
+            // 更新远动参数数量
+            g_page_cur.item_num = g_rmt_para_disp.total;
+
+            // 重新分配窗体
+            g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+            if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+            {
+                g_page_cur.wnd_num++;
+            }
+        }
+        break;
+		
+		case MENU_TIMESET:
+		{
+			struct timespec ts;
+			struct rtc_time_t rtc;
+			num = TIME_SET_NUMBER;
+			index = 0;
+			pset = (TSETTABLE *)&tTimeTable[0];
+
+			clk_time_get(&ts);
+			timespec_to_rtc(ts,&rtc,1);
+			
+			m_SetBuf[TIME_YEAR].ff = rtc.year;
+			m_SetBuf[TIME_MONTH].ff = rtc.month;
+			m_SetBuf[TIME_DAY].ff = rtc.day;
+			m_SetBuf[TIME_HOUR].ff = rtc.hour;
+			m_SetBuf[TIME_MINUTE].ff = rtc.min;
+			m_SetBuf[TIME_SECOND].ff = rtc.ms/1000;
+		}
+		break;
+		
+		case MENU_INFIX:
+		{
+			num = CSTSET_NUMBER;
+			index = 0;
+			pset = (TSETTABLE *)&tCstSetTable[0];
+			if(!ReadPara((void*)m_SetBuf, EEP_CSTSET_ADDR, num, pset))
+			{
+				rt_err_set(ERR_CODE_SET_IN,0);
+				GetDefPara((float*)m_SetBuf, num, pset);
+			}
+
+			g_cst_setdisp.type = type;
+			
+			// 更新内部定值数量
+			g_page_cur.item_num = g_cst_setdisp.num;	
+
+			// 重新分配窗体
+			g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+			if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+			{
+				g_page_cur.wnd_num++;
+			}
+		}
+		break;
+
+		case MENU_CODE:
+		{
+			num = CODE_SET_NUMBER;
+			index = 0;
+			pset = (TSETTABLE *)&tCodeTable[0];
+			m_SetBuf[0].ff = ReadPassword();
+		}
+		break;
+
+		case MENU_PASSWORD:
+		{
+			num = 1;
+			index = 0;
+			pset = (TSETTABLE *)&tPasswordTable[0];
+			m_SetBuf[0].ff = 0;   //显示全0
+		}
+		break;
+	}
+
+	// 将INT型定值转换为菜单设置用内容, 保存时要调用  _set_change_set()再转换回来
+	_set_change_type(pset, num, &m_SetBuf[index]);
+
+	// 初始化屏数
+	g_page_cur.cur_wnd = 0;
+	g_page_cur.cur_focus = 0;
+	
+	check_cur_wnd_item();
+	
+	// 初始化首屏定值,第一行取序号和名称,第二行取数据,定值范围由desc取得
+	for (i=0; i<g_page_cur.cur_wnd_item; i++)
+	{
+		no1 = 0;
+		if (g_pub_setdisp.type == MENU_FIX_PUB)
+		{
+			no = g_pub_setdisp.no[i];
+		}		
+		else if (g_sw_setdisp.type == MENU_GLBH)
+        {
+		    no = class_GLBH.idx[i];
+		    no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_GLBH.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_LXBH)
+        {
+            no = class_LXBH.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_LXBH.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_JDBH)
+        {
+            no = class_JDBH.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_JDBH.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_RECLOSE)
+        {
+            no = class_reclose.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_reclose.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_BH_STATUS)
+        {
+            no = class_BH_sts.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_BH_sts.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_DLYX)
+        {
+            no = class_DLYX.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_DLYX.sw_idx;
+        }
+		else if (g_sw_setdisp.type == MENU_HJS)
+        {
+            no = class_HJS.idx[i];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_HJS.sw_idx;
+        }
+		else if (g_equip_paradisp.type == MENU_PARA)
+		{
+			no = g_equip_paradisp.no[i];
+		}
+        else if (g_faultRst_setdisp.type == MENU_FAULT_RESET)
+        {
+            no = g_faultRst_setdisp.no[i];
+        }
+		else if (g_cst_setdisp.type == MENU_INFIX)
+		{
+			no = g_cst_setdisp.no[i];
+		}		
+		else
+		{
+			no = i;
+		}
+
+		if (pset[no].wType == SETTYPE_IP)
+		{
+
+			_set_get_dispdata(i, no*4, &g_set_dis[i], &pset[no], g_netpara);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_IP, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata4);
+		}
+		else if (pset[no].wType == SETTYPE_YMD)
+		{
+
+			_set_get_dispdata(i, (no-PARA_BATBEGIN_YMD)*3, &g_set_dis[i], &pset[no], g_timepara);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_YMD, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_YMD, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_YMD, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+		}
+		else if (pset[no].wType == SETTYPE_HMS)
+		{
+
+			_set_get_dispdata(i, (no-PARA_BATBEGIN_HMS)*3, &g_set_dis[i], &pset[no], &g_timepara[3]);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_HMS, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_HMS, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_HMS, i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+		}
+		else if (pset[no].wType == SETTYPE_LIST)
+		{
+			u16 len,len1;
+			char p = ' ';
+			_set_get_dispdata(i, no, &g_set_dis[i], &pset[no], &m_SetBuf[no1]);
+			//取得list字符串的最大长度
+			len = _set_get_list_man_len(&pset[no]);
+			//本次字符串的长度
+			len1=strlen((char *)g_set_dis[i].pdata);
+			//清零
+			memset(g_set_dis[i].list_str, 0, sizeof(g_set_dis[i].list_str));
+			//拷贝到list_str
+			strcat(g_set_dis[i].list_str, (char *)g_set_dis[i].pdata);
+			//不够长的,补" "
+            if(len > len1)
+                memset(&g_set_dis[i].list_str[len1],  p, len-len1);
+			//末尾置0
+			g_set_dis[i].list_str[len] = 0;
+			//指向list_str
+			g_set_dis[i].pdata =(void *)g_set_dis[i].list_str;
+			_set_fmt_init_modify(i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata);
+		}
+		else
+		{
+
+			_set_get_dispdata(i, no, &g_set_dis[i], &pset[no], &m_SetBuf[no1]);
+			_set_fmt_init_modify(i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata);
+		}
+		g_set_dis[i].cursor = 0;
+	}
+
+	g_set_dis[g_page_cur.cur_focus].modify = 1;
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_change_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	定值显示切屏
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_change_disp(void)
+{
+	int i, index=0, no, no1;
+	// 当前设置项No
+	if (g_page_cur.cur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+	}
+
+	// 初始化屏数
+	check_cur_wnd_item();
+
+	// 清除之前页面的g_set_dis
+	memset(g_set_dis, 0, sizeof(g_set_dis));
+	
+	// 初始化首屏定值,第一行取序号和名称,第二行取数据,第三行取定值范围
+	for (i=0; i<g_page_cur.cur_wnd_item; i++)
+	{
+		no1 = 0;
+		if (g_pub_setdisp.type == MENU_FIX_PUB)
+		{
+			no = g_pub_setdisp.no[i+index];
+		}
+		else if (g_sw_setdisp.type == MENU_GLBH)
+		{
+		    no = class_GLBH.idx[i+index];
+			no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_GLBH.sw_idx;
+		}
+        else if (g_sw_setdisp.type == MENU_LXBH)
+        {
+            no = class_LXBH.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_LXBH.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_JDBH)
+        {
+            no = class_JDBH.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_JDBH.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_RECLOSE)
+        {
+            no = class_reclose.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_reclose.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_BH_STATUS)
+        {
+            no = class_BH_sts.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_BH_sts.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_DLYX)
+        {
+            no = class_DLYX.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_DLYX.sw_idx;
+        }
+        else if (g_sw_setdisp.type == MENU_HJS)
+        {
+            no = class_HJS.idx[i+index];
+            no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_HJS.sw_idx;
+        }
+		else if (g_equip_paradisp.type == MENU_PARA)
+		{
+			no = g_equip_paradisp.no[i+index];
+		}
+	    else if (g_faultRst_setdisp.type == MENU_FAULT_RESET)
+	    {
+	        no = g_faultRst_setdisp.no[i+index];
+	    }
+		else if (g_cst_setdisp.type == MENU_INFIX)
+		{
+			no = g_cst_setdisp.no[i+index];
+		}		
+		else
+		{
+			no = i+index;
+		}
+		if (pset[no].wType == SETTYPE_IP)
+		{
+
+			_set_get_dispdata(i+index, no*4, &g_set_dis[i], &pset[no], g_netpara);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_IP, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_IP, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata4);
+		}
+		else if (pset[no].wType == SETTYPE_YMD)
+		{
+
+			_set_get_dispdata(i+index, (no-PARA_BATBEGIN_YMD)*3, &g_set_dis[i], &pset[no], g_timepara);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_YMD, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_YMD, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_YMD, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+		}
+		else if (pset[no].wType == SETTYPE_HMS)
+		{
+
+			_set_get_dispdata(i+index, (no-PARA_BATBEGIN_HMS)*3, &g_set_dis[i], &pset[no], &g_timepara[3]);
+			g_set_dis[i].lenth = 0;
+			g_set_dis[i].lenth = _set_spcl_fmt_init_modify(DISP_HMS, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata1);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_HMS, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata2);
+			g_set_dis[i].lenth += _set_spcl_fmt_init_modify(DISP_HMS, i+index, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata3);
+		}
+		else if (pset[no].wType == SETTYPE_LIST)
+		{
+			int len,len1;
+			char p = ' ';
+			_set_get_dispdata(i+index, no, &g_set_dis[i], &pset[no], &m_SetBuf[no1]);
+			//取得list字符串的最大长度
+			len = _set_get_list_man_len(&pset[no]);
+			//本次字符串的长度
+			len1=strlen((char *)g_set_dis[i].pdata);
+			//清零
+			memset(g_set_dis[i].list_str, 0, sizeof(g_set_dis[i].list_str));
+			//拷贝到list_str
+			strcat(g_set_dis[i].list_str, (char *)g_set_dis[i].pdata);
+			//不够长的,补" "
+			if(len > len1)
+			    memset(&g_set_dis[i].list_str[len1],  p, len-len1);
+			//末尾置0
+			g_set_dis[i].list_str[len] = 0;
+			//指向list_str
+			g_set_dis[i].pdata = g_set_dis[i].list_str;
+			_set_fmt_init_modify(i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata);
+		}		
+		else
+		{
+			_set_get_dispdata(i+index, no, &g_set_dis[i], &pset[no], &m_SetBuf[no1]);
+			_set_fmt_init_modify(i, &g_set_dis[i], (char *)g_set_dis[i].desc, (void *)g_set_dis[i].pdata);
+		}
+		g_set_dis[i].cursor = 0;
+	}
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_modify_update
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	定值修改更新显示
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_modify_update(int cur_focus)
+{
+	int index=0, no, no1;
+	// 当前设置项No
+	if (g_page_cur.cur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * g_page_cur.cur_wnd;
+	}
+	
+	no1 = 0;
+	if (g_pub_setdisp.type == MENU_FIX_PUB)
+	{
+		no = g_pub_setdisp.no[cur_focus+index];
+	}
+	else if (g_sw_setdisp.type == MENU_GLBH)
+	{
+		no = class_GLBH.idx[cur_focus+index];
+		no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_GLBH.sw_idx;
+	}
+    else if (g_sw_setdisp.type == MENU_LXBH)
+    {
+        no = class_LXBH.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_LXBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_JDBH)
+    {
+        no = class_JDBH.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_JDBH.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_RECLOSE)
+    {
+        no = class_reclose.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_reclose.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_BH_STATUS)
+    {
+        no = class_BH_sts.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_BH_sts.sw_idx;
+    }
+    else if (g_sw_setdisp.type == MENU_DLYX)
+    {
+        no = class_DLYX.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_DLYX.sw_idx;
+    }
+	else if (g_sw_setdisp.type == MENU_HJS)
+    {
+        no = class_HJS.idx[cur_focus+index];
+        no1 = PUB_SET_NUMBER + SW_SET_NUMBER * class_HJS.sw_idx;
+    }
+	else if (g_equip_paradisp.type == MENU_PARA)
+	{
+		no = g_equip_paradisp.no[cur_focus+index];
+	}
+    else if (g_faultRst_setdisp.type == MENU_FAULT_RESET)
+    {
+        no = g_faultRst_setdisp.no[cur_focus+index];
+    }
+	else if (g_cst_setdisp.type == MENU_INFIX)
+	{
+		no = g_cst_setdisp.no[cur_focus+index];
+	}		
+	else
+	{
+		no = cur_focus+index;
+	}
+	if (pset[no].wType == SETTYPE_IP)
+	{
+
+		_set_get_dispdata(cur_focus+index, no*4, &g_set_dis[cur_focus], &pset[no], g_netpara);
+		g_set_dis[cur_focus].lenth = 0;
+		g_set_dis[cur_focus].lenth = _set_spcl_fmt_init_modify(DISP_IP, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata1);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_IP, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata2);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_IP, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata3);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_IP, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata4);
+	}
+	else if (pset[no].wType == SETTYPE_YMD)
+	{
+
+		_set_get_dispdata(cur_focus+index, (no-PARA_BATBEGIN_YMD)*3, &g_set_dis[cur_focus], &pset[no], g_timepara);
+		g_set_dis[cur_focus].lenth = 0;
+		g_set_dis[cur_focus].lenth = _set_spcl_fmt_init_modify(DISP_YMD, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata1);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_YMD, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata2);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_YMD, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata3);
+	}
+	else if (pset[no].wType == SETTYPE_HMS)
+	{
+
+		_set_get_dispdata(cur_focus+index, (no-PARA_BATBEGIN_HMS)*3, &g_set_dis[cur_focus], &pset[no], &g_timepara[3]);
+		g_set_dis[cur_focus].lenth = 0;
+		g_set_dis[cur_focus].lenth = _set_spcl_fmt_init_modify(DISP_HMS, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata1);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_HMS, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata2);
+		g_set_dis[cur_focus].lenth += _set_spcl_fmt_init_modify(DISP_HMS, cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata3);
+	}
+	else if (pset[no].wType == SETTYPE_LIST)
+	{
+		int len,len1;
+		char p = ' ';
+		_set_get_dispdata(cur_focus+index, no, &g_set_dis[cur_focus], &pset[no], &m_SetBuf[no1]);
+		//取得list字符串的最大长度
+		len = _set_get_list_man_len(&pset[no]);
+		//本次字符串的长度
+		len1=strlen((char *)g_set_dis[cur_focus].pdata);
+		//清零
+		memset(g_set_dis[cur_focus].list_str, 0, sizeof(g_set_dis[cur_focus].list_str));
+		//拷贝到list_str
+		strcat(g_set_dis[cur_focus].list_str, (char *)g_set_dis[cur_focus].pdata);
+		//不够长的,补" "
+		if(len > len1)
+		    memset(&g_set_dis[cur_focus].list_str[len1],  p, len-len1);
+		//末尾置0
+		g_set_dis[cur_focus].list_str[len] = 0;
+		//指向list_str
+		g_set_dis[cur_focus].pdata = g_set_dis[cur_focus].list_str;
+		_set_fmt_init_modify(cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata);
+	}	
+	else
+	{
+		_set_get_dispdata(cur_focus+index, no, &g_set_dis[cur_focus], &pset[no], &m_SetBuf[no1]);
+		_set_fmt_init_modify(cur_focus, &g_set_dis[cur_focus], (char *)g_set_dis[cur_focus].desc, (void *)g_set_dis[cur_focus].pdata);
+	}
+
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_set_get_dispdata
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	获取显示用定值
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_get_dispdata(int no, int setno, struct set_dis *pt, const TSETTABLE *pTable, SET_VALUE *setbuf)
+{
+	float ff;
+
+	// 取定值序号和名称
+	if (g_page_cur.menu_cur == MENU_PASSWORD)
+	{
+		strcpy(pt->str[SET_NAME], pTable->szName);
+	}
+	else
+	{
+	    char  *pname=NULL;
+		sprintf(pt->str[SET_NAME], "%02d ", no+1);
+		//湖南版本特殊处理
+		if((g_page_cur.menu_cur == MENU_GLBH) ||
+		   (g_page_cur.menu_cur == MENU_LXBH) ||
+		   (g_page_cur.menu_cur == MENU_RECLOSE) ||
+		   (g_page_cur.menu_cur == MENU_FAULT_RESET)) {
+		    pname = get_replace_setdisp(no, g_page_cur.menu_cur);
+		    if(pname != NULL)
+		        strcat(pt->str[SET_NAME], pname);
+		}else{
+		    strcat(pt->str[SET_NAME], pTable->szName);
+		}
+	}
+	
+	// 取定值、取定值范围
+	switch(pTable->wType)
+	{
+		case SETTYPE_UINT:   //16进制显示  控制字
+		{
+			// “*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值
+			strcpy(pt->desc, "%*3u");   //对齐符号位
+			pt->pdata = (void*)&setbuf[setno].tt;
+		}
+		break;
+
+		case SETTYPE_4INT:   //10进制显示  4位
+		{
+			strcpy(pt->desc, "%*4u");   //对齐符号位
+			pt->pdata = (void*)&setbuf[setno].tt;
+		}
+		break;		
+
+		case SETTYPE_5INT:   //10进制显示  5位
+		{
+			strcpy(pt->desc, "%*5u");   //对齐符号位
+			pt->pdata = (void*)&setbuf[setno].tt;
+		}
+		break;
+
+        case SETTYPE_6INT:   //10进制显示  6位
+        {
+            strcpy(pt->desc, "%*6u");   //对齐符号位
+            pt->pdata = (void*)&setbuf[setno].tt;
+        }
+        break;
+
+		case SETTYPE_LINT:   //16进制显示  控制字
+		{
+			strcpy(pt->desc, "%*6u");   //对齐符号位
+			pt->pdata=(void*)&setbuf[setno].tt;
+		}
+		break;
+		
+		case SETTYPE_LIST:   //列表选择 
+		{
+			DWORD dw = (WORD)(setbuf[setno].ff);	
+			strcpy(pt->desc, "%s");   
+			pt->pdata = (void*)pTable->list[dw].str;
+			//pt->pdata = (void*)pTable->list[setbuf[setno].tt].str;
+			pt->list = TRUE;
+		}
+		break;
+
+		case SETTYPE_IP:
+		{
+			// “*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值
+			strcpy(pt->desc, "%*3u");   //对齐符号位
+			pt->pdata1 = (void*)&setbuf[setno].tt;
+			pt->pdata2 = (void*)&setbuf[setno+1].tt;
+			pt->pdata3 = (void*)&setbuf[setno+2].tt;
+			pt->pdata4 = (void*)&setbuf[setno+3].tt;
+		}
+		break;
+
+		case SETTYPE_YMD:
+		case SETTYPE_HMS:
+		{
+			// “*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值
+			strcpy(pt->desc, "%*2u");   //对齐符号位
+			pt->pdata1 = (void*)&setbuf[setno].tt;
+			pt->pdata2 = (void*)&setbuf[setno+1].tt;
+			pt->pdata3 = (void*)&setbuf[setno+2].tt;
+		}
+		break;
+		
+		case SETTYPE_F:
+		{
+			ff=setbuf[setno].ff;
+			switch(_set_get_float_disp((void *)&ff))
+			{
+				
+				case 0:   //浮点数
+					strcpy(pt->desc, "%+-6.1f");
+				break;
+				
+				case 1:   //浮点数
+					strcpy(pt->desc, "%+-6.1f");
+				break;
+				
+				case 2:   //浮点数
+					strcpy(pt->desc, "%+-6.2f");
+				break;
+				
+				case 3:   //浮点数
+					strcpy(pt->desc, "%+-6.3f");
+				break;
+				
+				default:
+					strcpy(pt->desc, "%+-6.1f");
+				break;
+			}
+			pt->pdata=(void*)&setbuf[setno].ff;
+		}
+		break;
+
+        default:
+        {
+            rt_printf("[%s, %d] ERROR: %d, %d \r\n", __func__, __LINE__, pTable->wType, setno);
+            return -1;
+        }
+        //break;
+	}
+
+	// 给定值赋单位
+	if ((pTable->wType != SETTYPE_IP)
+		|| (pTable->wType != SETTYPE_YMD)
+		|| (pTable->wType != SETTYPE_HMS))
+	{
+		strcat(pt->desc, " ");  //单位
+		strcat(pt->desc, SetUints[pTable->wUnit]);  //单位
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_fmt_init_modify
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	进入修改模式,初始化函数
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_fmt_init_modify(u8 index, struct set_dis *pt, const char *FmtStr,...)
+{
+	int i, j=0;
+	char postart=0; 
+	char fmtstr[24];	// 格式描述字符串
+	u8 fmt_flag = TRUE; // %号只分析一次 
+	va_list  ap;		//定义字符指针
+	
+	fmtstr[0] = '\0';
+	pt->type = 'u';
+	pt->lenth = 0;
+	
+	// 获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,FmtStr是可变参数最左边的参数)
+	va_start(ap,FmtStr);
+
+	// 循环到结构描述的字符串结尾
+	for(; *FmtStr!='\0' ;)
+	{
+		if(*FmtStr=='%' && fmt_flag)
+		{	
+			// 数据
+			pt->x = postart;
+			
+			// 复制数值格式描述串,并获取描述所占长度
+			i = ScanFmtStr(&pt->type, FmtStr, fmtstr);
+			
+			// 小数点是否需编辑
+			if((index<0xff) && (pt->type=='f'))
+			{
+				pt->point_mdf = TRUE;
+				pt->pdesc = (void*)FmtStr;
+			}
+			else
+			{
+				pt->point_mdf = FALSE;
+			}
+			if(i)
+			{
+				// 从格式描述串中略过数值格式描述串,以便从list中取得定值指针
+				FmtStr += i;
+				
+				// 将格式描述与数据对接,获得按格式打印数据的效果,并将数据转为字符串存入Valstr,返回长度给Lenth
+				pt->lenth = ValuePtrToStr(pt->str[SET_DATA], fmtstr, ap);
+			}
+			fmt_flag = FALSE;
+		}
+		else
+		{
+			/*将字符输出到输出字符串中*/
+			pt->str[SET_UNIT][j]=*FmtStr++;
+			j++;
+			pt->str[SET_UNIT][j]='\0';
+			pt->len = j;
+		}
+		postart++;
+	}
+	
+	// 清空va_list可变参数列表
+	va_end(ap);	 
+
+	// 要编辑符号的话,先跳过符号位,即正负位
+	/*if(pt->type=='f'||pt->type=='d'||pt->type=='i') 
+	{
+		pt->cursor = 1;
+	}*/
+
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_set_spcl_fmt_init_modify
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	进入修改模式,初始化函数
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_spcl_fmt_init_modify(int type, u8 index, struct set_dis *pt, const char *FmtStr,...)
+{
+	int i=0, j=0, len=0;
+	char postart=0; 
+	char fmtstr[24];	// 格式描述字符串
+	u8 fmt_flag = TRUE; // %号只分析一次 
+	va_list  ap;		//定义字符指针
+	
+	fmtstr[0] = '\0';
+	pt->type = 'u';
+	pt->spcl_type = type;
+	
+	// 获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,FmtStr是可变参数最左边的参数)
+	va_start(ap,FmtStr);
+
+	// 循环到结构描述的字符串结尾
+	for(; *FmtStr!='\0' ;)
+	{
+		if(*FmtStr=='%' && fmt_flag)
+		{	
+			// 数据
+			pt->x = postart;
+			
+			// 复制数值格式描述串,并获取描述所占长度
+			i = ScanFmtStr(&pt->type, FmtStr, fmtstr);
+			
+			// 小数点是否需编辑
+			if((index<0xff) && (pt->type=='f'))
+			{
+				pt->point_mdf = TRUE;
+				pt->pdesc = (void*)FmtStr;
+			}
+			else
+			{
+				pt->point_mdf = FALSE;
+			}
+			if(i)
+			{
+				// 从格式描述串中略过数值格式描述串,以便从list中取得定值指针
+				FmtStr += i;
+				
+				// 将格式描述与数据对接,获得按格式打印数据的效果,并将数据转为字符串存入Valstr,返回长度给Lenth
+				len = ValuePtrToStr(&pt->str[SET_DATA][pt->lenth], fmtstr, ap);
+				if (type == DISP_IP)
+				{
+					if (pt->lenth < 12)
+					{
+						pt->str[SET_DATA][pt->lenth+3] = '.';
+						len++;
+					}
+				}
+				else if (type == DISP_YMD)
+				{
+					if (pt->lenth < 6)
+					{
+						pt->str[SET_DATA][pt->lenth+2] = '-';
+						len++;
+					}
+				}
+				else if (type == DISP_HMS)
+				{
+					if (pt->lenth < 6)
+					{
+						pt->str[SET_DATA][pt->lenth+2] = ':';
+						len++;
+					}
+				}
+			}
+			fmt_flag = FALSE;
+		}
+		else
+		{
+			/*将字符输出到输出字符串中*/
+			pt->str[SET_UNIT][j]=*FmtStr++;
+			j++;
+			pt->str[SET_UNIT][j]='\0';
+			pt->len = j;
+		}
+		postart++;
+	}
+	
+	// 清空va_list可变参数列表
+	va_end(ap);	 
+
+	// 要编辑符号的话,先跳过符号位,即正负位
+	/*if(pt->type=='f'||pt->type=='d'||pt->type=='i') 
+	{
+		pt->cursor = 1;
+	}*/
+
+	return len;
+}
+
+
+/******************************************************************************
+函数名称:	_set_change_type
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	转换定值,将EEPROM中的值转换为菜单整定时使用的值,主要是控制字
+          由浮点数转为定点数
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_change_type(const TSETTABLE *pSet,int num,SET_VALUE *setbuf)
+{
+	int i;
+	for(i=0;i<num;i++)
+	{
+		if(_set_is_integer(pSet[i].wType))
+		{			
+			float ff = setbuf[i].ff;
+			setbuf[i].tt = (long)ff;		
+		}
+	}
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_is_integ_type
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	判断参数类型是否为整型类型的
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_is_integer(u16 type)
+{
+	if ((type == SETTYPE_UINT)
+		|| (type == SETTYPE_LINT)
+		|| (type == SETTYPE_4INT)
+		|| (type == SETTYPE_5INT)
+		|| (type == SETTYPE_6INT))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}
+
+/******************************************************************************
+函数名称:	_set_is_have_point
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	判断是否有小数点
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_is_have_point(void)
+{
+	u8 cnt;
+	for(cnt=0; cnt<g_set_dis[g_page_cur.cur_focus].lenth; cnt++)
+	{
+		if(g_set_dis[g_page_cur.cur_focus].str[SET_DATA][cnt] == '.')
+		{
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_move_point
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	判断是否有小数点
+参数说明:	bFlag: 1 右移, 0 左移
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_move_point(int bFlag)
+{
+	u8 point,cnt,focus,len,cursor;
+	char TempStr[40];
+	char *p = TempStr;
+
+	focus = g_page_cur.cur_focus;
+	len = g_set_dis[focus].lenth;
+	cursor = g_set_dis[focus].cursor;
+
+	// 检索除小数点外的其他内容
+	for(cnt=0; cnt<len; cnt++)
+	{
+		if(g_set_dis[focus].str[SET_DATA][cnt] == '.')
+		{
+			continue;
+		}
+		*p++ = g_set_dis[focus].str[SET_DATA][cnt];
+	}
+
+	// 取小数点位置
+	point = cursor;
+
+	// 小数点移位
+    if(bFlag) // 小数点右移
+	{
+		if(point >= len-1)
+		{
+			point=1;  		// 到最右边
+		}
+		else
+		{
+			point++;
+		}
+	}
+	else	// 小数点左移
+	{
+		if(point <= 1)
+		{
+			point = len-1;  // 到最左边
+		}
+		else 
+		{
+			point--;
+		}
+	}
+
+	// 将移位结果装载回字符串
+	p=TempStr;
+	for(cnt=0; cnt<len; cnt++)
+	{
+		if(cnt == point)
+		{
+			g_set_dis[focus].str[SET_DATA][cnt] = '.';
+		}
+		else 
+		{
+			g_set_dis[focus].str[SET_DATA][cnt] = *p++;
+		}
+	}
+
+	// 光标移位
+	g_set_dis[focus].cursor=point;
+
+	return 0;
+}
+
+/**************************************************************************
+函数名称:_set_get_modify_value
+函数版本:1.00 
+作者:   
+创建日期:2008.9.1     
+函数功能:分析编辑字符串的格式,并取得编辑状态下数据的值
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/
+static int _set_get_modify_value(void)
+{	
+	u8 precison,len,focus;
+	char *p;
+
+	len = 0;
+	focus = g_page_cur.cur_focus;
+
+	if (g_set_dis[focus].spcl_type == DISP_IP)
+	{
+		StrToValue(&g_set_dis[focus].str[SET_DATA][0], g_set_dis[focus].desc, g_set_dis[focus].pdata1);
+		StrToValue(&g_set_dis[focus].str[SET_DATA][4], g_set_dis[focus].desc, g_set_dis[focus].pdata2);
+		StrToValue(&g_set_dis[focus].str[SET_DATA][8], g_set_dis[focus].desc, g_set_dis[focus].pdata3);
+		StrToValue(&g_set_dis[focus].str[SET_DATA][12], g_set_dis[focus].desc, g_set_dis[focus].pdata4);		
+	}
+	else if ((g_set_dis[focus].spcl_type == DISP_YMD) || (g_set_dis[focus].spcl_type == DISP_HMS))
+	{
+		StrToValue(&g_set_dis[focus].str[SET_DATA][0], g_set_dis[focus].desc, g_set_dis[focus].pdata1);
+		StrToValue(&g_set_dis[focus].str[SET_DATA][3], g_set_dis[focus].desc, g_set_dis[focus].pdata2);
+		StrToValue(&g_set_dis[focus].str[SET_DATA][6], g_set_dis[focus].desc, g_set_dis[focus].pdata3);
+	}
+	else
+	{
+		// 字符串转数值
+		StrToValue(g_set_dis[focus].str[SET_DATA], g_set_dis[focus].desc, g_set_dis[focus].pdata);
+
+		// 打印出正在修改的定值
+		//rt_printf("%s, %s, %f, %d\r\n", g_set_dis[focus].str[SET_DATA], g_set_dis[focus].desc, *(float *)g_set_dis[focus].pdata, *(long *)g_set_dis[focus].pdata);
+
+		// 小数点可变
+		if(g_set_dis[focus].point_mdf && (g_set_dis[focus].type=='f'))  
+		{
+			// 获取定值数据的精度,即小数点后的位数
+			precison = _set_get_float_disp((void *)g_set_dis[focus].pdata); 
+			p = _set_fmtstr_Precison(g_set_dis[focus].pdesc, &len);
+			if((len!=precison) && (p!=NULL)) /*小数点后有效位数不同*/
+			{
+				*p = precison+'0';
+			}
+			strcpy(g_set_dis[focus].desc,g_set_dis[focus].pdesc);
+		}
+	}
+	return 0;
+}
+
+/**************************************************************************
+函数名称:_set_fmtstr_Precison
+函数版本:1.00 
+作者:   
+创建日期:2008.9.1     
+函数功能:分析格式字符串代表的数据的精度
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/
+static char * _set_fmtstr_Precison(char *FmtStr,BYTE *len)
+{
+	char *TempPtr,*ret;
+	char Temp[4];
+	int i;
+	char Precision=6;		
+	FmtStr++;	// =%
+	// 分解出标志字符序列
+	for(; *FmtStr<'0'; FmtStr++){} // + - * # .
+	// 分解出数据的显示宽度
+	for(; (*FmtStr<='9')&&(*FmtStr>='0'); FmtStr++){}// 0~9 
+	// 分解出数据的显示精度
+	if(*FmtStr == '.')
+	{
+		FmtStr++;
+		TempPtr = (char *)FmtStr;
+		ret = (char *)FmtStr;
+		for(; *TempPtr<='9'&&*TempPtr>='0'; TempPtr++){}// 0~9 
+		for(i=0; FmtStr<TempPtr; Temp[i]=*FmtStr++,i++){}
+		Temp[i] = '\0';
+		Precision = (u8)atoi(Temp);
+	}
+	else 
+	{		
+		ret = NULL;
+	}
+	return ret;	
+}
+
+/**************************************************************************
+函数名称:_set_get_float_disp
+函数版本:1.00 
+作者:   
+创建日期:2008.9.1     
+函数功能说明:取浮点数的的显示类型
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/
+static int _set_get_float_disp(void *pdat)
+{
+	int factor=0;
+	
+	float fdata=*((float*)pdat);
+	
+	if(fdata<0)
+	{
+		fdata=-fdata;
+	}
+	if(fdata>9999.5)
+	{
+		return 0;
+	}
+	else if(fdata>999.95)
+	{
+		factor=0;
+	}
+	else if(fdata>99.995)
+	{
+		factor=1;
+	}
+	else if(fdata>9.9995)
+	{
+		factor=2;
+	}
+	else
+	{
+		factor=3;
+	}
+	return factor;
+}
+
+/**************************************************************************
+函数名称:_set_change_set
+函数版本:1.00 
+作者:   
+创建日期:2008.9.1     
+函数功能说明:将整定值转换为要保存的值
+输入参数:
+输出参数:
+返回值:
+
+更新信息:
+更新日志1:
+日期:	  
+修改者:	  
+修改内容:  
+修改原因:
+***************************************************************************/
+
+static void _set_change_set(const TSETTABLE *pSet,int num, int index)
+{
+	int i;
+	for(i=0;i<num;i++)
+	{
+		if(_set_is_integer(pSet[i].wType))
+		{
+			long tt=m_SetBuf[i+index].tt;
+			m_SetBuf[i+index].ff=tt;			
+		}
+	}	
+}
+
+/******************************************************************************
+函数名称:	_set_check_set
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	检查设置是否在定值范围
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_check_set(const TSETTABLE *pSet,int num,SET_VALUE *setbuf)
+{	
+	int i, j=0;
+	char tmpstr[24];
+
+	// 检查浮点值是否在定值范围内
+	for(i=0;i<num;i++)
+	{
+		if(pSet[i].wType==SETTYPE_IP)
+			continue;  //  IP地址类型数据,不判断
+		if(pSet[i].wType==SETTYPE_YMD)
+			continue;  //  IP地址类型数据,不判断
+		if(pSet[i].wType==SETTYPE_HMS)
+			continue;  //  IP地址类型数据,不判断
+		if(CheckFloatSet((void *)&setbuf[i].ff,pSet[i].fMax,pSet[i].fMin)>0)
+			break;
+	}	
+	// 当某个定值不在范围内
+	if(i<num)
+	{
+		rt_printf("%s, %0.3f,范围:%.0f~%.0f\r\n", pSet[i].szName, setbuf[i].ff, pSet[i].fMin,pSet[i].fMax);
+		// 打印该定值名称
+		strcpy(g_page_dis.str[j++],pSet[i].szName);
+
+		// 打印定值范围
+		if(_set_is_integer(pSet[i].wType))
+		{
+			sprintf(g_page_dis.str[j++],"范围:%.0f~%.0f",pSet[i].fMin,pSet[i].fMax);	
+		}
+		else
+		{
+			strcpy(g_page_dis.str[j],"范围");
+			switch(_set_get_float_disp((void *)&pSet[i].fMin))
+			{
+				
+			case 0:   //浮点数
+				sprintf(tmpstr,"%.0f",pSet[i].fMin);	
+				break;
+			case 1:   //浮点数
+				sprintf(tmpstr,"%.1f",pSet[i].fMin);	
+				break;
+			case 2:   //浮点数
+				sprintf(tmpstr,"%.2f",pSet[i].fMin);	
+				break;
+			case 3:   //浮点数
+				sprintf(tmpstr,"%.3f",pSet[i].fMin);	
+				break;
+			default:
+				sprintf(tmpstr,"%.2f",pSet[i].fMin);	
+				break;
+			}
+			strcat(g_page_dis.str[j],tmpstr);
+			strcat(g_page_dis.str[j],"~");
+			switch(_set_get_float_disp((void *)&pSet[i].fMax))
+			{
+			case 0:   //浮点数
+				sprintf(tmpstr,"%.0f",pSet[i].fMax);	
+				break;
+			case 1:   //浮点数
+				sprintf(tmpstr,"%.1f",pSet[i].fMax);	
+				break;
+			case 2:   //浮点数
+				sprintf(tmpstr,"%.2f",pSet[i].fMax);	
+				break;
+			case 3:   //浮点数
+				sprintf(tmpstr,"%.3f",pSet[i].fMax);	
+				break;
+			default:
+				sprintf(tmpstr,"%.2f",pSet[i].fMax);	
+				break;
+			}
+			strcat(g_page_dis.str[j],tmpstr);		
+		}
+
+		return FALSE;
+	}
+	return TRUE; 	
+}
+
+
+/******************************************************************************
+函数名称:	_set_net_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	网卡类型参数初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_net_init(void)
+{
+	int i;
+	for(i=PARA_IP_104MASTER1; i<(PARA_IP_104MASTER4+1); i++)
+	{
+		g_netpara[i*4+0].tt = ((DWORD)m_SetBuf[i].tt>>24)&0xff;
+		g_netpara[i*4+1].tt = ((DWORD)m_SetBuf[i].tt>>16)&0xff;
+		g_netpara[i*4+2].tt = ((DWORD)m_SetBuf[i].tt>>8)&0xff;
+		g_netpara[i*4+3].tt = (DWORD)m_SetBuf[i].tt&0xff;	
+	}
+
+	for(i=PARA_IP_NET1; i<(PARA_GATE_NET+1); i++)
+	{
+		g_netpara[i*4+0].tt = ((DWORD)m_SetBuf[i].tt>>24)&0xff;
+		g_netpara[i*4+1].tt = ((DWORD)m_SetBuf[i].tt>>16)&0xff;
+		g_netpara[i*4+2].tt = ((DWORD)m_SetBuf[i].tt>>8)&0xff;
+		g_netpara[i*4+3].tt = (DWORD)m_SetBuf[i].tt&0xff;	
+	}
+
+	g_netpara[PARA_IP_SNTP*4+0].tt = ((DWORD)m_SetBuf[PARA_IP_SNTP].tt>>24)&0xff;
+	g_netpara[PARA_IP_SNTP*4+1].tt = ((DWORD)m_SetBuf[PARA_IP_SNTP].tt>>16)&0xff;
+	g_netpara[PARA_IP_SNTP*4+2].tt = ((DWORD)m_SetBuf[PARA_IP_SNTP].tt>>8)&0xff;
+	g_netpara[PARA_IP_SNTP*4+3].tt = (DWORD)m_SetBuf[PARA_IP_SNTP].tt&0xff;	
+	
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_set_time_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	时钟类型参数初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_time_init(int set_no)
+{
+	struct timespec ts;
+	struct rtc_time_t tTime;
+
+	memset(&ts, 0, sizeof(ts));
+	memset(&tTime, 0, sizeof(tTime));
+
+	// 年月日
+	ts.tv_sec = (long)m_SetBuf[set_no].tt;	
+	timespec_to_rtc(ts,&tTime,1);
+
+	g_timepara[0].tt = tTime.year;
+	g_timepara[1].tt = tTime.month;
+	g_timepara[2].tt = tTime.day;
+
+	// 时分秒
+	memset(&ts, 0, sizeof(ts));
+	ts.tv_sec = (long)m_SetBuf[set_no+1].tt;
+	timespec_to_rtchms(ts,&tTime,1);
+	
+	g_timepara[3].tt = tTime.hour;
+	g_timepara[4].tt = tTime.min;
+	g_timepara[5].tt = tTime.ms/1000;
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_net_save
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	网卡类型参数保存
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_net_save(void)
+{
+	int i;
+	
+	for(i=PARA_IP_104MASTER1; i<(PARA_IP_104MASTER4+1); i++)
+	{
+		m_SetBuf[i].tt = (u32)(g_netpara[i*4+0].tt<<24) | (g_netpara[i*4+1].tt<<16) | (g_netpara[i*4+2].tt<<8) | (g_netpara[i*4+3].tt);
+	}
+
+	for(i=PARA_IP_NET1; i<(PARA_GATE_NET+1); i++)
+	{
+		m_SetBuf[i].tt = (u32)(g_netpara[i*4+0].tt<<24) | (g_netpara[i*4+1].tt<<16) | (g_netpara[i*4+2].tt<<8) | (g_netpara[i*4+3].tt);
+	}
+
+	i = PARA_IP_SNTP;
+	m_SetBuf[i].tt = (u32)(g_netpara[i*4+0].tt<<24) | (g_netpara[i*4+1].tt<<16) | (g_netpara[i*4+2].tt<<8) | (g_netpara[i*4+3].tt);
+
+	return 0;
+}
+
+  
+/******************************************************************************
+函数名称:	_set_time_save
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	时钟类型参数保存
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _set_time_save(void)
+{
+	struct timespec ts;
+	struct rtc_time_t tTime;
+
+	memset(&ts, 0, sizeof(ts));
+	memset(&tTime, 0, sizeof(tTime));
+
+	tTime.year = g_timepara[0].tt;
+	tTime.month = g_timepara[1].tt;
+	tTime.day = g_timepara[2].tt;
+	rtc_to_timespec(&tTime, &ts);
+	m_SetBuf[PARA_BATBEGIN_YMD].tt = ts.tv_sec;
+	
+	memset(&ts, 0, sizeof(ts));
+	memset(&tTime, 0, sizeof(tTime));
+	tTime.hour = g_timepara[3].tt;
+	tTime.min = g_timepara[4].tt;
+	tTime.ms = g_timepara[5].tt;
+	ts.tv_sec = mktimehms(tTime.hour, tTime.min, tTime.ms);
+	m_SetBuf[PARA_BATBEGIN_HMS].tt = ts.tv_sec;
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_set_save_func
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-30
+函数说明:	保存设置
+参数说明:	无
+返回值:  	成功返回1.
+修改记录:	
+*/
+static int _set_save_func(u8 menu)
+{
+	u8 result = 0;
+	int index;
+	
+	switch(menu)
+	{
+		case MENU_FIX:
+		{
+		    //do nothing
+
+		}
+		break;
+
+		case MENU_FIX_PUB:
+		{
+			index = 0;
+			_set_change_set(&tPubSetTable[0], PUB_SET_NUMBER, index);		
+			if(!_set_check_set(&tPubSetTable[0], PUB_SET_NUMBER, m_SetBuf))
+			{
+				soe_record_opt(EV_SET_FAIL,0);
+				result = -1;
+				break;
+			}
+			else if(SaveSet(m_runsection,(void *)m_SetBuf))
+			{
+				soe_record_opt(EV_SET_OK,0);
+				MakeRunSet(false); 
+				rt_err_clr(ERR_CODE_SET,0);
+				result = 1;
+			}
+			else
+			{
+				soe_record_opt(EV_SET_FAIL,0);
+				result = -2;
+				break;
+			}
+		}
+		break;
+
+		case MENU_GLBH:
+		case MENU_LXBH:
+		case MENU_JDBH:
+		case MENU_RECLOSE:
+		case MENU_BH_STATUS:
+		case MENU_DLYX:
+		case MENU_HJS:
+		{
+		    u8  sw_index =0;
+
+		    if(menu == MENU_GLBH)
+		        sw_index = class_GLBH.sw_idx;
+		    else if(menu == MENU_LXBH)
+		        sw_index = class_LXBH.sw_idx;
+            else if(menu == MENU_JDBH)
+                sw_index = class_JDBH.sw_idx;
+            else if(menu == MENU_RECLOSE)
+                sw_index = class_reclose.sw_idx;
+            else if(menu == MENU_BH_STATUS)
+                sw_index = class_BH_sts.sw_idx;
+			else if(menu == MENU_DLYX)
+                sw_index = class_DLYX.sw_idx;
+			else if(menu == MENU_HJS)
+                sw_index = class_HJS.sw_idx;
+            else
+                sw_index = 0;
+
+		    //------------
+			index = PUB_SET_NUMBER + sw_index *SW_SET_NUMBER;
+			_set_change_set(&tSwSetTable[0], SW_SET_NUMBER, index);		
+			if(!_set_check_set(&tSwSetTable[0], SW_SET_NUMBER, &m_SetBuf[index]))
+			{
+				soe_record_opt(EV_SET_FAIL,0);
+				result = -1;
+				break;
+			}
+			else if(SaveSet(m_runsection,(void *)m_SetBuf))
+			{
+				soe_record_opt(EV_SET_OK,0);
+				MakeRunSet(false); 
+				rt_err_clr(ERR_CODE_SET,0);
+				result = 1;
+			}
+			else
+			{
+				soe_record_opt(EV_SET_FAIL,0);
+				result = -2;
+				break;
+			}
+		}
+		break;
+	
+		case MENU_PARA:
+		{
+			index = 0;
+			_set_net_save();
+			_set_time_save();
+			_set_change_set(&tEquipParaTable[0], EQUIP_PARA_NUMBER, index);		
+			if(!_set_check_set(&tEquipParaTable[0], EQUIP_PARA_NUMBER, m_SetBuf))
+			{
+				soe_record_opt(EV_EQUPARA_FAIL,0);
+				result = -1;
+			}
+			else if(SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]))
+			{
+				soe_record_opt(EV_EQUPARA_OK,0);
+				MakeRunPara(false, false); 
+				rt_err_clr(ERR_CODE_EQU_PARA,0);
+				result = 1;
+			}
+			else
+			{
+				soe_record_opt(EV_EQUPARA_FAIL,0);
+				result = -2;
+			}
+		}
+		break;
+
+        case MENU_FAULT_RESET:
+        {
+            index = 0;
+            _set_change_set(&tEquipParaTable[0], EQUIP_PARA_NUMBER, index);
+            if(!_set_check_set(&tEquipParaTable[0], EQUIP_PARA_NUMBER, m_SetBuf))
+            {
+                soe_record_opt(EV_EQUPARA_FAIL,0);
+                result = -1;
+            }
+            else if(SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]))
+            {
+                soe_record_opt(EV_EQUPARA_OK,0);
+                MakeRunPara(false, false);
+                rt_err_clr(ERR_CODE_EQU_PARA,0);
+                result = 1;
+            }
+            else
+            {
+                soe_record_opt(EV_EQUPARA_FAIL,0);
+                result = -2;
+            }
+        }
+        break;
+
+		case  MENU_RUN_PARA:
+		{
+            int ret;
+            index = 0;
+
+            ret = _save_rmt_para_val(g_rmt_para_disp.sw_num);
+            if(ret==0)  //Save OK
+                result = 1;
+            else
+                result = -1;
+
+            rt_free(run_para_pick_set);
+            rt_free(run_para_setbuf);
+            run_para_pick_set = NULL;
+            run_para_setbuf   = NULL;
+		}
+		break;
+
+		case MENU_INFIX:
+			index = 0;
+			_set_change_set(&tCstSetTable[0],CSTSET_NUMBER, index);	
+			if(!_set_check_set(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf))
+			{
+				soe_record_opt(EV_CSTSET_FAIL,0);
+				result = -1;
+			}
+			else if(SavePara((void *)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]))
+			{
+				soe_record_opt(EV_CSTSET_OK,0);  // 内部定值整定成功
+				MakeRunSet(false); 			// 将当前运行定值区转换为运行定值区
+				rt_err_clr(ERR_CODE_SET_IN,0);	
+				result = 1;
+			}
+			else
+			{
+				soe_record_opt(EV_CSTSET_FAIL,0);  
+				result = -2;
+			}
+		break;
+
+		case MENU_TIMESET:
+		{
+			TIME mt;
+			index = 0;
+			_set_change_set(&tTimeTable[0],TIME_SET_NUMBER, index);
+			mt.year=m_SetBuf[TIME_YEAR].ff;
+			mt.month=m_SetBuf[TIME_MONTH].ff;
+			mt.day=m_SetBuf[TIME_DAY].ff;
+			mt.hour=m_SetBuf[TIME_HOUR].ff;
+			mt.min=m_SetBuf[TIME_MINUTE].ff;
+			mt.ms=(WORD)m_SetBuf[TIME_SECOND].ff*1000;
+			if(!_set_check_set(&tTimeTable[0],TIME_SET_NUMBER,m_SetBuf))
+			{
+				result = -1;
+			}
+			else if(sys_time_set(&mt) == 0)
+			{
+				result = 1;
+			}
+			else
+			{
+				result = -2;
+			}
+		}
+		break;
+
+		case MENU_CODE:
+		{
+			index = 0;
+			_set_change_set(&tCodeTable[0],CODE_SET_NUMBER, index);
+			if(!_set_check_set(&tCodeTable[0],CODE_SET_NUMBER,m_SetBuf))
+			{
+				result = -1;
+			}
+			else if(m_SetBuf[0].ff==INTER_PASSWORD)
+			{
+				rt_printf("新密码无效");
+				result = -1;
+			}
+			else if (SavePassword((DWORD )m_SetBuf[0].ff))
+			{
+				tRunPara.wPassword=ReadPassword();				
+				result = 1;
+			}
+			else
+			{
+				result = -2;
+			}
+
+		}
+		break;
+	}
+
+	return result;
+}
+/**************************************************************************
+函数名称:_password_check
+函数版本:1.00 
+作    者:   
+创建日期:2008.9.1     
+函数说明:检查密码是否正确
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/ 
+static int _password_check(u8 code)
+{
+    u32 password;
+	u8  mater_menu;
+
+	// 将设置值转为数值
+	_set_change_set(&tPasswordTable[0], 1, 0);
+
+	// 取出当前输入的密码
+	password = m_SetBuf[0].ff;
+
+	if (((password == tRunPara.wPassword) && (code&0x01))
+		|| ((password == PASS_WORD_SUPER) && (code&0x02)))
+	{
+		// 进入次级菜单
+		g_page_cur = page_table[g_slavemenu];
+		check_cur_wnd_item();
+	}
+	else 
+	{
+		// 保留上级菜单
+		mater_menu = g_page_cur.menu_m;
+		
+		// 进入密码错误页面
+		g_page_cur = page_table[MENU_PASSERR];		
+		check_cur_wnd_item();
+		g_page_cur.menu_m = mater_menu;
+	}
+
+	// 初始化部分未初始化的页面
+	_enter_menu_init();
+
+	return 0;
+}
+
+int _reset_page_dis(void)
+{
+	memset (g_page_dis.str, 0, 10*18);
+
+	return 0;
+}
+
+/**************************************************************************
+函数名称:_blk_light_app
+函数版本:1.00 
+作    者:   
+创建日期:2008.9.1     
+函数说明: 液晶背光自动关闭
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/ 
+int _blk_light_app(u8 key)
+{
+	static unsigned long us0, us1;
+	static int flag=TRUE, flag1=TRUE;
+
+	// 初始化定时器
+	if (flag)
+	{
+		us0 = ustimer_get_origin();
+		flag = FALSE;
+	}
+	// 5分钟无按键,关背光,重新初始化定时器
+	if((ustimer_get_duration(us0) >= tRunPara.dLightTime*USTIMER_SEC)
+		&& (key == NO_KEY)
+		&& (g_tLcdComm.tLight.light == LIGHT_ON)
+		&& (tRunPara.dLightTime!=0))
+	{
+		g_tLcdComm.tLight.light = LIGHT_OFF;
+		g_tLcdComm.tLight.flag = true;
+		query_page_other_proc();
+		while(g_page_cur.menu_cur != MENU_MAIN)
+		{
+			
+			_esc_key_menu();
+			Add_Clear_Screen();
+			reset_update_flag();
+		}
+		flag = TRUE;
+	}
+
+	// 有按键,亮背光,清定时器
+	if (key != NO_KEY)
+	{
+		g_tLcdComm.tLight.light = LIGHT_ON;
+		g_tLcdComm.tLight.flag = true;
+		flag = TRUE;
+	}
+	// 无按键,无背光,清定时器
+	else if (g_tLcdComm.tLight.light == LIGHT_OFF)
+	{
+		flag = TRUE;
+	}
+
+	// 初始化定时器
+	if (flag1)
+	{
+		us1 = ustimer_get_origin();
+		flag1 = FALSE;
+	}
+	
+	#if 0
+	// 5分钟无按键,关背光,重新初始化定时器
+	if((ustimer_get_duration(us1) >= 300*USTIMER_SEC)
+		&& (key == NO_KEY))
+	{
+		while(g_page_cur.menu_cur != MENU_MAIN)
+		{
+			_esc_key_menu();
+			Add_Clear_Screen();
+			reset_update_flag();
+		}
+		flag1 = TRUE;
+	}
+	#endif
+	// 有按键,亮背光,清定时器
+	if (key != NO_KEY)
+	{
+		flag1 = TRUE;
+	}
+	return 0;
+}
+
+/**************************************************************************
+函数名称:_save_resulr_autoback
+函数版本:1.00 
+作    者:EW   
+创建日期:2023.11.15     
+函数说明: 保存成功界面自动返回,失败时不自动返回
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/ 
+static void _save_result_autoback(void)
+{
+	if(g_item_update.autoback)
+	{
+		if(dTCounter-g_item_update.autoback_dly > (T_1s*1))
+		{
+			g_item_update.autoback = 0;
+			// 返回上一级菜单
+			g_page_cur = page_table[g_page_cur.menu_m];
+			check_cur_wnd_item();
+			Add_Clear_Screen();
+		}
+	}
+}
+
+/**************************************************************************
+函数名称:_rmt_pair_dely
+函数版本:1.00 
+作    者:   
+创建日期:2008.9.1     
+函数说明: 遥控器配对界面自动返回
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/ 
+int _rmt_pair_dely(u8 key)
+{
+	if (rmtpair_dely[0][0])
+	{
+		if(ustimer_get_duration(rmtpair_dely[0][1]) >= 30*USTIMER_SEC)
+		{
+			rmtpair_dely[0][0] = 0;
+			return HA_KEY_ESC;
+		}
+	}
+
+	if (rmtpair_dely[1][0])
+	{
+		if(ustimer_get_duration(rmtpair_dely[1][1]) >= 10*USTIMER_SEC)
+		{
+			rmtpair_dely[1][0] = 0;
+			return HA_KEY_ESC;
+		}
+	}
+
+	return key;
+}
+
+/**************************************************************************
+函数名称:_gprs_disp_update
+函数版本:1.00 
+作    者:   
+创建日期:2008.9.1     
+函数说明: GPRS信息自动刷新
+输入参数:
+输出参数:
+返回值:
+日期:	  
+*/ 
+static int _gprs_disp_update(void)
+{
+	if (gprs_info_up[0])
+	{
+		if(ustimer_get_duration(gprs_info_up[1]) >= 3*USTIMER_SEC)
+		{
+			_info_gprs_init();
+			Add_Clear_Screen();
+			gprs_info_up[1] = ustimer_get_origin();
+			return 0;
+		}		
+	}
+
+	return -1;
+}
+//query_page的其它处理.当进入query_page时,如果这时面板重启,则应处理一些特殊的变量
+//比如		rmtpair_dely,rmtpair_dely,gprs_info_up
+//如果不处理这些的话,会导致页面的实体数量item_num产生错误的值,从而使得界面显示凌乱
+void query_page_other_proc(void)
+{
+
+	if (rmtpair_dely[0][0])
+	{
+		rmtpair_dely[0][0] = 0;
+	}
+	if (rmtpair_dely[1][0])
+	{
+		rmtpair_dely[1][0] = 0;
+	}
+	if (gprs_info_up[0])
+	{
+		gprs_info_up[0] = 0;
+	}
+	//Add_Clear_Screen();
+}
+
+int mmd_get_gprs_info(void) 
+{
+
+	BYTE *pd=tGprsInf.data;
+	int num=0;
+	if(!tGprsInf.bInf)return 0;
+	tGprsInf.bInf=false;
+
+	if(pd[0]==1)
+	{
+		strcpy(strGprsInf[num++],"模块状态 :正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"模块状态 :异常");
+
+	}
+
+	if(pd[1]==1)
+	{
+		strcpy(strGprsInf[num++],"SIM卡状态:正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"SIM卡状态:异常");
+
+	}
+
+	if(pd[2]==1)
+	{
+		strcpy(strGprsInf[num++],"PPP拨号  :正常");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"PPP拨号  :异常");
+
+	}
+
+	sprintf(strGprsInf[num++],"信号强度 :%2d",pd[9]);
+	sprintf(strGprsInf[num++],"IP:%d.%d.%d.%d",pd[19],pd[20],pd[21],pd[22]);	
+	
+
+
+	if(pd[10]==1)
+	{
+		strcpy(strGprsInf[num++],"频段:900MHz");
+	}
+	else
+	{
+		strcpy(strGprsInf[num++],"频段:1800MHz(其他)");
+
+	}
+
+	sprintf(strGprsInf[num++],"ICMP延时:%d ms",(pd[24]|(pd[23]<<8)));
+
+	sprintf(strGprsInf[num++],"上传字节数:%d",(pd[34]|(pd[33]<<8)|(pd[32]<<16)|(pd[31]<<24)));
+	sprintf(strGprsInf[num++],"下载字节数:%d",(pd[38]|(pd[37]<<8)|(pd[36]<<16)|(pd[35]<<24)));
+	
+
+	g_gprs_info_num = num;
+
+	return num;
+}
+/*------------------------------ 测试函数 -------------------------------------
+*/

+ 45 - 0
dtu/dtu_main_t536/app/key_menu.h

@@ -0,0 +1,45 @@
+/******************************************************************************
+版权所有:	深圳市金宏威实业发展有限公司
+文件名称:	key_menu.h
+文件版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-29
+功能说明:	按键菜单管理
+其它说明:
+修改记录:
+*/
+#ifndef _KEY_MENU_H
+#define _KEY_MENU_H
+/*------------------------------- 头文件 --------------------------------------
+*/
+
+/*------------------------------- 宏定义 --------------------------------------
+*/
+
+
+/*------------------------------ 类型结构 -------------------------------------
+*/
+
+/*------------------------------ 变量声明 -------------------------------------
+*/
+extern struct page_st g_page_cur;			//当前页面
+extern struct 	page_st g_page_set;			// 当前设置页面
+extern SET_VALUE m_SetBuf[MAX_SET_NUMBER];
+extern int  g_gprs_info_num;				// GPRS信息个数
+extern u8 strGprsInf[20][24];
+extern u32 rmtpair_dely[2][2];	// 用于遥控器配对延时返回
+
+/*------------------------------ 函数声明 -------------------------------------
+*/
+int key_hmi_app(void);
+int init_default_equip_set(int value);
+int check_cur_wnd_item(void);
+int gprs_get_info(void);
+void query_page_other_proc(void);
+
+#endif //_KEY_MENU_H
+
+/*------------------------------ 文件结束 -------------------------------------
+*/
+
+

+ 15 - 0
dtu/dtu_main_t536/app/led.c

@@ -104,6 +104,7 @@ int led_init(void)
 */
 int led_init_hmi(void)
 {
+#if 0 //zhl 屏蔽这方式
     u32 slot;
     g_led_hmi=0;
     // 检查状态板是否配置
@@ -137,7 +138,21 @@ int led_init_hmi(void)
 
 	strcpy(m_Zdjl_chr,"退出");
 #endif
+#else
+
+	if(g_led_slot[EQU_SLOT_HMI].num)
+	{
+		g_led_hmi = &g_led_slot[EQU_SLOT_HMI];
+		return 0;
+	}
 
+	if(g_hmi_type < HMI_TYPE_NUM)
+	{
+		g_led_hmi = &g_led_hmi_default[g_hmi_type];
+	}
+	
+	g_led_hmi = 0;
+#endif
 	return 0;
 }
 

+ 2 - 0
dtu/dtu_main_t536/app/m.h

@@ -62,6 +62,8 @@
 #define SIG_BATHH_FILE		0X11785422	//电池活化记录文件签名
 #define SIG_MTPWD_FILE		0X11785423	//维护工具密码文件签名
 
+#define SIG_FILE_LED_RES_FILE	0X11785431	//LED灯状态文件签名
+#define SIG_FILE_FLOWREV_RES_FILE	0X11785432	//潮变数据记录文件签名
 
 /*------------------------------ 类型结构 -------------------------------------
 */

+ 1 - 1
dtu/dtu_main_t536/app/main.c

@@ -207,7 +207,7 @@ int app_main (void *unused)
 //		dido_test();
 //		rtc_test();
 #ifdef CPU_FUXI
-		msleep(100);
+		msleep(10);
 		// shm_comm_test();
 #endif
 		// ϵͳµÄtickÃë

+ 3599 - 0
dtu/dtu_main_t536/app/menudesc.c

@@ -0,0 +1,3599 @@
+/******************************************************************************
+版权所有:	深圳市金宏威实业发展有限公司
+文件名称:	menudesc.c
+文件版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+功能说明:	菜单结构	
+其它说明:
+修改记录:
+*/
+/*------------------------------- 头文件 --------------------------------------
+*/
+#include "head.h"
+ 
+/*------------------------------- 宏定义 --------------------------------------
+*/
+// 一行显示可显示菜单、开入、测量、定值
+#define 	LINE_MENU		2
+#define		LINE_KR			1
+#define		LINE_AC			1
+
+#define		SET_LINE		2
+
+#define 	STR_LEN_MENU    4   //4=4chars, 8=8chars
+
+// 时间的显示方式
+enum
+{
+	LINE_MD,
+	PAGE_MD,
+};
+/*------------------------------ 类型结构 -------------------------------------
+*/
+
+/*------------------------------ 全局变量 -------------------------------------
+*/
+// zhl add start
+u8 m_setgroup[GROUP_NUM];
+u8 bPubSetMenuShow[SET_PUB_NUM];
+u8 bSwSetMenuShow[SET_NUM];
+u8 bParaSetMenuShow[PARA_NUM];
+u8 bCstSetMenuShow[CSTSET_NUM];
+typedef struct MENU_MEA
+{
+	u8      index[MEA_MENU_MAX];
+	u8      num;
+	
+}MENU_MEA;
+MENU_MEA tMenuMea;
+u8 g_lcd_size = 4;
+bool g_bVipSoe_show = false;
+// zhl add end
+
+extern unsigned short	m_CodeCrc; 
+
+//固定菜单定义
+const struct menu_table menu_base_table[MENU_NUM]=
+{
+	{0,		 0,		0},
+	{"菜单",   0,		0},
+	{"运行状态", 0,		0},
+	{"系统设置", 0,		0},
+	{"系统记录", 0,		0},
+	{"装置维护", 0,		0},
+	{"信息参数", 0,    0},
+	{"点表信息", 0,    0},
+
+	{"遥信", 0,		0},
+	{"遥测", 0,		0},
+	{"标志", 0,		0},
+	{"时间", 0,		0},
+#if ((SWITCH_NUM_MAX == 16) ||  (SWITCH_NUM_MAX == 4) ||  (SWITCH_NUM_MAX == 6) || (SWITCH_NUM_MAX == 1)) 
+	{"定值参数", 1,		0},
+#endif	
+	{"装置参数", 0x1,	1},
+	{"系统时间", 0x1,	1},
+	{"电池参数", 0,		0},
+	{"运行参数", 0x1,  1},
+	{"故障复归", 0x1,  1},
+#if ((SWITCH_NUM_MAX == 16) ||  (SWITCH_NUM_MAX == 4) ||  (SWITCH_NUM_MAX == 6) || (SWITCH_NUM_MAX == 1)) 
+	{"公共",   0,		1},
+	{"开关01", 0,		0},
+#if ((SWITCH_NUM_MAX == 16) ||  (SWITCH_NUM_MAX == 4) ||  (SWITCH_NUM_MAX == 6)) 	
+	{"开关02", 0,		0},
+	{"开关03", 0,		0},
+	{"开关04", 0,		0},
+#endif	
+#if ((SWITCH_NUM_MAX == 16) ||  (SWITCH_NUM_MAX == 6)) 	
+	{"开关05", 0,		0},
+	{"开关06", 0,		0},
+#endif	
+#if SWITCH_NUM_MAX == 16	
+	{"开关07", 0,		0},
+	{"开关08", 0,		0},
+	{"开关09", 0,		0},
+	{"开关10", 0,		0},
+	{"开关11", 0,		0},
+	{"开关12", 0,		0},
+	{"开关13", 0,		0},
+	{"开关14", 0,		0},
+	{"开关15", 0,		0},
+	{"开关16", 0,		0},
+#endif	
+#endif	
+	{"事件", 0,		0},
+	{"操作", 0,		0},
+    {"固有参数", 0,     0},
+    {"通讯参数", 0,     0},
+	{"遥信点表", 0,     0},
+    {"遥测点表", 0,     0},
+	{"测试", 0x2,	0},
+	{"校准", 0x2,	0},
+	{"遥控", 0x2,	0},
+	{"设置", 0x2,	1},
+	{"密码", 0x1,	1},
+	{"清除", 0x2,	0},
+	{"信息", 0,		0},
+	{"开出", 0,		0},
+	{"人机", 0,		0},
+	{"交流", 0,		0},
+	{"直流", 0,		0},
+	{"版本", 0,		0},
+	{"配置", 0,		0},
+	{"错误", 0,		0},
+	{"调试", 0,		0},
+	{"GPRS", 0,		0},
+
+	{"保护压板", 0,     1},
+	{"过流保护", 0,     1},
+	{"零序保护", 0,     1},
+	{"接地保护", 0,     1},
+	{"重合闸  ", 0,     1},
+	{"后加速  ", 0,     1},
+	{"电流越限", 0,     1},
+
+	{"公共遥信", 0,     0},
+	{"开关遥信", 0,     0},
+	{"公共遥测", 0,     0},
+	{"开关遥测", 0,     0},
+
+	{"重合闸", 0,     0},
+	{"遥控器", 0,     0},
+
+
+};
+
+// 固定实体定义
+struct item_table item_base_table[ITEM_NUM]=
+{
+	{"版本", 	 0, 	(u8 *)&g_board_info[0].version},
+	{"CRC", 	 SET_H, (u8 *)&m_CodeCrc},
+	{"装置资源", SET_H, (u8 *)&g_crc_rsc},
+	{"板卡资源", SET_H, (u8 *)&g_crc_brd_res},
+	{"通道配置", SET_H, (u8 *)&g_crc_equ_cfg},
+	{"转发点表", SET_H, (u8 *)&g_crc_rectable},
+	{"定值描述", SET_H, (u8 *)&g_crc_set_desc},
+	{"定值数据", SET_H, (u8 *)&g_crc_set_data},
+	{"LCD测试",  0, 	0},
+	{"LED测试",  0, 	0},
+	{"清除事件", 0, 	0},
+	{"清除操作", 0, 	0},	
+	{"100V 5A 正序", 0, 0},
+	{"1.输入10V",0, 	0},
+	{"2.输入50V",0, 	0},	
+	{"保存",	 0,		0},			
+	{"确认",	 0,		0},		
+	{"取消",	 0,		0},
+	{"遥控器A",  0,		(u8 *)&g_run_stu.rmt_A},
+	{"遥控器B",  0,		(u8 *)&g_run_stu.rmt_B},
+	{"遥控器C",  0,		(u8 *)&g_run_stu.rmt_C},
+	{"遥控器D",  0,		(u8 *)&g_run_stu.rmt_D},
+	// {"重合充电", 0,		(u8 *)&g_disp_flag.chz_cd}, // TODO: 需要后续完善
+	{"遥控配对", 0, 	0},
+	{"清除配对", 0, 	0},
+	// {"小电流重合充电", 0,(u8 *)&g_disp_flag.xdl_chz_cd}, // TODO: 需要后续完善
+};
+
+// 主菜单
+struct item main_disp[]=
+{
+	{MENU_TYPE,	MENU_RUNSTU, 	0,	0},
+	{MENU_TYPE,	MENU_SET, 		0,	0},
+	{MENU_TYPE,	MENU_SOE, 		0,	0},
+	{MENU_TYPE,	MENU_DEBUG, 	0,	0},
+    {MENU_TYPE, MENU_INFO_PARA, 0,  0},
+	{MENU_TYPE, MENU_TABLE_INFO, 0,  0},
+};
+#define MainNum	sizeof(main_disp)/sizeof(struct item)
+
+// 工况菜单
+struct item run_disp[]=
+{
+	{MENU_TYPE,MENU_KR, 		0,	0},
+	{MENU_TYPE,MENU_AC, 		0,	0},
+	{MENU_TYPE,MENU_FLAG, 		0,	0},
+	{MENU_TYPE,MENU_TIME, 		0,	0},
+};
+#define RunNum	sizeof(run_disp)/sizeof(struct item)
+
+// 设置菜单
+struct item set_disp[]=
+{
+	{MENU_TYPE, MENU_FIX,        0,  0},
+	{MENU_TYPE, MENU_PARA,       0,  0},
+	{MENU_TYPE, MENU_TIMESET,    0,  0},
+	{MENU_TYPE, MENU_BAT,        0,  0},
+	{MENU_TYPE, MENU_RUN_PARA,   0,  0},
+	{MENU_TYPE, MENU_FAULT_RESET,0,  0},
+};
+#define SetNum	sizeof(set_disp)/sizeof(struct item)
+
+// 间隔菜单
+struct item sw_x_disp[]=
+{
+	{MENU_TYPE, MENU_BH_STATUS, 0,  0},
+    {MENU_TYPE, MENU_GLBH,      0,  0},
+    {MENU_TYPE, MENU_LXBH,      0,  0},
+    {MENU_TYPE, MENU_JDBH,      0,  0},
+    {MENU_TYPE, MENU_RECLOSE,   0,  0},
+	{MENU_TYPE, MENU_HJS, 		0,  0},
+	{MENU_TYPE, MENU_DLYX, 		0,  0},
+};
+#define SWxNum  sizeof(sw_x_disp)/sizeof(struct item)
+
+const u8 sw_menu_num = SWxNum;
+
+#if SWITCH_NUM_MAX == 16
+// 设置菜单
+struct item setsw_disp[]=
+{
+	{MENU_TYPE,	MENU_FIX_PUB, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW1, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW2, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW3, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW4, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW5, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW6, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW7, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW8, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW9, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW10, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW11, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW12, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW13, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW14, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW15, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW16, 	0,	0},
+};
+#define SetswNum	sizeof(setsw_disp)/sizeof(struct item)
+
+#elif SWITCH_NUM_MAX == 8
+
+// 设置菜单
+struct item setsw_disp[]=
+{
+	{MENU_TYPE,	MENU_FIX_PUB, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW1, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW2, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW3, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW4, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW5, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW6, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW7, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW8, 	0,	0},
+};
+#define SetswNum	sizeof(setsw_disp)/sizeof(struct item)
+#elif SWITCH_NUM_MAX == 6
+
+// 设置菜单
+struct item setsw_disp[]=
+{
+	{MENU_TYPE,	MENU_FIX_PUB, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW1, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW2, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW3, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW4, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW5, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW6, 	0,	0},
+};
+#define SetswNum	sizeof(setsw_disp)/sizeof(struct item)
+#elif SWITCH_NUM_MAX == 4
+
+// 设置菜单
+struct item setsw_disp[]=
+{
+	{MENU_TYPE,	MENU_FIX_PUB, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW1, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW2, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW3, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW4, 	0,	0},
+};
+#define SetswNum	sizeof(setsw_disp)/sizeof(struct item)
+#elif SWITCH_NUM_MAX == 1
+// 设置菜单
+struct item setsw_disp[]=
+{
+	{MENU_TYPE,	MENU_FIX_PUB, 	0,	0},
+	{MENU_TYPE,	MENU_FIX_SW1, 	0,	0},
+};
+#define SetswNum	sizeof(setsw_disp)/sizeof(struct item)
+#endif
+
+// 遥信菜单
+struct item kr_disp[]=
+{
+	{MENU_TYPE,MENU_PUB_YX, 	0,	0},
+	{MENU_TYPE,MENU_SW_YX, 		0,	0},
+};
+#define kr_dispNum	sizeof(kr_disp)/sizeof(struct item)
+
+struct item ac_disp[]=
+{
+	{MENU_TYPE,MENU_PUB_YC, 	0,	0},
+	{MENU_TYPE,MENU_SW_YC, 		0,	0},
+};
+#define ac_dispNum	sizeof(ac_disp)/sizeof(struct item)
+//标志菜单
+struct item others_flag_disp[]=
+{
+	{QUERY_FLAG,ITEM_RMT_A, 		0,	0},
+	{QUERY_FLAG,ITEM_RMT_B, 		0,	0},
+	{QUERY_FLAG,ITEM_RMT_C, 		0,	0},
+	{QUERY_FLAG,ITEM_RMT_D, 		0,	0},
+	// {QUERY_FLAG,ITEM_CHZ_CD, 		0,	0},
+	// {QUERY_FLAG,ITEM_XDL_CHZ_CD, 	0,	0},
+};
+#define othersflagNum	sizeof(others_flag_disp)/sizeof(struct item)
+
+// 标志菜单
+struct item flag_disp[]=
+{
+	{MENU_TYPE,MENU_CHZ_FLAG, 		0,	0},
+	{MENU_TYPE,MENU_OTHERS_FLAG, 	0,	0},
+};
+#define flagNum	sizeof(flag_disp)/sizeof(struct item)
+
+// 记录菜单
+struct item soe_disp[]=
+{
+	{MENU_TYPE,MENU_SJSOE, 		0,	0},
+	{MENU_TYPE,MENU_CZSOE, 		0,	0},
+};
+#define SoeNum	sizeof(soe_disp)/sizeof(struct item)
+
+// 维护菜单
+struct item debug_disp[]=
+{
+	{MENU_TYPE,	MENU_TEST, 		0,	0},
+	{MENU_TYPE,	MENU_ADJUST, 	0,	0},
+	{MENU_TYPE,	MENU_RMT, 		0,	0},
+	{MENU_TYPE,	MENU_INFIX,		0,	0},
+	{MENU_TYPE,	MENU_CODE, 		0,	0},
+	{MENU_TYPE,	MENU_CLR, 		0,	0},
+	{MENU_TYPE,	MENU_INFO, 		0,	0},
+};
+#define DebugNum	sizeof(debug_disp)/sizeof(struct item)
+
+// 信息参数
+struct item info_para_disp[]=
+{
+    {MENU_TYPE, MENU_INFO_EQU,     0,  0},
+    {MENU_TYPE, MENU_COMM_PARA,    0,  0},
+};
+#define InfoParaNum    sizeof(info_para_disp)/sizeof(struct item)
+
+// 点表信息
+struct item info_table_disp[]=
+{
+    {MENU_TYPE, MENU_INFO_YX,     0,  0},
+    {MENU_TYPE, MENU_INFO_YC,     0,  0},
+};
+#define InfoTableNum    sizeof(info_table_disp)/sizeof(struct item)
+
+// 测试菜单
+struct item test_disp[]=
+{
+	{MENU_TYPE,MENU_TEST_KC, 	0,	0},
+	{MENU_TYPE,MENU_TEST_HMI, 	0,	0},
+};
+#define TestNum	sizeof(test_disp)/sizeof(struct item)
+
+// 校准菜单
+struct item adjust_disp[]=
+{
+	{MENU_TYPE,MENU_ADJUST_AC, 0,	0},
+	{MENU_TYPE,MENU_ADJUST_DC, 0,	0},
+};
+#define AdjustNum	sizeof(adjust_disp)/sizeof(struct item)
+
+// 遥控器菜单
+struct item rmt_disp[]=
+{
+	{ACTION_RMT_PAIR,ITEM_RMT_PAIR, 	0,	0},
+	{ACTION_DEL_PAIR,ITEM_DEL_PAIR, 	0,	0},
+};
+#define RmtNum	sizeof(rmt_disp)/sizeof(struct item)
+
+// 用户密码设置
+struct item item_code[]=
+{
+	// {SETTYPE_4INT,	CODE,		0,	0}, 
+    {SETTYPE_6INT,  CODE,       0,  0},
+};
+#define CodeNum		sizeof(item_code)/sizeof(struct item)
+
+// 清除事件记录
+struct item clr_soe[]=
+{
+	{ACTION_CLR_SOE,	ITEM_CLR_SJ,		0,	0},
+	{ACTION_CLR_SOE,	ITEM_CLR_CZ,		0,	0},
+};
+#define clrsoeNum		sizeof(clr_soe)/sizeof(struct item)
+
+// 信息菜单
+struct item item_info[]=
+{
+	{MENU_TYPE,	MENU_INFO_VER,		0,	0},
+	{MENU_TYPE,	MENU_INFO_CFG,		0,	0},
+	{MENU_TYPE,	MENU_INFO_ERR,		0,	0},
+	{MENU_TYPE,	MENU_INFO_DEBUG,	0,	0},
+	{MENU_TYPE,	MENU_INFO_GPRS,		0,	0},
+};
+#define InfoNum		sizeof(item_info)/sizeof(struct item)
+
+// 版本信息菜单
+struct item ver_info[]=
+{
+	{QUERY_VER,	ITEM_VER,		0,	0},
+	{QUERY_VER,	ITEM_CRC,		0,	0},
+};
+#define InfoVerNum		sizeof(ver_info)/sizeof(struct item)
+
+// 配置信息菜单
+struct item cfg_info[]=
+{
+	{QUERY_CFG,	ITEM_EQU,		0,	0},
+	{QUERY_CFG,	ITEM_BRD,		0,	0},
+	{QUERY_CFG,	ITEM_CFG,		0,	0},
+	{QUERY_CFG,	ITEM_IECTABLE,	0,	0},
+	{QUERY_CFG,	ITEM_SETDESC,	0,	0},
+	{QUERY_CFG,	ITEM_SETDATA,	0,	0},
+};
+#define InfoCfgNum		sizeof(cfg_info)/sizeof(struct item)
+
+// HMI测试菜单
+struct item hmi_test[]=
+{
+	{ACTION_TEST_LCD,	ITEM_TEST_LCD,		0,	0},
+	{ACTION_TEST_LED,	ITEM_TEST_LED,		0,	0},
+};
+#define hmitestNum		sizeof(hmi_test)/sizeof(struct item)
+
+// 交流校准
+struct item adjust_ac[]=
+{
+	{ACTION_ADJUST_AC,	ITEM_ADJUST_AC,		0,	0},
+};
+#define adjustacNum		sizeof(adjust_ac)/sizeof(struct item)
+
+// 直流校准
+struct item adjust_dc[]=
+{
+	{ACTION_ADJUST_DC10,ITEM_ADJUST_DC10,	0,	0},
+	{ACTION_ADJUST_DC50,ITEM_ADJUST_DC50,	0,	0},
+};
+#define adjustdcNum		sizeof(adjust_dc)/sizeof(struct item)
+
+// 是否保存
+struct item is_save[]=
+{
+	{ACTION_SAVE,		ITEM_SAVE_OK,		0,	0},
+	{ACTION_SAVE,		ITEM_SAVE_NOK,		0,	0},
+};
+#define is_saveNum		sizeof(is_save)/sizeof(struct item)
+
+struct item *item_pub_kr;	// 公共开入查询
+struct item *item_sw_kr;	// 开关开入查询
+struct item *item_pub_ac;	// 公共测量查询
+struct item *item_sw_ac;	// 开关测量查询
+struct item *item_flag;		// 标志查询
+struct item *item_time;		// 时间查询
+
+struct item *item_fix;		// 定值设置
+struct item *item_fix_GLBH;  // 定值设置
+struct item *item_fix_LXBH;  // 定值设置
+struct item *item_fix_JDBH;  // 定值设置
+struct item *item_fix_CHZ;   // 定值设置
+struct item *item_fix_BH_sts;// 保护状态
+struct item *item_fix_DLYX_sts;// 电流越限
+struct item *item_fix_HJS_sts;// 后加速
+
+struct item *item_para;		// 装置参数设置
+struct item *item_run_para; // 运行参数设置
+struct item *item_fault_reset; //故障复归
+struct item *item_infix;	// 内部定值设置
+struct item *item_timeset;	// 时间设置
+struct item *item_chz_flag;	// 重合闸标志
+
+struct item *item_sjsoe;	// 事件记录
+struct item *item_czsoe;	// 操作记录
+struct item *item_info_equ; // 装置信息 (固有参数)
+struct item *item_comm_para;// 通讯参数
+struct item *item_info_yx; // 遥信点表
+struct item *item_info_yc;// 遥测点表
+
+struct item *item_test_kc;	// 开出测试
+
+struct item *item_bat;		// 电池
+	
+struct item *item_info_err;	// 错误信息
+struct item *item_info_debug;//调试信息
+struct item *item_info_gprs;// GPRS信息
+
+struct item *item_password;	// 输入密码
+struct item *item_passerr;	// 输入密码错误
+struct item *item_saveresult;// 保存结果
+struct item *item_setrange;	// 定值范围
+struct item *item_adjustresult;	//校准结果	
+
+struct item *item_event;	// 突发事件
+struct item *item_rmtpair;	// 遥控器配对
+struct item *item_delpair;	// 遥控器配对清除
+const struct slave slave_table[]=
+{
+	{MENU_MAIN, 	{MENU_RUNSTU, 	MENU_SET, 		MENU_SOE, 		MENU_DEBUG, MENU_INFO_PARA, MENU_TABLE_INFO, 	MENU_NULL}},
+	{MENU_RUNSTU, 	{MENU_KR, 		MENU_AC, 		MENU_FLAG, 		MENU_TIME, 	MENU_NULL, 	    MENU_NULL, 			MENU_NULL}},
+	{MENU_SET, 		{MENU_FIX, 		MENU_PARA, 		MENU_TIMESET,	MENU_BAT, 	MENU_RUN_PARA,	MENU_FAULT_RESET, 	MENU_NULL}},
+#if SWITCH_NUM_MAX == 16
+	{MENU_FIX, 		{MENU_FIX_PUB, 	MENU_FIX_SW1, 	MENU_FIX_SW2,	MENU_FIX_SW3, 	MENU_FIX_SW4,	MENU_FIX_SW5, 	MENU_FIX_SW6,
+					MENU_FIX_SW7,	MENU_FIX_SW8,	MENU_FIX_SW9,	MENU_FIX_SW10,	MENU_FIX_SW11,	MENU_FIX_SW12,	MENU_FIX_SW13,
+					MENU_FIX_SW14,	MENU_FIX_SW15,	MENU_FIX_SW16}},
+
+    {MENU_FIX_SW1,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW2,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW3,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW4,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW5,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW6,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW7,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW8,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW9,   {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW10,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW11,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW12,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW13,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW14,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW15,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW16,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+#elif SWITCH_NUM_MAX == 6
+	{MENU_FIX, 		{MENU_FIX_PUB, 	MENU_FIX_SW1, 	MENU_FIX_SW2,	MENU_FIX_SW3, 	MENU_FIX_SW4,	MENU_FIX_SW5, 	MENU_FIX_SW6}},
+ 	{MENU_FIX_SW1,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW2,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW3,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW4,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW5,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+    {MENU_FIX_SW6,  {MENU_BH_STATUS,MENU_GLBH,      MENU_LXBH,      MENU_JDBH,      MENU_RECLOSE,   MENU_HJS,  MENU_DLYX}},
+#elif SWITCH_NUM_MAX == 4
+	{MENU_FIX, 		{MENU_FIX_PUB, 	MENU_FIX_SW1, 	MENU_FIX_SW2,	MENU_FIX_SW3, 	MENU_FIX_SW4}},
+#elif SWITCH_NUM_MAX == 1	
+	{MENU_FIX, 		{MENU_FIX_PUB, 	MENU_FIX_SW1}},
+#endif
+	{MENU_SOE, 		{MENU_SJSOE, 	MENU_CZSOE, 	MENU_NULL, 		MENU_NULL, 	MENU_NULL, 	MENU_NULL, 	MENU_NULL}},
+
+	{MENU_DEBUG, 	{MENU_TEST, 	MENU_ADJUST, 	MENU_RMT,		MENU_INFIX, MENU_CODE, 	MENU_CLR,	MENU_INFO}},
+	{MENU_INFO_PARA,{MENU_INFO_EQU, MENU_COMM_PARA, MENU_NULL,      MENU_NULL,  MENU_NULL,  MENU_NULL,  MENU_NULL}},
+	{MENU_TABLE_INFO,{MENU_INFO_YX, MENU_INFO_YC, MENU_NULL,      MENU_NULL,  MENU_NULL,  MENU_NULL,  MENU_NULL}},
+	
+	{MENU_TEST, 	{MENU_TEST_KC, 	MENU_TEST_HMI, 	MENU_NULL, 		MENU_NULL, 	MENU_NULL, 	MENU_NULL, 	MENU_NULL}},
+	{MENU_ADJUST, 	{MENU_ADJUST_AC,MENU_ADJUST_DC, MENU_NULL, 		MENU_NULL, 	MENU_NULL, 	MENU_NULL, 	MENU_NULL}},
+	{MENU_INFO, 	{MENU_INFO_VER, MENU_INFO_CFG, 	MENU_INFO_ERR, 	MENU_INFO_DEBUG, MENU_INFO_GPRS, MENU_NULL, MENU_NULL}},
+
+	{MENU_KR, 	{MENU_PUB_YX, MENU_SW_YX, 	MENU_NULL, 	MENU_NULL, MENU_NULL, MENU_NULL, MENU_NULL}},
+	{MENU_AC, 	{MENU_PUB_YC, MENU_SW_YC, 	MENU_NULL, 	MENU_NULL, MENU_NULL, MENU_NULL, MENU_NULL}},
+	{MENU_FLAG, {MENU_CHZ_FLAG,MENU_OTHERS_FLAG,MENU_NULL,MENU_NULL,MENU_NULL,MENU_NULL, MENU_NULL}}
+};
+const int slave_menu_num = sizeof(slave_table)/sizeof(struct slave);
+
+// 液晶尺寸相关定义
+struct lcdsize g_lcdsize;			// 当前液晶的尺寸
+struct lcdsize lcd_size_default[]=	// 默认液晶尺寸
+{
+	{128, 32},
+	{128, 64},
+	{128, 64},
+	{160, 160},
+};
+int lcdtype;						// 液晶尺寸类型
+int g_hmi_type;						// 面板类型
+
+int disp_pub_ac_index[PUB_AC_NUM_ALL][2];					// 配置或计算测量的索引
+int disp_sw_ac_index[SW_AC_NUM_ALL*SWITCH_NUM_MAX+SWITCH_NUM_MAX*9][2];		// 配置或计算测量的索引 (SWITCH_NUM_MAX*9填充补偿,一个开关的遥测一页可以显示完,剩余的空行显示空白,避免偏移溢出,增加数组补偿)
+struct 	page_st g_page_cur;			// 当前页面
+struct 	page_st g_page_set;			// 当前设置页面
+	
+struct item_update g_item_update;	// 实体更新标志
+struct cfg_index g_cfg_index;		
+struct page_dis g_page_dis;			// 用于页面类查询显示
+struct set_dis g_set_dis[5];		// 用于定值设置显示,预设最大支持一屏显示5个定值
+struct action g_action;
+struct disp_flag g_disp_flag;		// 菜单内的标志
+
+/*------------------------------ 函数声明 -------------------------------------
+*/
+int _lcd_size_check(struct lcdsize *lcd);
+int _wnd_item_init(struct page_st *ipage, struct lcdsize *isize, u8 lcd, u8 menutype,u8 menu_num);
+void _page_menu_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item);
+void _page_set_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item);
+void _page_query_line_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item);
+void _page_query_page_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item);
+void _page_action_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item);
+int _equ_di_index_init(void);
+int _equ_do_index_init(void);
+int _rtc_printf(u8 mode, char *str1, char *str2);
+int _set_value_dis_init(u8 no, u8 y);
+int _set_cursor_flash(u8 no, u8 x, u8 y, u8 mode);
+
+/*------------------------------ 外部函数 -------------------------------------
+外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
+*/
+//总菜单定义
+struct page_st page_table[]=
+{
+//	当前菜单		父菜单		菜单类型	实体数	  屏数  屏实体数  屏号	聚焦  标题 时间 实体索引	回调函数
+	{MENU_NULL,		0,0,	0,	0,		0,0,		0,	0,		0,	0,	0,	0},
+	// 主菜单
+	{MENU_MAIN,		MENU_MAIN,	MENU_TYPE_CH8,	MainNum,	0,		0,0,		0,	0,		0,	0,	main_disp,	_page_menu_disp},
+	
+	// 工况菜单(运行状态)
+	{MENU_RUNSTU,	MENU_MAIN,	MENU_TYPE,		RunNum,		0,		0,0,		0,	0,		0,	0,	run_disp,	_page_menu_disp},
+	// 设置菜单(系统设置)
+	{MENU_SET,		MENU_MAIN,	MENU_TYPE_CH8,	SetNum,		0,		0,0,		0,	0,		0,	0,	set_disp,	_page_menu_disp},
+	// 记录菜单(系统记录)
+	{MENU_SOE,		MENU_MAIN,	MENU_TYPE,	    SoeNum,		0,		0,0,		0,	0,		0,	0,	soe_disp,	_page_menu_disp},
+	// 维护菜单(装置维护)
+	{MENU_DEBUG,	MENU_MAIN,	MENU_TYPE,   	DebugNum,	0,		0,0,		0,	0,		0,	0,	debug_disp,	_page_menu_disp},
+    // 信息参数
+    {MENU_INFO_PARA,MENU_MAIN,  MENU_TYPE_CH8, InfoParaNum, 0,      0,0,        0,  0,      0,  0,  info_para_disp, _page_menu_disp},
+	// 点表信息
+    {MENU_TABLE_INFO,MENU_MAIN,  MENU_TYPE_CH8, InfoTableNum, 0,      0,0,        0,  0,      0,  0,  info_table_disp, _page_menu_disp},
+
+	// 开入查看
+	{MENU_KR,		MENU_RUNSTU,MENU_TYPE_CH8,	kr_dispNum,	0,		0,0,		0,	0,		0,	0,	kr_disp,	_page_menu_disp},
+	// 测量查看
+	{MENU_AC,		MENU_RUNSTU,MENU_TYPE_CH8,	ac_dispNum,	0,		0,0,		0,	0,		0,	0,	ac_disp,	_page_menu_disp},
+	// 标志查看
+	{MENU_FLAG,		MENU_RUNSTU,MENU_TYPE_CH8,	flagNum,	0,		0,0,		0,	0,		0,	0,	flag_disp,	_page_menu_disp},
+	// 时间查看
+	{MENU_TIME,		MENU_RUNSTU,QUERY_PAGE_TYPE,	0,	0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	// 定值设置
+//#if SWITCH_NUM_MAX == 1
+//	{MENU_FIX,		MENU_SET,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+//#else
+	{MENU_FIX,		MENU_SET,	MENU_TYPE,	SetswNum,	0,		0,0,		0,	0,		0,	0,	setsw_disp,	_page_menu_disp},
+//#endif
+	// 装置参数
+	{MENU_PARA,		MENU_SET,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	// 时间设置
+	{MENU_TIMESET,	MENU_SET,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	// 电池
+	{MENU_BAT,		MENU_SET,	ACTION_TYPE,0,			0,		0,0,		0,	0,		0,	0,	0,			_page_action_disp},
+    // 运行参数
+    {MENU_RUN_PARA, MENU_SET,   SET_TYPE,   0,          0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},
+    // 故障复归
+    {MENU_FAULT_RESET, MENU_SET,SET_TYPE,   0,          0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},
+	// 公共、线路定值
+#if SWITCH_NUM_MAX == 16
+	{MENU_FIX_PUB,	MENU_FIX,	SET_TYPE,	    0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW1,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,		0,		0,0,		0,	0,		0,	0,	sw_x_disp,	_page_menu_disp},
+	{MENU_FIX_SW2,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW3,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW4,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW5,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW6,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW7,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW8,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW9,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW10,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW11,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW12,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW13,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW14,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW15,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW16,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+#elif SWITCH_NUM_MAX == 8
+	{MENU_FIX_PUB,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW1,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW2,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW3,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW4,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW5,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW6,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW7,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW8,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+#elif SWITCH_NUM_MAX == 6
+	{MENU_FIX_PUB,	MENU_FIX,	SET_TYPE,	    0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW1,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,		0,		0,0,		0,	0,		0,	0,	sw_x_disp,	_page_menu_disp},
+	{MENU_FIX_SW2,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW3,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW4,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW5,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+	{MENU_FIX_SW6,	MENU_FIX,	MENU_TYPE_CH8,	SWxNum,     0,      0,0,        0,  0,      0,  0,  sw_x_disp,  _page_menu_disp},
+#elif SWITCH_NUM_MAX == 4
+	{MENU_FIX_PUB,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW1,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW2,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW3,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW4,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+#elif SWITCH_NUM_MAX == 1
+	{MENU_FIX_PUB,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	{MENU_FIX_SW1,	MENU_FIX,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+#endif
+
+	// 事件查看
+	{MENU_SJSOE,	MENU_SOE,	QUERY_PAGE_TYPE,	0,	0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+	// 操作查看
+	{MENU_CZSOE,	MENU_SOE,	QUERY_PAGE_TYPE,	0,	0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+    // 固有参数
+    {MENU_INFO_EQU, MENU_INFO_PARA, QUERY_PAGE_TYPE,      0,  0,      0,0,        0,  0,      0,  0,  0,    _page_query_page_disp},
+    // 通讯参数
+    {MENU_COMM_PARA,MENU_INFO_PARA, QUERY_PAGE_TYPE,      0,  0,      0,0,        0,  0,      0,  0,  0,    _page_query_page_disp},
+	// 遥信点表
+    {MENU_INFO_YX, MENU_TABLE_INFO, QUERY_PAGE_TYPE,      0,  0,      0,0,        0,  0,      0,  0,  0,    _page_query_page_disp},
+    // 遥测点表
+    {MENU_INFO_YC,MENU_TABLE_INFO, QUERY_PAGE_TYPE,      0,  0,      0,0,        0,  0,      0,  0,  0,    _page_query_page_disp},
+
+	// 测试菜单
+	{MENU_TEST,		MENU_DEBUG,	MENU_TYPE,	TestNum,	0,		0,0,		0,	0,		0,	0,	test_disp,	_page_menu_disp},
+	// 校准菜单
+	{MENU_ADJUST,	MENU_DEBUG,	MENU_TYPE,	AdjustNum,	0,		0,0,		0,	0,		0,	0,	adjust_disp,_page_menu_disp},
+	// 遥控器菜单
+	{MENU_RMT,		MENU_DEBUG,	ACTION_TYPE,RmtNum,		0,		0,0,		0,	0,		0,	0,	rmt_disp,	_page_action_disp},
+	// 内部定值
+	{MENU_INFIX,	MENU_DEBUG,	SET_TYPE,	0,			0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	// 用户密码修改
+	{MENU_CODE,		MENU_DEBUG,	SET_TYPE,	CodeNum,	0,		0,0,		0,	0,		0,	0,	item_code,	_page_set_disp},
+	// 操作清除
+	{MENU_CLR,		MENU_DEBUG,	ACTION_TYPE,clrsoeNum,	0,		0,0,		0,	0,		0,	0,	clr_soe,	_page_action_disp},
+	// 信息查看
+	{MENU_INFO,		MENU_DEBUG,	MENU_TYPE,	InfoNum,	0,		0,0,		0,	0,		0,	0,	item_info,	_page_menu_disp},
+
+	// 开出测试
+	{MENU_TEST_KC,	MENU_TEST,	ACTION_TYPE,0,			0,		0,0,		0,	0,		0,	0,	0,			_page_action_disp},
+	// 人机测试
+	{MENU_TEST_HMI,	MENU_TEST,	ACTION_TYPE,hmitestNum,	0,		0,0,		0,	0,		0,	0,	hmi_test,	_page_action_disp},
+
+	// 交流校准
+	{MENU_ADJUST_AC,MENU_ADJUST,ACTION_TYPE,adjustacNum,0,		0,0,		0,	0,		0,	0,	adjust_ac,	_page_action_disp},
+	// 直流校准
+	{MENU_ADJUST_DC,MENU_ADJUST,ACTION_TYPE,adjustdcNum,0,		0,0,		0,	0,		0,	0,	adjust_dc,	_page_action_disp},
+
+	// 版本信息
+	{MENU_INFO_VER,	MENU_INFO,	QUERY_1LINE_TYPE,InfoVerNum,0,	0,0,		0,	0,		0,	0,	ver_info,	_page_query_line_disp},
+	// 配置信息
+	{MENU_INFO_CFG,	MENU_INFO,	QUERY_1LINE_TYPE,InfoCfgNum,0,	0,0,		0,	0,		0,	0,	cfg_info,	_page_query_line_disp},
+	// 错误信息
+	{MENU_INFO_ERR,	MENU_INFO,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+	// 调试信息
+	{MENU_INFO_DEBUG,MENU_INFO,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+	// GPRS信息
+	{MENU_INFO_GPRS,MENU_INFO,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	//保护状态
+	{MENU_BH_STATUS, MENU_FIX, SET_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_set_disp},
+
+    //过流保护
+    {MENU_GLBH, MENU_FIX,   SET_TYPE,0,      0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},
+
+    //零序保护
+    {MENU_LXBH, MENU_FIX,   SET_TYPE,0,      0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},
+
+    //接地保护
+    {MENU_JDBH, MENU_FIX,   SET_TYPE,0,      0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},
+
+    //重合闸
+    {MENU_RECLOSE, MENU_FIX, SET_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,          _page_set_disp},  
+
+	//后加速
+	{MENU_HJS, 	MENU_FIX, 	 SET_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_set_disp},
+
+	//电流越限
+	{MENU_DLYX, 	 MENU_FIX, SET_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_set_disp},
+	
+	//公共遥信
+	{MENU_PUB_YX, 	 MENU_KR, QUERY_1LINE_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_query_line_disp},
+	//开关遥信
+	{MENU_SW_YX, 	 MENU_KR, QUERY_1LINE_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_query_line_disp},
+
+	//公共遥测
+	{MENU_PUB_YC, 	 MENU_AC, QUERY_1LINE_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_query_line_disp},
+	//开关遥测
+	{MENU_SW_YC, 	 MENU_AC, QUERY_1LINE_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,        _page_query_line_disp},
+
+	//重合闸标志
+	{MENU_CHZ_FLAG, 	 MENU_FLAG, QUERY_1LINE_TYPE,0,     0,      0,0,        0,  0,      0,  0,  0,  _page_query_line_disp},
+	//其它标志
+	{MENU_OTHERS_FLAG, 	 MENU_FLAG, QUERY_1LINE_TYPE,othersflagNum, 0,0,0,0,0,  0,  0,  others_flag_disp,_page_query_line_disp},
+	
+	// 输入密码
+	{MENU_PASSWORD,	MENU_NULL,	SET_TYPE,		0,		0,		0,0,		0,	0,		0,	0,	0,			_page_set_disp},
+	// 密码错误
+	{MENU_PASSERR,	MENU_NULL,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	// 退出保存
+	{MENU_SAVE,		MENU_NULL,	ACTION_TYPE,is_saveNum,	0,		0,0,		0,	0,		0,	0,	is_save,	_page_action_disp},
+	// 保存结果
+	{MENU_SAVE_RESULT,MENU_NULL,QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	// 定值范围
+	{MENU_SET_RANGE,MENU_NULL,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	//校准结果
+	{MENU_ADJUST_RESULT,MENU_ADJUST_AC,QUERY_PAGE_TYPE,	0,		0,	0,0,	0,	0,		0,	0,	0,			_page_query_page_disp},//xj 2015.5.9
+	
+	// 突发事件
+	{MENU_EVENT,	MENU_RUNSTU,QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+
+	// 遥控配对
+	{MENU_RMT_PAIR,	MENU_RMT,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+	// 遥控清除配对
+	{MENU_DEL_PAIR,	MENU_RMT,	QUERY_PAGE_TYPE,0,		0,		0,0,		0,	0,		0,	0,	0,			_page_query_page_disp},
+};
+/******************************************************************************
+函数名称:	menudesc_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	菜单初始化。
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int menudesc_init(u8 lcd_size)
+{
+	int i, sw, num;
+	int index_begin;
+	int occupy_line=0; 	// 被占用的行,以字符行为单位,16点
+	int write_line = 0;
+	u8 remainder = 0;
+	u8 extend_part[2][SWITCH_NUM_MAX] = {{0},{0}};
+
+	g_lcd_size = lcd_size;
+	g_lcdsize.x = lcd_size_default[lcd_size-1].x;
+	g_lcdsize.y = lcd_size_default[lcd_size-1].y;
+	// 获取液晶类型
+	lcdtype = _lcd_size_check(&g_lcdsize);
+	if (lcdtype < 0)
+	{
+		rt_printf("lcd_x = %d, lcd_y = %d\r\n",g_lcdsize.x, g_lcdsize.y);
+		g_lcdsize.x = 128;
+		g_lcdsize.y = 64;
+	}
+
+	/**********************开入查询初始化**********************/
+	//公共
+	num=0;
+	for(i=0;i<PUB_DI_NUM;i++)
+	{
+		if((short)g_sw_pub.di_cfg_index[i]!=INDEX_INVALLID)  //此遥信有配置
+		{
+			num++;
+		}
+	}
+
+	item_pub_kr = rt_malloc(num * sizeof(struct item));
+	if(item_pub_kr == NULL)
+	{
+		return -2; 	
+	}	
+	// 获取内容
+	for (i=0; i<num; i++)
+	{
+		item_pub_kr[i].type = QUERY_PUB_KR;
+		item_pub_kr[i].no = i;
+	}
+		
+	page_table[MENU_PUB_YX].item_num = num;
+	page_table[MENU_PUB_YX].page_item = item_pub_kr;
+
+	//开关
+	//开关遥信作特殊处理 modify by ew 20231113
+	if(lcdtype == MID || lcdtype == BIG)
+	{
+		//屏幕类型是MID或BIG的话就增加标题
+		//2*8标题汉字占用一行
+		occupy_line = 2;
+		//每屏可以容纳的实体数
+		write_line = (g_lcdsize.y/8 - occupy_line)/2;
+	}
+
+	num=0;
+	for(sw=0; sw<g_sw_num; sw++)
+	{
+		for(i=0;i<SW_DI_NUM;i++)
+		{
+			if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID)  //此遥信有配置
+			{				
+				num++;
+			}
+		}
+		remainder = (num % write_line);
+		extend_part[0][sw] = num;
+		if(remainder !=0 )
+		{
+			num += (write_line-remainder);
+		}
+		extend_part[1][sw] = num;
+	}
+
+	item_sw_kr = rt_malloc(num * sizeof(struct item));
+	if(item_sw_kr == NULL)
+	{
+		return -2; 	
+	}	
+
+	// 获取内容
+	sw = 0;
+	for (i=0; i<num; i++)
+	{
+		if(i < extend_part[0][sw])
+		{
+			item_sw_kr[i].type = QUERY_SW_KR;	
+		}
+		else
+		{
+			if(i < extend_part[1][sw])
+				item_sw_kr[i].type = QUERY_NUM;//遥信特殊处理,不显示
+			else
+			{
+				sw++;
+				if(i < extend_part[0][sw])
+				{
+					item_sw_kr[i].type = QUERY_SW_KR;
+				}
+			}
+		}
+		item_sw_kr[i].no = i;
+	}
+		
+	page_table[MENU_SW_YX].item_num = num;
+	page_table[MENU_SW_YX].page_item = item_sw_kr;
+	/**********************采样查询初始化**********************/
+	memset(disp_pub_ac_index, 0, sizeof(disp_pub_ac_index));
+	num=0;
+	for(i=0; i<PUB_AC_NUM; i++)
+	{
+		if ((g_ui[i].chn_index!=CFG_ADC_CHANNEL_ZERO)  
+			|| (g_ui[i].ui_base_make!=-1))
+		{
+			disp_pub_ac_index[num][0] = 0;
+			disp_pub_ac_index[num][1] = i;
+			num++;
+		}
+	}
+	
+	for(i=PUB_AC_NUM; i<PUB_AC_NUM+7; i++)
+	{
+		//DTUv4不在液晶显示
+		if(i == PUB_AC_IN_V_UNBALANCE1 || i == PUB_AC_IN_V_UNBALANCE2 \
+		|| i == PUB_AC_IN_UZ1 || i == PUB_AC_IN_UZ2 || i == PUB_AC_IN_F2)
+			continue;
+
+		disp_pub_ac_index[num][0] = 0;
+		disp_pub_ac_index[num][1] = i;
+		num++;
+	}
+	
+	item_pub_ac = rt_malloc(num * sizeof(struct item));
+	if(item_pub_ac == NULL)
+	{
+		return -3; 	
+	}	
+	// 获取内容
+	for (i=0; i<num; i++)
+	{
+		item_pub_ac[i].type = QUERY_PUB_AC;
+		item_pub_ac[i].no = i;
+	}
+	page_table[MENU_PUB_YC].item_num = num;
+	page_table[MENU_PUB_YC].page_item = item_pub_ac;
+
+	memset(disp_sw_ac_index, 0, sizeof(disp_sw_ac_index));
+	num = 0;
+	for(sw=0; sw<g_sw_num; sw++)
+	{
+		index_begin = UI_SW_INDEX_BEGIN(sw);
+		for(i=0; i<SW_AC_NUM+4; i++)
+		{
+			if (i<SW_AC_NUM)
+			{
+				if ((g_ui[index_begin+i].chn_index!=CFG_ADC_CHANNEL_ZERO)
+					|| (g_ui[index_begin+i].ui_base_make!=-1))
+				{				
+					disp_sw_ac_index[num][0] = sw+1;
+					disp_sw_ac_index[num][1] = i;
+					num++;
+				}
+			}
+			else
+			{
+				disp_sw_ac_index[num][0] = sw+1;
+				disp_sw_ac_index[num][1] = i;
+				num++;				
+			}
+		}
+		remainder = (num % write_line);
+		extend_part[0][sw] = num;
+		if(remainder !=0 )
+		{
+			num += (write_line-remainder);
+		}
+		extend_part[1][sw] = num;
+	}	
+
+
+	item_sw_ac = rt_malloc(num * sizeof(struct item));
+	if(item_sw_ac == NULL)
+	{
+		return -3; 	
+	}	
+	// 获取内容
+	sw = 0;
+	for (i=0; i<num; i++)
+	{
+		if(i < extend_part[0][sw])
+		{
+			item_sw_ac[i].type = QUERY_SW_AC;	
+		}
+		else
+		{
+			if(i < extend_part[1][sw])
+				item_sw_ac[i].type = QUERY_NUM;//遥测特殊处理,不显示
+			else
+			{
+				sw++;
+				if(i < extend_part[0][sw])
+				{
+					item_sw_ac[i].type = QUERY_SW_AC;
+				}
+			}
+		}
+
+		item_sw_ac[i].no = i;
+	}
+	page_table[MENU_SW_YC].item_num = num;
+	page_table[MENU_SW_YC].page_item = item_sw_ac;
+	/**********************时间查询初始化**********************/
+	item_time = rt_malloc(TIME_NUM * sizeof(struct item));
+	if(item_time == NULL)
+	{
+		return -4; 	
+	}	
+	// 获取内容
+	for (i=0; i<TIME_NUM; i++)
+	{
+		item_time[i].type = QUERY_TIME;
+		item_time[i].no = i;
+	}
+	page_table[MENU_TIME].item_num = TIME_NUM;
+	page_table[MENU_TIME].page_item = item_time;
+
+	/**********************定值初始化**********************/
+	// 分配内存
+
+	// 公共定值
+	item_fix = rt_malloc(g_pub_setdisp.num * sizeof(struct item));
+	if(item_fix == NULL)
+	{
+		return -5; 	
+	}
+	//公共定值
+	for (i=0; i<g_pub_setdisp.num; i++)
+	{
+		item_fix[i].type = 0; 
+		item_fix[i].no = i;
+	}	
+	page_table[MENU_FIX_PUB].item_num = g_pub_setdisp.num;
+	page_table[MENU_FIX_PUB].page_item = item_fix;
+
+	//过流保护
+	num = class_GLBH.num;
+	item_fix_GLBH = rt_malloc(num * sizeof(struct item));
+	if(item_fix_GLBH == NULL)
+	{
+		return -5; 	
+	}
+	// 获取内容
+	for (i=0; i<num; i++)
+	{
+	    item_fix_GLBH[i].type = 0;
+	    item_fix_GLBH[i].no = i;
+	}	
+	page_table[MENU_GLBH].item_num  = num;
+	page_table[MENU_GLBH].page_item = item_fix_GLBH;
+	
+    //零序保护
+    num = class_LXBH.num;
+    item_fix_LXBH = rt_malloc(num * sizeof(struct item));
+    if(item_fix_LXBH == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+        item_fix_LXBH[i].type = 0;
+        item_fix_LXBH[i].no = i;
+    }
+    page_table[MENU_LXBH].item_num  = num;
+    page_table[MENU_LXBH].page_item = item_fix_LXBH;
+
+    //接地保护
+    num = class_JDBH.num;
+    item_fix_JDBH = rt_malloc(num * sizeof(struct item));
+    if(item_fix_JDBH == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+        item_fix_JDBH[i].type = 0;
+        item_fix_JDBH[i].no = i;
+    }
+    page_table[MENU_JDBH].item_num  = num;
+    page_table[MENU_JDBH].page_item = item_fix_JDBH;
+
+    //重合闸
+    num = class_reclose.num;
+    item_fix_CHZ = rt_malloc(num * sizeof(struct item));
+    if(item_fix_CHZ == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+        item_fix_CHZ[i].type = 0;
+        item_fix_CHZ[i].no = i;
+    }
+    page_table[MENU_RECLOSE].item_num  = num;
+    page_table[MENU_RECLOSE].page_item = item_fix_CHZ;
+
+	// 保护状态
+    num = class_BH_sts.num;
+    item_fix_BH_sts = rt_malloc(num * sizeof(struct item));
+    if(item_fix_BH_sts == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+    	item_fix_BH_sts[i].type = 0;
+    	item_fix_BH_sts[i].no = i;
+    }
+    page_table[MENU_BH_STATUS].item_num  = num;
+    page_table[MENU_BH_STATUS].page_item = item_fix_BH_sts;
+
+	//电流越限
+    num = class_DLYX.num;
+    item_fix_DLYX_sts = rt_malloc(num * sizeof(struct item));
+    if(item_fix_DLYX_sts == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+    	item_fix_DLYX_sts[i].type = 0;
+    	item_fix_DLYX_sts[i].no = i;
+    }
+    page_table[MENU_DLYX].item_num  = num;
+    page_table[MENU_DLYX].page_item = item_fix_DLYX_sts;
+
+	//后加速
+    num = class_HJS.num;
+    item_fix_HJS_sts = rt_malloc(num * sizeof(struct item));
+    if(item_fix_HJS_sts == NULL)
+    {
+        return -5;
+    }
+    // 获取内容
+    for (i=0; i<num; i++)
+    {
+    	item_fix_HJS_sts[i].type = 0;
+    	item_fix_HJS_sts[i].no = i;
+    }
+    page_table[MENU_HJS].item_num  = num;
+    page_table[MENU_HJS].page_item = item_fix_HJS_sts;
+
+
+
+	/**********************装置参数初始化**********************/
+	// 分配内存
+	item_para = rt_malloc(EQUIP_PARA_NUMBER * sizeof(struct item));
+	if(item_para == NULL)
+	{
+		return -6; 	
+	}
+	// 获取内容
+	for (i=0; i<EQUIP_PARA_NUMBER; i++)
+	{
+		item_para[i].type = tEquipParaTable[i].wType;
+		item_para[i].no = i;
+	}	
+	page_table[MENU_PARA].item_num  = EQUIP_PARA_NUMBER;
+	page_table[MENU_PARA].page_item = item_para;
+
+    /**********************运行参数初始化**********************/
+    // 分配内存
+	item_run_para = rt_malloc(g_rmt_para_disp.total * sizeof(struct item));
+    if(item_run_para == NULL)
+    {
+        return -23;
+    }
+
+    // 获取内容
+    for (i=0; i<g_rmt_para_disp.total; i++)
+    {
+        item_run_para[i].type = 0; 
+        item_run_para[i].no = i;
+    }
+    page_table[MENU_RUN_PARA].item_num  = g_rmt_para_disp.total;
+    page_table[MENU_RUN_PARA].page_item = item_run_para;
+    /**********************故障复归初始化**********************/
+    // 分配内存
+    item_fault_reset = rt_malloc(g_faultRst_setdisp.num * sizeof(struct item));
+    if(item_fault_reset == NULL)
+    {
+        return -24;
+    }
+
+    // 获取内容
+    for (i=0; i<g_faultRst_setdisp.num; i++)
+    {
+        item_fault_reset[i].type = 0;
+        item_fault_reset[i].no = i;
+    }
+    page_table[MENU_FAULT_RESET].item_num  = g_faultRst_setdisp.num;
+    page_table[MENU_FAULT_RESET].page_item = item_fault_reset;
+	
+	/**********************内部定值初始化**********************/
+	// 分配内存
+	item_infix = rt_malloc(CSTSET_NUMBER * sizeof(struct item));
+	if(item_infix == NULL)
+	{
+		return -7; 	
+	}
+	// 获取内容
+	for (i=0; i<CSTSET_NUMBER; i++)
+	{
+		item_infix[i].type = tCstSetTable[i].wType;
+		item_infix[i].no = i;
+	}	
+	page_table[MENU_INFIX].item_num = CSTSET_NUMBER;
+	page_table[MENU_INFIX].page_item = item_infix;
+	
+	/**********************时间初始化**********************/
+	// 分配内存
+	item_timeset = rt_malloc(TIME_SET_NUMBER * sizeof(struct item));
+	if(item_timeset == NULL)
+	{
+		return -8; 	
+	}
+	// 获取内容
+	for (i=0; i<TIME_SET_NUMBER; i++)
+	{
+	    item_timeset[i].type = tTimeTable[i].wType;
+	    item_timeset[i].no = i;
+	}	
+	page_table[MENU_TIMESET].item_num = TIME_SET_NUMBER;
+	page_table[MENU_TIMESET].page_item = item_timeset;
+
+	/**********************重合闸充电标志**********************/
+	// 分配内存
+	// 根据开关数动态分配
+	item_chz_flag = rt_malloc(g_sw_num * sizeof(struct item));
+	if(item_chz_flag == NULL)
+	{
+		return -25; 	
+	}
+	// 获取内容
+	for (i=0; i<g_sw_num; i++)
+	{
+	    item_chz_flag[i].type = QUERY_CHZ_FLAG;
+	    item_chz_flag[i].no = i;
+	}	
+	page_table[MENU_CHZ_FLAG].item_num = g_sw_num;
+	page_table[MENU_CHZ_FLAG].page_item = item_chz_flag;
+
+	/**********************事件查询初始化**********************/
+	// 以一个事件为一页面,实体数量由EVENT_SHOW结构的str预分配
+	item_sjsoe = rt_malloc(8*sizeof(struct item));
+	if(item_sjsoe == NULL)
+	{
+		return -9; 	
+	}	
+	// 获取内容
+	for (i=0; i<8; i++)
+	{
+		item_sjsoe[i].type = QUERY_SJSOE;
+		item_sjsoe[i].no = i;
+	}
+	page_table[MENU_SJSOE].item_num = 8;
+	page_table[MENU_SJSOE].page_item = item_sjsoe;	
+
+	/**********************操作查询初始化**********************/
+	// 以一个事件为一页面,实体数量由EVENT_SHOW结构的str预分配
+	item_czsoe = rt_malloc(8 * sizeof(struct item));
+	if(item_czsoe == NULL)
+	{
+		return -10; 	
+	}	
+	// 获取内容
+	for (i=0; i<8; i++)
+	{
+		item_czsoe[i].type = QUERY_CZSOE;
+		item_czsoe[i].no = i;
+	}
+	page_table[MENU_CZSOE].item_num = 8;
+	page_table[MENU_CZSOE].page_item = item_czsoe;	
+	
+	/**********************开出测试初始化**********************/
+	num=0;
+	for(i=0;i<PUB_DO_NUM;i++)
+	{
+		if((short)g_sw_pub.do_cfg_index[i]!=INDEX_INVALLID)  //有配置
+		{
+			num++;
+		}
+	}
+	for(sw=0; sw<SWITCH_NUM_MAX; sw++)
+	{
+		for(i=0;i<SW_DO_NUM;i++)
+		{
+			if((short)g_sw[sw].do_cfg_index[i]!=INDEX_INVALLID)  //有配置
+			{				
+				num++;
+			}
+		}
+	}
+	item_test_kc = rt_malloc(num * sizeof(struct item));
+	if(item_test_kc == NULL)
+	{
+		return -12; 	
+	}	
+	// 获取内容
+	for (i=0; i<num; i++)
+	{
+		item_test_kc[i].type = ACTION_TEST_KC;
+		item_test_kc[i].no = i;
+	}
+	page_table[MENU_TEST_KC].item_num = num;
+	page_table[MENU_TEST_KC].page_item = item_test_kc;
+	
+	/**********************电池测试初始化**********************/
+	num=0;
+	for(i=PUB_DO_DCHH;i<PUB_DO_HHTC+1;i++)
+	{
+		if((short)g_sw_pub.do_cfg_index[PUB_DO_DCHH]!=INDEX_INVALLID)  //此有配置
+		{
+			num++;
+		}
+	}
+	item_bat = rt_malloc(num * sizeof(struct item));
+	if(item_bat == NULL)
+	{
+		return -12; 	
+	}	
+	// 获取内容
+	for (i=0; i<num; i++)
+	{
+		item_bat[i].type = ACTION_BAT;
+		item_bat[i].no = i;
+	}
+	page_table[MENU_BAT].item_num = num;
+	page_table[MENU_BAT].page_item = item_bat;
+	/**********************错误信息初始化**********************/
+	// 以所有错误信息为一页面,页面实体为8,即支持8个错误
+	item_info_err = rt_malloc(INFO_ERR_QUERY*sizeof(struct item));
+	if(item_info_err == NULL)
+	{
+		return -13; 	
+	}	
+	// 获取内容
+	for (i=0; i<INFO_ERR_QUERY; i++)
+	{
+		item_info_err[i].type = QUERY_ERR;
+		item_info_err[i].no = i;
+	}
+	page_table[MENU_INFO_ERR].item_num = INFO_ERR_QUERY;
+	page_table[MENU_INFO_ERR].page_item = item_info_err;	
+
+	/**********************调试信息初始化**********************/
+	// 以所有调试信息为一页面,页面实体为6,即支持6个调试信息,一个占两行
+	item_info_debug = rt_malloc(INFO_DEBUG_QUERY*sizeof(struct item));
+	if(item_info_debug == NULL)
+	{
+		return -14; 	
+	}	
+	// 获取内容
+	for (i=0; i<INFO_DEBUG_QUERY; i++)
+	{
+		item_info_debug[i].type = QUERY_DEBUG;
+		item_info_debug[i].no = i;
+	}
+	page_table[MENU_INFO_DEBUG].item_num = INFO_DEBUG_QUERY;
+	page_table[MENU_INFO_DEBUG].page_item = item_info_debug;	
+
+	/**********************GPRS信息初始化**********************/
+	// 以所有GPRS信息为一页面,页面实体为16,即支持16个调试信息,一个占两行
+	item_info_gprs = rt_malloc(INFO_GPRS_QUERY*sizeof(struct item));
+	if(item_info_gprs == NULL)
+	{
+		return -14; 	
+	}	
+	// 获取内容
+	for (i=0; i<INFO_GPRS_QUERY; i++)
+	{
+		item_info_gprs[i].type = QUERY_GPRS;
+		item_info_gprs[i].no = i;
+	}
+	page_table[MENU_INFO_GPRS].item_num = INFO_GPRS_QUERY;
+	page_table[MENU_INFO_GPRS].page_item = item_info_gprs;	
+
+	/**********************装置信息初始化**********************/
+    // 以所有装置信息为一页面, 一条占两行
+	item_info_equ = rt_malloc(MAX_LINE_PER_PAGE*sizeof(struct item));
+    if(item_info_equ == NULL)
+    {
+        return -21;
+    }
+    // 获取内容
+    for (i=0; i<MAX_LINE_PER_PAGE; i++)
+    {
+        item_info_equ[i].type = QUERY_EQU;
+        item_info_equ[i].no   = i;
+    }
+    page_table[MENU_INFO_EQU].item_num  = MAX_LINE_PER_PAGE;
+    page_table[MENU_INFO_EQU].page_item = item_info_equ;
+
+    /**********************通讯参数初始化**********************/
+    // 以所有装置信息为一页面, 一条占两行
+    item_comm_para = rt_malloc(MAX_LINE_PER_PAGE*sizeof(struct item));
+    if(item_comm_para == NULL)
+    {
+        return -22;
+    }
+    // 获取内容
+    for (i=0; i<MAX_LINE_PER_PAGE; i++)
+    {
+        item_comm_para[i].type = QUERY_COMM_PARA;
+        item_comm_para[i].no   = i;
+    }
+    page_table[MENU_COMM_PARA].item_num  = MAX_LINE_PER_PAGE;
+    page_table[MENU_COMM_PARA].page_item = item_comm_para;
+
+	/**********************遥信点表初始化**********************/
+    // 以所有遥信信息为一页面, 一条占两行
+	item_info_yx = rt_malloc(MAX_LINE_PER_PAGE*sizeof(struct item));
+    if(item_info_yx == NULL)
+    {
+        return -21;
+    }
+    // 获取内容
+    for (i=0; i<MAX_LINE_PER_PAGE; i++)
+    {
+        item_info_yx[i].type = QUERY_YX;
+        item_info_yx[i].no   = i;
+    }
+    page_table[MENU_INFO_YX].item_num  = MAX_LINE_PER_PAGE;
+    page_table[MENU_INFO_YX].page_item = item_info_yx;
+
+    /**********************遥测点表初始化**********************/
+    // 以所有遥测信息为一页面, 一条占两行
+    item_info_yc = rt_malloc(MAX_LINE_PER_PAGE*sizeof(struct item));
+    if(item_info_yc == NULL)
+    {
+        return -22;
+    }
+    // 获取内容
+    for (i=0; i<MAX_LINE_PER_PAGE; i++)
+    {
+        item_info_yc[i].type = QUERY_YC;
+        item_info_yc[i].no   = i;
+    }
+    page_table[MENU_INFO_YC].item_num  = MAX_LINE_PER_PAGE;
+    page_table[MENU_INFO_YC].page_item = item_info_yc;
+
+	/**********************输入密码初始化**********************/
+	// 分配内存
+	item_password = rt_malloc(1 * sizeof(struct item));
+	if(item_password == NULL)
+	{
+		return -15; 	
+	}
+	// 获取内容
+	item_password[0].type = tCodeTable[0].wType;
+	item_password[0].no = 0;
+	
+	page_table[MENU_PASSWORD].item_num = 1;
+	page_table[MENU_PASSWORD].page_item = item_password;
+
+	/**********************密码错误初始化**********************/
+	// 以所有错误信息为一页面,页面占用2行
+	item_passerr = rt_malloc(2 * sizeof(struct item));
+	if(item_passerr == NULL)
+	{
+		return -16; 	
+	}
+	// 获取内容
+	for (i=0; i<2; i++)
+	{
+		item_passerr[i].type = QUERY_PASSERR;
+		item_passerr[i].no = 0;
+	}
+	page_table[MENU_PASSERR].item_num = 2;
+	page_table[MENU_PASSERR].page_item = item_passerr;
+
+	/**********************保存结果初始化**********************/
+	// 以保存结果信息为一页面,页面占用1行
+	item_saveresult = rt_malloc(1 * sizeof(struct item));
+	if(item_saveresult == NULL)
+	{
+		return -17; 	
+	}
+	// 获取内容
+	for (i=0; i<1; i++)
+	{
+		item_saveresult[i].type = QUERY_SAVERESULT;
+		item_saveresult[i].no = 0;
+	}
+	page_table[MENU_SAVE_RESULT].item_num = 1;
+	page_table[MENU_SAVE_RESULT].page_item = item_saveresult;
+
+	/**********************定值范围初始化**********************/
+	// 以保存结果信息为一页面,页面占用2行
+	item_setrange = rt_malloc(2 * sizeof(struct item));
+	if(item_setrange == NULL)
+	{
+		return -18; 	
+	}
+	// 获取内容
+	for (i=0; i<2; i++)
+	{
+		item_setrange[i].type = QUERY_SETRANGE;
+		item_setrange[i].no = 0;
+	}
+	page_table[MENU_SET_RANGE].item_num = 2;
+	page_table[MENU_SET_RANGE].page_item = item_setrange;
+
+	/**********************突发事件查询初始化**********************/
+	// 以一个事件为一页面,实体数量由EVENT_SHOW结构的str预分配
+	item_event = rt_malloc(8*sizeof(struct item));
+	if(item_event == NULL)
+	{
+		return -19; 	
+	}	
+	// 获取内容
+	for (i=0; i<8; i++)
+	{
+		item_event[i].type = QUERY_EVENT;
+		item_event[i].no = i;
+	}
+	page_table[MENU_EVENT].item_num = 8;
+	page_table[MENU_EVENT].page_item = item_event;	
+
+	/**********************遥控器配对查询初始化**********************/
+	item_rmtpair = rt_malloc(2*sizeof(struct item));
+	if(item_rmtpair == NULL)
+	{
+		return -20; 	
+	}	
+	// 获取内容
+	for (i=0; i<2; i++)
+	{
+		item_rmtpair[i].type = QUERY_RMTPAIR;
+		item_rmtpair[i].no = i;
+	}
+	page_table[MENU_RMT_PAIR].item_num = 2;
+	page_table[MENU_RMT_PAIR].page_item = item_rmtpair;	
+
+	/**********************遥控器配对查询初始化**********************/
+	item_delpair = rt_malloc(2*sizeof(struct item));
+	if(item_delpair == NULL)
+	{
+		return -20; 	
+	}	
+	// 获取内容
+	for (i=0; i<2; i++)
+	{
+		item_delpair[i].type = QUERY_DELPAIR;
+		item_delpair[i].no = i;
+	}
+	page_table[MENU_DEL_PAIR].item_num = 2;
+	page_table[MENU_DEL_PAIR].page_item = item_delpair;	
+	
+	/**********************校准结果初始化**********************/
+	// 以校准结果信息为一页面,页面占用2行
+	item_adjustresult = rt_malloc(1 * sizeof(struct item));	
+	if(item_adjustresult == NULL)
+	{
+		return -20;
+	}
+	
+	for (i=0; i<1; i++)
+	{
+		item_adjustresult[i].type = QUERY_ADJUSTRESULT;
+		item_adjustresult[i].no = 0;
+	}
+
+	page_table[MENU_ADJUST_RESULT].item_num = 1;
+	page_table[MENU_ADJUST_RESULT].page_item = item_adjustresult;
+
+	// 窗体、实体初始化
+	for (i=0; i<MENU_NUM; i++)
+	{
+		if (page_table[i].item_num != 0)
+		{
+			_wnd_item_init(&page_table[i], &g_lcdsize, lcdtype, page_table[i].pagetype,i);
+		}
+	}	
+
+	memset(&g_cfg_index,0,sizeof(g_cfg_index));
+	memset(&g_disp_flag,0,sizeof(g_disp_flag));
+	
+	_equ_di_index_init();
+	_equ_do_index_init();
+
+	g_page_cur = page_table[MENU_MAIN];
+	check_cur_wnd_item();
+	
+	reset_update_flag();
+
+	g_item_update.time_dly = dTCounter;
+	g_item_update.title_dly = dTCounter;
+
+	for (i=0; i<10; i++)
+	{
+		g_item_update.kr_dly[i] = dTCounter;
+		g_item_update.ac_dly[i] = dTCounter;
+		g_item_update.zf_dly[i] = dTCounter;
+		g_item_update.name_dly[i] = dTCounter;
+	}
+
+	memset(g_action.action, 0, 10);
+
+	led_init_hmi();
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	menudesc_exit
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	菜单退出。
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int menudesc_exit(void)
+{
+	rt_free(item_pub_kr);
+	rt_free(item_sw_kr);
+	rt_free(item_pub_ac);
+	rt_free(item_sw_ac);
+	rt_free(item_flag);
+	rt_free(item_time);
+	rt_free(item_fix);
+	rt_free(item_fix_GLBH);
+	rt_free(item_fix_LXBH);
+	rt_free(item_fix_JDBH);
+	rt_free(item_fix_CHZ);
+	rt_free(item_fix_BH_sts);
+	rt_free(item_fix_DLYX_sts);
+	rt_free(item_fix_HJS_sts);
+	rt_free(item_para);
+    rt_free(item_run_para);
+	rt_free(item_infix);
+	rt_free(item_timeset);
+	rt_free(item_sjsoe);
+	rt_free(item_czsoe);
+	rt_free(item_test_kc);
+	rt_free(item_info_err);
+	rt_free(item_info_debug);
+	rt_free(item_info_gprs);
+	rt_free(item_password);
+	rt_free(item_passerr);
+	rt_free(item_info_equ);
+	rt_free(item_comm_para);
+	rt_free(item_info_yx);
+	rt_free(item_info_yc);
+	rt_free(item_saveresult);
+	rt_free(item_setrange);
+	rt_free(item_event);
+	rt_free(item_chz_flag);
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	menu_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	页面处理
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int menu_disp(void)
+{
+#if 0
+	static unsigned long us0;
+	static int flag=TRUE;
+
+	if (flag)
+	{
+		us0 = ustimer_get_origin();
+		flag = FALSE;
+	}
+
+	if(ustimer_get_duration(us0) >= 1000*USTIMER_MS)
+	{
+		rt_printf("\r\nmenu_cur=%d, menu_m=%d, pagetype=%d, item_num=%d,wnd_num=%d, wnd_item=%d, cur_wnd_item=%d, cur_wnd=%d, cur_focus=%d, title=%d, time=%d\r\n",
+			g_page_cur.menu_cur,
+			g_page_cur.menu_m,
+			g_page_cur.pagetype,
+			g_page_cur.item_num,
+			g_page_cur.wnd_num,
+			g_page_cur.wnd_item,
+			g_page_cur.cur_wnd_item,
+			g_page_cur.cur_wnd,
+			g_page_cur.cur_focus,
+			g_page_cur.title,
+			g_page_cur.time
+			);
+		flag = TRUE;
+	}
+#endif
+	g_page_cur.DispFun(g_page_cur.cur_focus, g_page_cur.cur_wnd, g_page_cur.cur_wnd_item,g_page_cur.page_item);
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	reset_update_flag
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	重建实体更新标志
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+void reset_update_flag(void)
+{
+	u8 i;
+	u8 tmp = 0;
+	u32 tmp_time = 0;
+	tmp = g_item_update.autoback;
+	tmp_time = g_item_update.autoback_dly;
+	memset(&g_item_update, 0, sizeof(g_item_update));
+	g_item_update.title = 1;
+	g_item_update.time = 1;
+	g_item_update.time_dly = dTCounter;
+	g_item_update.title_dly = dTCounter;
+	g_item_update.flash_dly = dTCounter;
+	//以下两个特定情况刷新
+	g_item_update.autoback = tmp;
+	g_item_update.autoback_dly = tmp_time;
+
+	for (i=0; i<10; i++)
+	{
+		g_item_update.name[i] = 1;
+		g_item_update.data[i] = 1;
+		g_item_update.flash[i] = 1;
+		g_item_update.kr_dly[i] = dTCounter;
+		g_item_update.ac_dly[i] = dTCounter;
+		g_item_update.zf_dly[i] = dTCounter;
+		g_item_update.name_dly[i] = dTCounter;
+	}
+}
+
+/*------------------------------ 内部函数 -------------------------------------
+内部函数以下划线‘_’开头,不需要检查参数的合法性.
+*/
+/******************************************************************************
+函数名称:	_page_menu_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	菜单类页面处理
+参数说明:	ifocus:当前聚焦点
+			icur_wnd:当前屏
+			icur_wnd_item:当前屏分配的实体数
+			ipage_item:当前页面
+返回值:  	成功返回0.
+修改记录:	
+*/
+void _page_menu_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item)
+{
+	int index=0, i=0, flag=0;
+	int x=0, y=0;
+	char str[22]={0};
+	char *pname = NULL;
+	int  title_len = STR_LEN_MENU;
+
+	g_lcdsize.x = lcd_size_default[g_lcd_size-1].x;
+	g_lcdsize.y = lcd_size_default[g_lcd_size-1].y;
+
+	// 当前屏首个实体在页面中的实体序号
+	if (icur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * icur_wnd;
+	}
+
+	// 打印标题
+	if (g_page_cur.title && g_item_update.title)
+	{
+	    pname = menu_base_table[g_page_cur.menu_cur].name;
+	    title_len = strlen(pname);
+
+		// 坐标
+		x = (g_lcdsize.x - title_len *8) / 2;
+		y = 0;
+
+		// 打印
+		if(pname != (char *)0)
+		    fmt_Printf(x, y, MMI_FOCUS_NO, pname);
+
+		g_item_update.title = 0;
+	}
+	
+	// 打印菜单
+	for (i=0; i<icur_wnd_item; i++)
+	{
+		// 根据聚焦区分正显和反显
+		if (i == ifocus)
+		{
+			flag = MMI_FOCUS_NORMAL;
+		}
+		else
+		{
+			flag = MMI_FOCUS_NO;
+		}
+		if(dTCounter-g_item_update.name_dly[i] > (T_1s*10))
+		{	
+			g_item_update.name[i] = 1;
+			g_item_update.name_dly[i] = dTCounter;
+		}
+		if (g_item_update.name[i])
+		{
+		    pname = menu_base_table[ipage_item[index+i].no].name;
+		    if(pname != (char *)0)
+		        fmt_Printf(ipage_item[index+i].x, ipage_item[index+i].y, flag, pname);
+
+			g_item_update.name[i] = 0;
+		}
+	}
+	if(dTCounter-g_item_update.time_dly > T_1s)
+	{	
+		g_item_update.time = 1;
+		g_item_update.time_dly = dTCounter;
+	}
+	if(dTCounter-g_item_update.title_dly > (T_1s*10))
+	{	
+		g_item_update.title = 1;
+		g_item_update.title_dly = dTCounter;
+	}
+
+	// 打印时间 
+	if (g_page_cur.time && g_item_update.time)
+	{
+		_rtc_printf(LINE_MD, str, 0);
+		fmt_Printf(0, g_lcdsize.y-16, MMI_FOCUS_NO, str);		
+		g_item_update.time = 0;
+	}
+}
+
+/******************************************************************************
+函数名称:	_page_set_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	设置类页面处理
+参数说明:	ifocus:当前聚焦点
+			icur_wnd:当前屏
+			icur_wnd_item:当前屏分配的实体数
+			ipage_item:当前页面
+			修改定值时,屏幕刷新后,名称不重复刷新,数字仅光标闪烁,以及设置引起的变化内容刷新
+返回值:  	成功返回0.
+修改记录:	
+*/
+void _page_set_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item)
+{
+	int index=0, i=0;
+	static int flag=0;
+	int x=0,y=0;
+	int  title_len = STR_LEN_MENU;
+	char title_str[20]={0};
+	char page_num_str[10]={0};
+
+	// 当前屏首个实体在页面中的实体序号
+	if (icur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * icur_wnd;
+	}
+
+		// 打印标题
+	if (g_page_cur.title && g_item_update.title&&g_page_cur.menu_cur != MENU_PASSWORD)
+	{
+	    // pname = menu_base_table[g_page_cur.menu_cur].name;
+		if(g_page_cur.menu_cur == MENU_GLBH || g_page_cur.menu_cur == MENU_LXBH
+		|| g_page_cur.menu_cur == MENU_JDBH|| g_page_cur.menu_cur == MENU_RECLOSE
+		|| g_page_cur.menu_cur == MENU_BH_STATUS|| g_page_cur.menu_cur == MENU_DLYX
+		|| g_page_cur.menu_cur == MENU_HJS)
+		{
+			strncpy(title_str,menu_base_table[MENU_FIX_SW1 + class_GLBH.sw_idx].name,20);
+		}
+		else
+		{
+			strncpy(title_str,menu_base_table[g_page_cur.menu_cur].name,20);
+		}
+	    title_len = strlen(title_str);
+		//页码
+		sprintf(page_num_str,"<%02d/%02d>",g_page_cur.cur_wnd+1,g_page_cur.wnd_num);
+		// strncat(title_str,page_num_str,(20 - title_len));
+		title_len = strlen(title_str);
+		// 坐标
+		x = (g_lcdsize.x - title_len *8) / 2;
+
+		// 打印
+		// if(pname != (char *)0)
+		if(title_len != 0)
+		    fmt_Printf(x, 0, MMI_FOCUS_NO, title_str);
+
+		title_len = strlen(page_num_str);
+		x = (g_lcdsize.x - title_len *8) / 2;
+		if(title_len != 0)
+			fmt_Printf(x, g_lcdsize.y-16, MMI_FOCUS_NO, page_num_str);
+
+		g_item_update.title = 0;
+	}
+
+	for (i=0; i<icur_wnd_item; i++)
+	{
+		// 打印名称
+		if (g_item_update.name[i])
+		{
+			if (g_page_cur.menu_cur == MENU_PASSWORD)
+			{
+				x = (g_lcdsize.x - (STR_LEN_MENU*16)) / 2;
+				y = (g_lcdsize.y - 2*16) / 2;
+			}
+			else
+			{
+				x = 0;
+				y = ipage_item[index+i].y;
+			}
+			fmt_Printf(x, y, MMI_FOCUS_NO, g_set_dis[i].str[SET_NAME]);
+			g_item_update.name[i] = 0;
+		}
+
+		// 打印数据
+		if (g_item_update.data[i])
+		{
+			if (i == g_page_cur.cur_focus)
+			{
+				flag = MMI_FOCUS_NORMAL;
+			}
+			else
+			{
+				flag = MMI_FOCUS_NO;
+			}
+
+			if (g_page_cur.menu_cur == MENU_PASSWORD)
+			{
+				// x = (g_lcdsize.x - 4*8) / 2;
+				x = (g_lcdsize.x - 6*8) / 2;			// 密码使用6位
+				y = (g_lcdsize.y - 2*16) / 2 + 16;
+			}
+			else if (g_set_dis[i].spcl_type == DISP_IP)
+			{
+				x = 2*8;
+				y = ipage_item[index+i].y+16;
+			}
+			else
+			{
+				x = 6*8;
+				y = ipage_item[index+i].y+16;
+			}
+
+			fmt_StrPrintf ( x, 
+							y, 
+							g_set_dis[i].lenth, 
+							flag, 
+							g_set_dis[i].str[SET_DATA]);
+
+			fmt_StrPrintf ( x+g_set_dis[i].lenth*8, 
+							y, 
+							g_set_dis[i].len, 
+							MMI_FOCUS_NO, 
+							g_set_dis[i].str[SET_UNIT]);
+			g_item_update.data[i] = 0;			
+		}
+
+		// 闪烁定时器
+		if(dTCounter-g_item_update.flash_dly > T_500ms)
+		{
+			if (i == ifocus)
+			{
+				if (flag==MMI_FOCUS_NO)
+				{
+					flag = MMI_FOCUS_NORMAL;
+				}
+				else
+				{
+					flag = MMI_FOCUS_NO;
+				}
+				g_item_update.flash[i] = 1;
+				g_item_update.flash_dly = dTCounter;
+			}
+		}
+
+		// 设置项闪烁
+		if (g_item_update.flash[i])
+		{
+			if (g_set_dis[i].modify)
+			{
+				if (g_page_cur.menu_cur == MENU_PASSWORD)
+				{
+					// x = (g_lcdsize.x - 4*8) / 2;
+					x = (g_lcdsize.x - 6*8) / 2;			// 密码使用6位
+					y = (g_lcdsize.y - 2*16) / 2 + 16;
+				}
+				else if (g_set_dis[i].spcl_type == DISP_IP)
+				{
+					x = g_set_dis[i].x+2*8;
+					y = ipage_item[index+i].y+16;
+				}
+				else
+				{
+					x = g_set_dis[i].x+6*8;
+					y = ipage_item[index+i].y+16;
+				}
+				_set_cursor_flash(i, x, y, flag);
+			}
+			g_item_update.flash[i] = 0;			
+		}
+	}
+}
+
+/******************************************************************************
+函数名称:	_page_query_line_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	查询类页面处理
+参数说明:	ifocus:当前聚焦点
+			icur_wnd:当前屏
+			icur_wnd_item:当前屏分配的实体数
+			ipage_item:当前页面
+返回值:  	成功返回0.
+修改记录:	
+*/
+void _page_query_line_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item)
+{
+	int index=0, i=0;
+	char strname[20]={0};
+	char strdata[20]={0};
+	int x=0;
+	// char *pname = NULL;
+	int  title_len = STR_LEN_MENU;
+	char title_str[20]={0};
+	char page_num_str[10]={0};
+	bool ban_display = false;
+
+	// 当前屏首个实体在页面中的实体序号
+	if (icur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * icur_wnd;
+		
+	}
+
+	// 打印标题
+	if (g_page_cur.title && g_item_update.title)
+	{
+	    // pname = menu_base_table[g_page_cur.menu_cur].name;
+		strncpy(title_str,menu_base_table[g_page_cur.menu_cur].name,20);
+	    title_len = strlen(title_str);
+		//页码
+		sprintf(page_num_str,"<%02d/%02d>",g_page_cur.cur_wnd+1,g_page_cur.wnd_num);
+		strncat(title_str,page_num_str,(20 - title_len));
+		title_len = strlen(title_str);
+		// 坐标
+		x = (g_lcdsize.x - title_len *8) / 2;
+
+		// 打印
+		// if(pname != (char *)0)
+		if(title_len != 0)
+		    fmt_Printf(x, 0, MMI_FOCUS_NO, title_str);
+
+		if(g_page_cur.menu_cur == MENU_CHZ_FLAG)
+		{
+			sprintf(title_str,"●:充电完成○:未充电");
+			fmt_Printf(0, g_lcdsize.y-16, MMI_FOCUS_NO, title_str);
+		}
+
+		g_item_update.title = 0;
+	}
+
+	// 打印实体
+	for (i=0; i<icur_wnd_item; i++)
+	{
+		ban_display = false;
+		switch(ipage_item[i+index].type)
+		{			
+			case QUERY_PUB_KR:
+			case QUERY_SW_KR:
+			{
+				struct equ_config_di *ecd = NULL;
+
+				if(ipage_item[i+index].type == QUERY_PUB_KR)
+				{
+					ecd = &g_equ_config_di[g_cfg_index.pub_di[i + index]];
+				}
+				else
+				{
+					ecd = &g_equ_config_di[g_cfg_index.sw_di[i + index]];
+				}
+
+				// 开入的更新时间
+				if(dTCounter-g_item_update.kr_dly[i] > T_500ms)
+				{	
+					g_item_update.data[i] = 1;
+					g_item_update.kr_dly[i] = dTCounter;
+				}
+				if(dTCounter-g_item_update.name_dly[i] > (T_1s*10))
+				{	
+					g_item_update.name[i] = 1;
+					g_item_update.name_dly[i] = dTCounter;
+				}
+				if (g_item_update.name[i])
+				{
+					// 获取开入名称
+					strcpy(strname, ecd->name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取开入状态
+					if(dido_di_is_on(ecd->slot,ecd->index))
+					{
+						strcpy(strdata,"合");
+					}
+					else
+					{
+						strcpy(strdata,"分");
+					}	
+
+					// 数据的坐标
+					x = g_lcdsize.x-16;
+				}
+			}
+			break;
+
+			case QUERY_PUB_AC:
+			case QUERY_SW_AC:
+			{
+				char strtmp[12]={0};
+				int no;
+				int len = 0;
+
+				no = i+index;				
+
+				// 开入的更新时间
+				if(dTCounter-g_item_update.ac_dly[i] > T_500ms)
+				{	
+					g_item_update.data[i] = 1;
+					g_item_update.ac_dly[i] = dTCounter;
+				}
+				if(dTCounter-g_item_update.name_dly[i] > (T_1s*10))
+				{	
+					g_item_update.name[i] = 1;
+					g_item_update.name_dly[i] = dTCounter;
+				}
+				
+				if (ipage_item[i+index].type == QUERY_PUB_AC)
+				{
+					if (g_item_update.name[i])
+					{
+						// 获取测量名称
+						strcpy(strname, g_pub_ac_desc[disp_pub_ac_index[no][1]].name);
+					}
+					if (g_item_update.data[i])
+					{
+						// 获取测量数值
+						FreshMeaPub(lMeaVal,lMeaAng,lMeaCal);
+						FUC_Get_LongValue_String(lMeaVal[disp_pub_ac_index[no][1]],strtmp);						
+						sprintf(strdata,"%-6.6s%s",strtmp,g_unit[g_pub_ac_desc[disp_pub_ac_index[no][1]].unit].name);  //幅值
+					}
+				}
+				else
+				{
+					if (g_item_update.name[i])
+					{
+						// 获取测量名称
+						#if SWITCH_NUM_MAX != 1
+						{
+							sprintf(strname,"开关%d ",disp_sw_ac_index[no][0]);
+							len = strlen(strname);
+						}
+						#endif
+						
+						strcpy(&strname[len], g_sw_ac_desc[disp_sw_ac_index[no][1]].name);
+					}
+					if (g_item_update.data[i])
+					{
+						// 获取测量数值
+						FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,disp_sw_ac_index[no][0]);
+						FUC_Get_LongValue_String(lMeaVal[disp_sw_ac_index[no][1]],strtmp);
+						sprintf(strdata,"%-6.6s%s",strtmp,g_unit[g_sw_ac_desc[disp_sw_ac_index[no][1]].unit].name);  //幅值
+					}
+				}
+
+				// 数据的坐标
+				x = g_lcdsize.x-9*8;
+			}
+			break;
+
+			case QUERY_VER:
+			{
+				u32 ver;
+				if (g_item_update.name[i])
+				{
+					// 获取版本名称
+					strcpy(strname, item_base_table[ipage_item[i+index].no].name);
+				}
+				if (g_item_update.data[i])
+				{
+					// 获取版本内容
+					if (ipage_item[i+index].no == ITEM_VER)
+					{
+						ver = *(u32 *)(item_base_table[ipage_item[i+index].no].fstdata);
+						//sprintf (strdata,"%01X.%02X.%02x", (BYTE)(ver>>16),(BYTE)(ver>>8),(BYTE)(ver>>0));
+						sprintf(strdata, "SV%02d.%03d",(VER_NUM>>16)&0XFF,VER_NUM&0XFFF);
+					}
+					if (ipage_item[i+index].no == ITEM_CRC)
+					{
+						sprintf (strdata,"%04X", *(u16 *)(item_base_table[ipage_item[i+index].no].fstdata));
+						strcat(strdata, SetUints[item_base_table[ipage_item[i+index].no].unit]);
+					}
+				}
+				// 数据的坐标
+				x = g_lcdsize.x - 8*8;
+			}
+			break;
+
+			case QUERY_CFG:
+			{
+				if (g_item_update.name[i])
+				{
+					// 获取版本名称
+					strcpy(strname, item_base_table[ipage_item[i+index].no].name);
+				}
+				
+				if (g_item_update.data[i])
+				{
+					// 获取版本内容
+					sprintf (strdata,"%04X", *(u16 *)(item_base_table[ipage_item[i+index].no].fstdata));
+					strcat(strdata, SetUints[item_base_table[ipage_item[i+index].no].unit]);			
+				}
+				// 数据的坐标
+				x = g_lcdsize.x - 5*8;
+			}
+			break;
+
+			case QUERY_FLAG:
+			{
+				if (g_item_update.name[i])
+				{
+					// 获取版本名称
+					strcpy(strname, item_base_table[ipage_item[i+index].no].name);
+				}
+				
+				// 标志更新时间
+				if(dTCounter-g_item_update.kr_dly[i] > T_500ms)
+				{	
+					g_item_update.data[i] = 1;
+					g_item_update.kr_dly[i] = dTCounter;
+				}
+
+				if (g_item_update.data[i])
+				{
+					// 获取标志状态
+					if(*(u32 *)item_base_table[ipage_item[i+index].no].fstdata)
+					{
+						strcpy(strdata,"●");
+					}
+					else
+					{
+						strcpy(strdata,"○");
+					}	
+					// 数据的坐标
+					x = g_lcdsize.x-16;
+				}
+			}
+			break;
+
+			case QUERY_CHZ_FLAG:
+				if (g_item_update.name[i])
+				{
+					// 获取版本名称
+					sprintf(strname,"开关%d重合闸充电",(i+index+1));
+				}
+				
+				// 标志更新时间
+				if(dTCounter-g_item_update.kr_dly[i] > T_500ms)
+				{	
+					g_item_update.data[i] = 1;
+					g_item_update.kr_dly[i] = dTCounter;
+				}
+
+				if (g_item_update.data[i])
+				{
+					// 获取标志状态
+					if((g_disp_flag.chz_cd>>(i+index))&0x01)
+					{
+						strcpy(strdata,"●");
+					}
+					else
+					{
+						strcpy(strdata,"○");
+					}	
+					// 数据的坐标
+					x = g_lcdsize.x-16;
+				}
+			break;
+
+			default:
+			ban_display = true;
+			break;
+
+		}
+		
+		if(!ban_display)
+		{
+			// 打印实体名称
+			if (g_item_update.name[i])
+			{
+				fmt_Printf(ipage_item[index+i].x, ipage_item[index+i].y, MMI_FOCUS_NO, strname);
+				g_item_update.name[i] = 0;
+			}
+
+			// 打印实体数据
+			if (g_item_update.data[i])
+			{
+				fmt_Printf(x, ipage_item[index+i].y, MMI_FOCUS_NO, strdata);
+				g_item_update.data[i] = 0;
+			}
+		}
+	}
+	
+}
+
+/******************************************************************************
+函数版本:   01.01
+创建作者:   康文广
+创建日期:   2021-6-15
+函数说明:   根据给定长度截断字符串
+参数说明:   pin_str:截断前的字符串
+             pout_str:截断后的字符串 (含结束符)
+             cutoff_len: 截断长度
+返回值:     返回截断后的字符串长度
+修改记录:
+*/
+static u8 _menu_cutoff_string(char *pin_str, char *pout_str, u8 cutoff_len)
+{
+    u8  i=0;
+    u8  cnt=0;
+
+    i=0;
+    while((i < cutoff_len) && (pin_str[i] !=0)) {
+        if((u8)pin_str[i] > 0x80) {
+            if(i+2 <= cutoff_len){
+                pout_str[cnt++] = pin_str[i];
+                pout_str[cnt++] = pin_str[i+1];
+                i += 2;
+            }else{  //half
+                break;
+            }
+        }else{
+            pout_str[cnt++] = pin_str[i];
+            i++;
+        }
+    }
+    pout_str[cnt] = 0;
+
+    return  cnt;
+}
+
+static int _menu_info_table_init(int tbl_i,u8 menu_no, u8 wnd_no)
+{
+	u8   idx=0;
+    // u8   item_line=2;
+    // u8   len=0;
+    u8   cutoff_len;
+    u8   val;
+	u32  obj_num = 0;
+    char buf[64] ={0};
+	char strtmp[128]={0};
+
+	if (menu_no==QUERY_YX)
+	{
+		obj_num = g_table_head->di_num;
+	}
+	else if (menu_no==QUERY_YC)
+	{
+		obj_num = g_table_head->ac_num;
+	}
+
+    while(idx <= MAX_LINE_PER_PAGE) {
+        if((tbl_i >=0) && (tbl_i < obj_num)) {
+            //prejudge
+			if (menu_no==QUERY_YX)
+			{
+				tbl_getname(RES_TYPE_YX, tbl_i, buf);
+			}
+			else if (menu_no==QUERY_YC)
+			{
+				tbl_getname(RES_TYPE_YC, tbl_i, buf);
+			}
+           
+		   #if 0
+            len = strlen(buf);
+            if(len >= 18)
+                item_line = 3;  //need 3 lines space
+            else
+                item_line = 2;  //need 2 lines space
+
+            if(idx + item_line > MAX_LINE_PER_PAGE){
+                break;
+            }
+			#endif
+
+            //cp and value
+			if (menu_no==QUERY_YX)
+			{
+				val = tbl_get_yx(tbl_i, tRunPara.bDPI);
+				sprintf(g_page_dis.str[idx], "YX[%04X]:     值: %d", g_di_table[tbl_i].cp, val);
+				idx++;
+			}
+			else if (menu_no==QUERY_YC)
+			{
+				float rate,fval;
+				long lmeaval;
+				BYTE no=g_ac_table[tbl_i].indexno;	
+				if (no>0)
+				{
+					no -= 1;
+					rate=(float)g_ac_table[tbl_i].rate/65536.0;
+					lmeaval=GetRmtMeaVal(g_ac_table[tbl_i].owner,no,NULL);
+					fval=((float)lmeaval)/65536.0*rate; //转为浮点数
+				}
+				else
+				{
+					lmeaval = 0;
+					fval=0;
+				}
+				if (fval > 9999999999.00)
+				{
+					sprintf(strtmp,"------");
+				}
+				else
+				{
+					sprintf(strtmp,"%.2f", fval);
+				}
+				
+				sprintf(g_page_dis.str[idx], "[%04X]%-13.13s", g_ac_table[tbl_i].cp, strtmp);
+				idx++;
+			}
+			
+            //name
+            cutoff_len = _menu_cutoff_string(buf, g_page_dis.str[idx], 18);
+            g_page_dis.str[idx][cutoff_len] = 0;
+            idx++;
+			
+			#if 0
+            if(len >= max_line_char) {
+                cutoff_len = _menu_cutoff_string(buf+cutoff_len, (char *)g_page_dis.str[idx], max_line_char);
+                g_page_dis.str[idx][cutoff_len] = 0;
+                idx++;
+            }
+			#endif
+            tbl_i++;
+
+        }else{
+            tbl_i = 0;
+            break;
+        }
+    }
+
+    g_page_cur.item_num = obj_num *2;  //最大2倍, 不再动态调整当前屏号 
+    g_page_cur.wnd_item = MAX_LINE_PER_PAGE;
+	// 页面分配的总屏数
+	if (g_page_cur.item_num <= g_page_cur.wnd_item)
+	{
+		g_page_cur.wnd_num = 1;
+	}
+	else
+	{
+		g_page_cur.wnd_num = g_page_cur.item_num / g_page_cur.wnd_item;
+		if (g_page_cur.item_num % g_page_cur.wnd_item != 0)
+		{
+			g_page_cur.wnd_num++;
+		}
+	}
+	// 获取当前屏分配的实体数
+	check_cur_wnd_item();
+    g_page_cur.cur_wnd_item = idx;   //当前屏分配的实体数
+
+	return 0;
+}
+
+/******************************************************************************
+函数名称:	_page_query_page_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	查询类页面处理
+参数说明:	ifocus:当前聚焦点
+			icur_wnd:当前屏
+			icur_wnd_item:当前屏分配的实体数
+			ipage_item:当前页面
+返回值:  	成功返回0.
+修改记录:	
+*/
+void _page_query_page_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item)
+{
+	int index=0, i=0;
+	int x=0, y=0;
+	char str1[18]={0}, str2[18]={0};
+
+	// 当前屏首个实体在页面中的实体序号
+	if (icur_wnd > 0)
+	{
+		if (ipage_item[i].type == QUERY_YX || ipage_item[i].type == QUERY_YC)
+		{
+			index = (g_page_cur.wnd_item/2) * icur_wnd;
+		}
+		else
+		{
+			index = g_page_cur.wnd_item * icur_wnd;
+		}
+	}
+
+	// 打印实体
+	switch(ipage_item[i].type)
+	{			
+		case QUERY_TIME:
+		{
+			if(dTCounter-g_item_update.time_dly > T_100ms)
+			{	
+				g_item_update.time = 1;
+				g_item_update.time_dly = dTCounter;
+			}
+			if (g_item_update.time)
+			{
+				_rtc_printf(PAGE_MD, str1, str2);
+
+				x = (g_lcdsize.x - (strlen(str1)*8)) / 2;
+				y = (g_lcdsize.y - 2*16) / 2;	
+				fmt_Printf(x, y, MMI_FOCUS_NO, str1);
+
+				x = (g_lcdsize.x - (strlen(str2)*8)) / 2;
+				y += 16;	
+				fmt_Printf(x, y, MMI_FOCUS_NO, str2);
+				
+				g_item_update.time = 0;
+			}
+		}
+		break;
+
+		case QUERY_SJSOE:
+		case QUERY_CZSOE:
+		case QUERY_ERR:
+		case QUERY_DEBUG:
+		case QUERY_GPRS:
+		case QUERY_PASSERR:
+		case QUERY_SAVERESULT:
+		case QUERY_EVENT:
+		case QUERY_RMTPAIR:
+		case QUERY_DELPAIR:
+		case QUERY_ADJUSTRESULT:
+		{
+			// 获取打印内容
+			// 打印实体
+			x = 0;
+			y = 0;
+
+			if (ipage_item[i].type == QUERY_PASSERR)
+			{
+				x = (g_lcdsize.x - 16*8) / 2;
+				y = (g_lcdsize.y - 2*16) / 2;
+			}
+			else if (ipage_item[i].type == QUERY_SAVERESULT)
+			{
+				x = (g_lcdsize.x - 4*16)/2;
+				y = (g_lcdsize.y - 1*16)/2;
+			}
+			else if ((ipage_item[i].type == QUERY_RMTPAIR)
+					|| (ipage_item[i].type == QUERY_DELPAIR))
+			{
+				y = (g_lcdsize.y - 2*16)/2;
+			}	
+			else if(ipage_item[i].type == QUERY_ADJUSTRESULT)//xj 2015.5.11
+			{
+				x = (g_lcdsize.x - 8*strlen(g_page_dis.str[0]))/2;
+				y = g_lcdsize.y/2;
+			}		
+			
+			for (i=0; i<icur_wnd_item; i++)
+			{
+				if (g_item_update.name[i])
+				{
+					fmt_Printf(x, y, MMI_FOCUS_NO, g_page_dis.str[index+i]);  //如果index>=16 会越界
+					y += 16;
+					g_item_update.name[i] = 0;
+				}
+			}
+		}
+		break;
+
+		case QUERY_EQU:
+		case QUERY_COMM_PARA:
+            for (i=0; i<icur_wnd_item; i++)
+            {
+                if (g_item_update.name[i])
+                {
+                    fmt_Printf(x, y, MMI_FOCUS_NO, g_page_dis.str[i]);
+                    y += 16;
+                    g_item_update.name[i] = 0;
+                }
+            }
+		break;
+		case QUERY_YX:
+		{
+			int ret = -1;
+			ret = _menu_info_table_init(index,QUERY_YX, icur_wnd);
+			if (ret == 0)
+			{
+				for (i=0; i<icur_wnd_item; i++)
+				{
+					int mx=0, my=0,nx=0, ny=0;
+					// 标志更新时间
+					if(dTCounter-g_item_update.zf_dly[i] > T_1s)
+					{	
+						g_item_update.data[i] = 1;
+						g_item_update.zf_dly[i] = dTCounter;
+					}
+					if(dTCounter-g_item_update.name_dly[i] > (T_1s*10))
+					{	
+						g_item_update.name[i] = 1;
+						g_item_update.name_dly[i] = dTCounter;
+					}
+
+					if (g_item_update.name[i])
+					{
+						ny += 16*i;
+						fmt_Printf(nx, ny, MMI_FOCUS_NO, g_page_dis.str[i]);
+						g_item_update.name[i] = 0;
+					}
+
+					if (g_item_update.data[i])
+					{
+						if (i%2==0)
+						{
+							my += 16*i;
+							fmt_Printf(mx, my, MMI_FOCUS_NO, g_page_dis.str[i]);
+						}
+						g_item_update.data[i] = 0;
+					}
+				}
+			}
+		}
+		break;
+		case QUERY_YC:
+		{
+			int ret = -1;
+			ret = _menu_info_table_init(index,QUERY_YC, icur_wnd);
+			if (ret == 0)
+			{
+				for (i=0; i<icur_wnd_item; i++)
+				{
+					int mx=0, my=0,nx=0, ny=0;
+					// 标志更新时间
+					if(dTCounter-g_item_update.zf_dly[i] > T_1s)
+					{	
+						g_item_update.data[i] = 1;
+						g_item_update.zf_dly[i] = dTCounter;
+					}
+					if(dTCounter-g_item_update.name_dly[i] > (T_1s*10))
+					{	
+						g_item_update.name[i] = 1;
+						g_item_update.name_dly[i] = dTCounter;
+					}
+
+					if (g_item_update.name[i])
+					{
+						ny += 16*i;
+						fmt_Printf(nx, ny, MMI_FOCUS_NO, g_page_dis.str[i]);
+						g_item_update.name[i] = 0;
+					}
+
+					if (g_item_update.data[i])
+					{
+						if (i%2==0)
+						{
+							my += 16*i;
+							fmt_Printf(mx, my, MMI_FOCUS_NO, g_page_dis.str[i]);
+						}
+						g_item_update.data[i] = 0;
+					}
+				}
+			}
+		}
+		break;
+	}
+	
+}
+
+/******************************************************************************
+函数名称:	_page_action_disp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	动作类页面处理
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+void _page_action_disp(u8 ifocus, u8 icur_wnd, u8 icur_wnd_item, struct item *ipage_item)
+{
+	int index=0, i=0, flag=0, isel=0;
+	int x=0, y=0;
+	char strname[20]={0};
+	char strdata[20]={0};
+
+	// 当前屏首个实体在页面中的实体序号
+	if (icur_wnd > 0)
+	{
+		index = g_page_cur.wnd_item * icur_wnd;
+	}
+
+	// 打印标题
+	if (g_page_cur.title && g_item_update.title)
+	{
+		// 坐标
+		if (g_page_cur.menu_cur == MENU_SAVE)
+		{
+			x = (g_lcdsize.x - 32) / 2;
+			y = (g_lcdsize.y - 2*16) / 2;
+			isel = ITEM_SAVE;
+		}
+		else if (g_page_cur.menu_cur == MENU_ADJUST_AC)
+		{
+			x = (g_lcdsize.x - 8*12) / 2;
+			y = (g_lcdsize.y - 2*16) / 2;
+			isel = ITEM_ADJUST_AC;
+		}
+		else
+		{
+			x = (g_lcdsize.x - 32) / 2;
+			y = 0;
+		}		
+		// 打印
+		fmt_Printf(x, y, MMI_FOCUS_NO, item_base_table[isel].name);	
+
+
+		g_item_update.title = 0;
+	}
+	
+	// 打印菜单
+	for (i=0; i<icur_wnd_item; i++)
+	{
+		switch(ipage_item[index+i].type)
+		{
+			case ACTION_SAVE:
+			{
+				x = ipage_item[index+i].x + 8;		// 针对160*160液晶做出调整
+				y = (g_lcdsize.y - 2*16) / 2;
+				strcpy(strdata, item_base_table[ipage_item[index+i].no].name);
+				g_item_update.name[i] = 0;
+			}
+			break;
+
+			case ACTION_TEST_KC:
+			{
+				struct equ_config_do *ecd = &g_equ_config_do[g_cfg_index.kc[index + i][0]];
+
+				if (g_item_update.name[i])
+				{
+					// 获取开出名称
+					strcpy(strname, ecd->name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取开出状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"动作");
+					}
+					else
+					{
+						strcpy(strdata,"返回");
+					}
+					// 数据的坐标
+					x = g_lcdsize.x-32;
+				}
+			}
+			break;
+
+			case ACTION_BAT:
+			{
+				struct equ_config_do *ecd = &g_equ_config_do[g_cfg_index.kc[index + i + PUB_DO_DCHH][0]];
+
+				if (g_item_update.name[i])
+				{
+					// 获取开出名称
+					strcpy(strname, ecd->name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取开出状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"动作");
+					}
+					else
+					{
+						strcpy(strdata,"返回");
+					}
+					// 数据的坐标
+					x = g_lcdsize.x-32;
+				}
+			}
+			break;
+			
+			case ACTION_CLR_SOE:
+			case ACTION_TEST_LCD:
+			case ACTION_TEST_LED:
+			{
+				if (g_item_update.name[i])
+				{
+					// 获取名称
+					strcpy(strname, item_base_table[ipage_item[index+i].no].name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"动作");
+					}
+					else
+					{
+						strcpy(strdata,"返回");
+					}
+					// 数据的坐标
+					x = g_lcdsize.x-32;
+				}
+			}
+			break;
+
+			case ACTION_ADJUST_AC:
+			{
+				y = (g_lcdsize.y - 2*16) / 2;
+				g_item_update.name[i] = 0;
+
+				if (g_item_update.data[i])
+				{				
+					// 获取状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"校准");
+					}
+					else if (g_action.action[i] == 1)
+					{
+						strcpy(strdata,"成功");
+					}
+					else if (g_action.action[i] == 2)
+					{
+						strcpy(strdata,"失败");
+					}
+					// 数据的坐标
+					x = (g_lcdsize.x - 16*2) / 2;
+				}
+			}
+			break;
+
+			case ACTION_ADJUST_DC10:
+			case ACTION_ADJUST_DC50:
+			{
+				if (g_item_update.name[i])
+				{
+					// 获取名称
+					strcpy(strname, item_base_table[ipage_item[index+i].no].name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"校准");
+					}
+					else if (g_action.action[i] == 1)
+					{
+						strcpy(strdata,"成功");
+					}
+					else if (g_action.action[i] == 2)
+					{
+						strcpy(strdata,"失败");
+					}
+					// 数据的坐标
+					x = g_lcdsize.x-32;
+				}
+			}
+			break;
+			
+			case ACTION_RMT_PAIR:
+			case ACTION_DEL_PAIR:
+			{
+				if (g_item_update.name[i])
+				{
+					// 获取名称
+					strcpy(strname, item_base_table[ipage_item[index+i].no].name);
+				}
+				if (g_item_update.data[i])
+				{				
+					// 获取状态
+					if (g_action.action[i] == 0)
+					{
+						strcpy(strdata,"启动");
+					}
+					else
+					{
+						strcpy(strdata,"返回");
+					}
+					// 数据的坐标
+					x = g_lcdsize.x-32;
+				}
+			}
+			break;
+
+		}
+		// 根据聚焦区分正显和反显
+		if (i == ifocus)
+		{
+			flag = MMI_FOCUS_NORMAL;
+		}
+		else
+		{
+			flag = MMI_FOCUS_NO;
+		}
+		// 打印实体名称
+		if (g_item_update.name[i])
+		{
+			fmt_Printf(ipage_item[index+i].x, ipage_item[index+i].y, MMI_FOCUS_NO, strname);
+			g_item_update.name[i] = 0;
+		}
+
+		// 打印实体数据
+		if (g_item_update.data[i])
+		{
+			fmt_Printf(x, ipage_item[index+i].y+y, flag, strdata);
+			g_item_update.data[i] = 0;
+		}
+	}
+}
+
+/******************************************************************************
+函数名称:	_wnd_item_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	页面及实体初始化
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _wnd_item_init(struct page_st *ipage, struct lcdsize *isize, u8 lcd, u8 menutype,u8 menu_num)
+{
+	int i=0,loop=0;
+	int occupy_line=0; 	// 被占用的行,以字符行为单位,16点
+	int write_line=0;		// 剩下可写的行,以液晶行为单位,8点
+	int item_line=0;		// 需要写的总行数,以字符行为单位,16点
+	int interval_line=0;	// 间隔总行数,以液晶行为单位,8点
+	struct lcdsize strart_coord={0};	// 起始坐标,以液晶行为单位,8点
+ 	struct lcdsize interval={0};		// 实体间的间隔,以液晶行为单位,8点
+ 	int  menu_char_num = STR_LEN_MENU;
+	
+	switch(menutype)
+	{
+		case MENU_TYPE:
+		case MENU_TYPE_CH8:
+		    if(menutype == MENU_TYPE_CH8)
+		        menu_char_num = STR_LEN_MENU*2;
+
+			switch(lcd)
+			{
+				case SMALL:
+					ipage->title = 0;
+					ipage->time = 0;
+					occupy_line = 0;
+				break;
+
+				case MID:
+					ipage->title = 1;
+					ipage->time = 0;
+					occupy_line = 2;
+				break;
+
+				case BIG:
+					ipage->title = 1;
+					ipage->time = 1;
+					occupy_line = 4;
+				break;
+			}
+			// 以行为显示,每行显示2个实体,有行间隔
+			
+			// 一屏可写的行数
+			write_line = isize->y/8 - occupy_line;
+
+			// 实体需占用的总行数,一行可显示2个菜单
+			item_line = ipage->item_num/2;
+			if (ipage->item_num % 2 != 0)
+			{
+				item_line++;
+			}
+
+			// 计算起始y坐标和行间隔
+			if (item_line > write_line/2)
+			{
+				interval.y = 0;
+				strart_coord.y = interval.y + ipage->title*2;	
+				interval_line = 0;
+			}
+			else
+			{	
+				if ((write_line - item_line*2) > (item_line*2))
+				{
+					interval.y = (write_line-item_line*2) / (item_line*2+1);
+					strart_coord.y = interval.y + ipage->title*2;
+					interval_line = item_line*2+1;
+				}
+				else if ((write_line - item_line*2) == (item_line*2))
+				{
+					interval.y = 2;
+					strart_coord.y = interval.y + ipage->title*2 - 1;
+					interval_line = item_line*2;				
+				}
+				else
+				{
+					interval.y = 0;
+					strart_coord.y = interval.y + ipage->title*2;
+					interval_line = write_line - item_line*2;
+				}
+			}
+
+			// 计算起始x坐标和列间隔
+			interval.x = (isize->x - (menu_char_num*8*LINE_MENU)) / 3;
+			strart_coord.x = interval.x - 1;
+			
+			// 每屏可容纳的最多实体数
+			ipage->wnd_item = (write_line/2 - interval_line/2) * 2;
+
+			// 页面分配的总屏数
+			if (ipage->item_num <= ipage->wnd_item)
+			{
+				ipage->wnd_num = 1;
+			}
+			else
+			{
+				ipage->wnd_num = ipage->item_num / ipage->wnd_item;
+				if (ipage->item_num % ipage->wnd_item != 0)
+				{
+					ipage->wnd_num++;
+				}
+			}
+
+			// 实体坐标赋值
+			for(i=0; i<ipage->item_num; i+=ipage->wnd_item)
+			{				
+				// 当切换屏时,重新从起始坐标开始
+				for (loop=0; loop<ipage->wnd_item; loop+=2)
+				{
+					if ((i+loop) < ipage->item_num)
+					{
+						ipage->page_item[i+loop].x = strart_coord.x;
+						ipage->page_item[i+loop].y = strart_coord.y*8 + loop/2*16 + loop/2*interval.y*8;
+					}
+					if ((i+loop+1) < ipage->item_num)
+					{
+						ipage->page_item[i+loop+1].x = interval.x*2 + menu_char_num*8 - 1;
+						ipage->page_item[i+loop+1].y = ipage->page_item[i+loop].y;
+					}
+				}
+			}
+		break;
+
+		case SET_TYPE:
+			// 以2行为显示,每2行显示1个实体,无行间隔
+
+			switch(lcd)
+			{
+				case SMALL:
+					ipage->title = 0;
+					ipage->time = 0;
+					occupy_line = 0;
+				break;
+
+				case MID:
+				case BIG:
+					ipage->title = 1;
+					ipage->time = 0;
+					occupy_line = 4;
+				break;
+			}
+
+			// 一屏可写的行数
+			write_line = isize->y/8 - occupy_line;
+
+			// 实体需占用的总行数
+			item_line = ipage->item_num * 2;
+
+			// 计算起始y坐标和行间隔
+			interval.y = 0;
+			strart_coord.y = ipage->title*2;;	
+			interval_line = 0;
+
+			// 计算起始x坐标和列间隔
+			interval.x = 0;
+			strart_coord.x = 0;
+			
+			// 每屏可容纳的最多实体数
+			ipage->wnd_item = ((write_line/2) / 2);
+
+			// 页面分配的总屏数
+			if (ipage->item_num <= ipage->wnd_item)
+			{
+				ipage->wnd_num = 1;
+			}
+			else
+			{
+				ipage->wnd_num = ipage->item_num / ipage->wnd_item;
+				if (ipage->item_num % ipage->wnd_item != 0)
+				{
+					ipage->wnd_num++;
+				}
+			}
+
+			// 实体坐标赋值
+			for(i=0; i<ipage->item_num; i+=ipage->wnd_item)
+			{				
+				// 当切换屏时,重新从起始坐标开始
+				for (loop=0; loop<ipage->wnd_item; loop++)
+				{
+					if ((i+loop) < ipage->item_num)
+					{
+						ipage->page_item[i+loop].x = strart_coord.x;
+						ipage->page_item[i+loop].y = strart_coord.y*8 + loop*SET_LINE*16;
+					}
+				}
+			}
+		break;
+
+		case QUERY_PAGE_TYPE:
+			// 一屏可写的行数
+			write_line = isize->y/8;
+			// 计算起始y坐标和行间隔
+			interval.y = 0;
+			strart_coord.y = 0;	
+			interval_line = 0;
+			// 计算起始x坐标和列间隔
+			interval.x = 0;
+			strart_coord.x = 0;
+			// 每屏可容纳的最多实体数
+			ipage->wnd_item = write_line/2;
+		break;
+
+		case QUERY_1LINE_TYPE:
+			switch(lcd)
+			{
+				case SMALL:
+					ipage->title = 0;
+					ipage->time = 0;
+					occupy_line = 0;
+				break;
+
+				case MID:
+				case BIG:
+					ipage->title = 1;
+					ipage->time = 0;
+					occupy_line = 2;
+					if(menu_num == MENU_CHZ_FLAG)
+					{	
+						//最底下一行用来显示注释,所以数据显示减少一行
+						occupy_line = 4;
+					}
+				break;
+			}
+		
+			// 一屏可写的行数
+			write_line = isize->y/8 - occupy_line;
+
+			// 实体需占用的总行数
+			item_line = ipage->item_num;
+
+			// 计算起始y坐标和行间隔
+			interval.y = 0;
+			strart_coord.y = ipage->title*2;
+			interval_line = 0;
+
+			// 计算起始x坐标和列间隔
+			interval.x = 0;
+			strart_coord.x = 0;
+			
+			// 每屏可容纳的最多实体数
+			ipage->wnd_item = write_line/2;
+
+			// 页面分配的总屏数
+			if (ipage->item_num <= ipage->wnd_item)
+			{
+				ipage->wnd_num = 1;
+			}
+			else
+			{
+				ipage->wnd_num = ipage->item_num / ipage->wnd_item;
+				if (ipage->item_num % ipage->wnd_item != 0)
+				{
+					ipage->wnd_num++;
+				}
+			}
+
+			// 实体坐标赋值
+			for(i=0; i<ipage->item_num; i+=ipage->wnd_item)
+			{				
+				// 当切换屏时,重新从起始坐标开始
+				for (loop=0; loop<ipage->wnd_item; loop++)
+				{
+					if ((i+loop) < ipage->item_num)
+					{
+						ipage->page_item[i+loop].x = strart_coord.x;
+						ipage->page_item[i+loop].y = strart_coord.y*8 + loop*16;
+					}
+				}
+			}
+		break;
+
+
+		case ACTION_TYPE:
+		{
+			u8 num=0;
+			// 一屏可写的行数
+			write_line = isize->y/8;
+
+			if(ipage->page_item[0].type == ACTION_SAVE)
+			{
+				ipage->title = 1;
+				// 实体需占用的总行数
+				item_line = ipage->item_num / 2;
+				interval.x = (isize->x - (STR_LEN_MENU*8*LINE_MENU)) / 3;
+				interval.y = 0;
+				strart_coord.x = interval.x - 1;
+				strart_coord.y = ipage->title*2;
+				num = 2;
+			}
+			else if(ipage->page_item[0].type == ACTION_ADJUST_AC)
+			{
+				ipage->title = 1;
+				// 实体需占用的总行数
+				item_line = ipage->item_num;
+				interval.x = 0;
+				interval.y = 0;
+				strart_coord.x = interval.x - 1;
+				strart_coord.y = ipage->title*2;
+				num = 1;
+			}
+			/*else if(ipage->page_item[0].type == ACTION_RMT_PAIR)
+			{
+				ipage->title = 1;
+				// 实体需占用的总行数
+				item_line = ipage->item_num;
+				interval.x = (isize->x - (16*4)) / 2;;
+				interval.y = 0;
+				strart_coord.x = interval.x - 1;
+				strart_coord.y = ipage->title*2;
+				num = 1;
+			}*/
+			else
+			{
+				// 无标题
+				ipage->title = 0;
+
+				// 实体需占用的总行数
+				item_line = ipage->item_num;
+
+				// 计算起始y坐标和行间隔
+				interval.y = 0;
+				strart_coord.y = 0;	
+				interval_line = 0;
+
+				// 计算起始x坐标和列间隔
+				interval.x = 0;
+				strart_coord.x = 0;
+
+				num = 1;
+			}
+
+			// 计算起始y坐标和行间隔
+			
+			interval_line = 0;
+			
+
+			// 计算起始x坐标和列间隔
+			
+			
+
+			// 每屏可容纳的最多实体数
+			ipage->wnd_item = write_line/2;
+
+			// 页面分配的总屏数
+			if (ipage->item_num <= ipage->wnd_item)
+			{
+				ipage->wnd_num = 1;
+			}
+			else
+			{
+				ipage->wnd_num = ipage->item_num / ipage->wnd_item;
+				if (ipage->item_num % ipage->wnd_item != 0)
+				{
+					ipage->wnd_num++;
+				}
+			}
+
+			// 实体坐标赋值
+			for(i=0; i<ipage->item_num; i+=ipage->wnd_item*num)
+			{				
+				// 当切换屏时,重新从起始坐标开始
+				for (loop=0; loop<ipage->wnd_item; loop+=num)
+				{
+					if ((i+loop) < ipage->item_num)
+					{
+						ipage->page_item[i+loop].x = strart_coord.x;
+						ipage->page_item[i+loop].y = strart_coord.y*8 + (loop/num)*16;
+					}
+					if (num == 2)
+					{
+						if ((i+loop+1) < ipage->item_num)
+						{
+							ipage->page_item[i+loop+1].x = interval.x*2 + STR_LEN_MENU*8 - 1;
+							ipage->page_item[i+loop+1].y = ipage->page_item[i+loop].y;
+						}
+					}
+				}
+			}
+		}
+		break;
+
+
+
+	}
+
+	return 0;
+}
+
+
+/******************************************************************************
+函数名称:	_rtc_printf
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	打印实时时钟
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _rtc_printf(u8 mode, char *str1, char *str2)
+{
+	char tmpstr[6]={0};
+	struct timespec ts={0};
+	struct rtc_time_t rtc={0};
+
+	clk_time_get(&ts);
+	timespec_to_rtc(ts,&rtc,1);
+	
+	sprintf(tmpstr, "20%02d-", rtc.year);
+	strcat(str1, tmpstr);
+	
+	sprintf(tmpstr, "%02d-", rtc.month);
+	strcat(str1, tmpstr);
+	
+	sprintf(tmpstr, "%02d", rtc.day);
+	strcat(str1, tmpstr);
+
+	switch (mode)
+	{
+		case LINE_MD:
+			sprintf(tmpstr, "  %02d:", rtc.hour);
+			strcat(str1, tmpstr);
+			
+			sprintf(tmpstr, "%02d:", rtc.min);
+			strcat(str1, tmpstr);
+			
+			sprintf(tmpstr, "%02d", rtc.ms/1000);
+			strcat(str1, tmpstr);
+		break;
+
+		case PAGE_MD:
+			sprintf(tmpstr, "%02d:", rtc.hour);
+			strcat(str2, tmpstr);
+			
+			sprintf(tmpstr, "%02d:", rtc.min);
+			strcat(str2, tmpstr);
+			
+			sprintf(tmpstr, "%02d", rtc.ms/1000);
+			strcat(str2, tmpstr);
+		break;
+	}	
+
+	return 0;
+}
+
+/**************************************************************************
+函数名称:	_set_cursor_flash
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	光标闪烁
+参数说明:	no: 当前屏内哪一项显示
+			y: 纵坐标,即第几行
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _set_cursor_flash(u8 no, u8 x, u8 y, u8 mode)
+{
+	u8 len;
+	char str[21];
+	
+	// 取出光标对应的数据位
+	if (g_set_dis[no].list)
+	{
+		len = g_set_dis[no].lenth;
+		memcpy(str, g_set_dis[no].str[SET_DATA], len);
+		str[len] = '\0';		
+	}
+	else
+	{
+		str[0] = g_set_dis[no].str[SET_DATA][g_set_dis[no].cursor];
+		str[1] = '\0';
+		len = 1;
+	}
+	fmt_StrPrintf(x + g_set_dis[no].cursor*8, y, len, mode, str);
+
+	return 0;
+}
+/******************************************************************************
+函数名称:	_equ_di_index_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	检索di的配置对应关系
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _equ_di_index_init(void)
+{
+	int i,sw;
+	int index=0;
+	u8 remainder = 0;
+
+	for(i=0;i<PUB_DI_NUM;i++)
+	{
+		if((short)g_sw_pub.di_cfg_index[i]!=INDEX_INVALLID)  //此遥信有配置
+		{				
+			g_cfg_index.pub_di[index] = g_sw_pub.di_cfg_index[i];
+			index++;
+		}
+	}
+
+	index = 0;
+	for(sw=0; sw<SWITCH_NUM_MAX; sw++)
+	{
+		for(i=0;i<SW_DI_NUM;i++)
+		{
+			if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID)  //此遥信有配置
+			{				
+				g_cfg_index.sw_di[index] = g_sw[sw].di_cfg_index[i];
+				index++;
+			}
+		}
+		//此处这样处理是为了当一个开关的开入显示完了之后不接着显示下一个开关的开入,而是零流留空白,等到换页之后才显示下一个开关的开入
+		if(index != 0)
+		{
+			//有配置才处理
+			remainder = (index % page_table[MENU_SW_YX].wnd_item);
+			if(remainder != 0)
+				index += (page_table[MENU_SW_YX].wnd_item - remainder);
+		}
+	}	
+
+	return 0; 
+}
+
+/******************************************************************************
+函数名称:	_equ_do_index_init
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	检索do的配置对应关系
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _equ_do_index_init(void)
+{
+	int i,sw;
+	int index=0;
+	
+	for(i=0;i<PUB_DO_NUM;i++)
+	{
+		if((short)g_sw_pub.do_cfg_index[i]!=INDEX_INVALLID)  //此开出有配置
+		{				
+			g_cfg_index.kc[index][0] = g_sw_pub.do_cfg_index[i];
+			g_cfg_index.kc[index][1] = i;
+			index++;
+		}
+	}
+
+	for(sw=0; sw<g_sw_num; sw++)
+	{
+		for(i=0;i<SW_DO_NUM;i++)
+		{
+			if((short)g_sw[sw].do_cfg_index[i]!=INDEX_INVALLID)  //此开出有配置
+			{				
+				g_cfg_index.kc[index][0] = g_sw[sw].do_cfg_index[i];
+				g_cfg_index.kc[index][1] = i;
+				index++;
+			}
+		}
+	}	
+
+	return 0; 
+}
+
+/******************************************************************************
+函数名称:	_lcd_size_check
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	液晶尺寸自动判断
+参数说明:	无
+返回值:  	成功返回0.
+修改记录:	
+*/
+int _lcd_size_check(struct lcdsize *lcd)
+{
+	int i;
+
+	if ((lcd->x < 128) || (lcd->y < 32))
+	{
+		return -1;
+	}
+	
+	for (i=0; i<SIZE_NUM-1; i++)
+	{
+		if ((lcd->x <= lcd_size_default[i].x)
+			&& (lcd->y <= lcd_size_default[i].y))
+		{
+			return i+1;
+		}
+	}
+
+	return -2;
+}
+
+
+/*------------------------------ 测试函数 -------------------------------------
+一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
+进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
+*/
+
+
+/*------------------------------ 文件结束 -------------------------------------
+*/

+ 458 - 0
dtu/dtu_main_t536/app/menudesc.h

@@ -0,0 +1,458 @@
+/******************************************************************************
+版权所有:	深圳市金宏威实业发展有限公司
+文件名称:	menudesc.h
+文件版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+功能说明:	菜单结构
+其它说明:
+修改记录:
+*/
+#ifndef _MENUDESC_H
+#define _MENUDESC_H
+/*------------------------------- 头文件 --------------------------------------
+*/
+
+
+/*------------------------------- 宏定义 --------------------------------------
+*/
+#define		INFO_ERR_QUERY		8
+#define 	INFO_DEBUG_QUERY	9
+#define 	INFO_GPRS_QUERY		16
+#define     INFO_EQU_QUERY      10  //每屏显示最大行数
+#define     MAX_LINE_PER_PAGE   10  //每屏显示最大行数
+
+// 页面类型
+enum 
+{
+	MENU_TYPE,			// 菜单类型  (2个汉字)
+	MENU_TYPE_CH8,      // 菜单类型2 (4个汉字)
+	SET_TYPE,			// 设置类型
+	QUERY_PAGE_TYPE,	// 查询页面类型
+	QUERY_1LINE_TYPE,	// 查询1行类型
+	ACTION_TYPE,		// 动作类型
+};
+
+// 查询类型
+enum
+{
+	QUERY_PUB_KR,	// 公共开入
+	QUERY_SW_KR,	// 开关开入
+	QUERY_PUB_AC,	// 公共测量
+	QUERY_SW_AC,	// 开关测量
+	QUERY_FLAG,		// 标志
+	QUERY_VER,		// 1页面显示:SOE、信息
+	QUERY_CFG,		// 配置文件
+	QUERY_TIME,		// 时间
+	QUERY_SJSOE,	// 事件记录
+	QUERY_CZSOE,	// 操作记录
+	QUERY_ERR,		// 错误信息
+	QUERY_DEBUG,	// 调试信息
+	QUERY_GPRS,		// GPRS信息
+	QUERY_PASSERR,	// 密码错误
+	QUERY_SAVERESULT,// 保存结果
+	QUERY_SETRANGE,	// 定值范围
+	QUERY_ADJUSTRESULT,//xj 2015.5.9校准结果	
+	QUERY_EVENT,	// 突发事件
+	QUERY_RMTPAIR,	// 遥控器配对
+	QUERY_DELPAIR,	// 遥控器清除配对
+	QUERY_EQU,      // 查询装置信息
+	QUERY_COMM_PARA,// 查询通讯参数
+	QUERY_YX,      	// 查询遥信点表
+	QUERY_YC,		// 查询遥测点表
+	QUERY_CHZ_FLAG,	// 重合闸标志
+
+	QUERY_NUM,
+};
+
+enum
+{
+	ACTION_TEST_KC,
+	ACTION_TEST_LCD,
+	ACTION_TEST_LED,
+	ACTION_BAT,
+	ACTION_ADJUST_AC,
+	ACTION_ADJUST_DC10,
+	ACTION_ADJUST_DC50,
+	ACTION_CLR_SOE,
+	ACTION_SAVE,
+	ACTION_RMT_PAIR,
+	ACTION_DEL_PAIR,
+	
+	ACTION_NUM,
+};
+
+// 固定菜单定义
+enum
+{
+	MENU_NULL=0,		// 无效菜单
+	
+	MENU_MAIN,		// 主菜单
+	MENU_RUNSTU,	// 工况
+	MENU_SET,		// 设置
+	MENU_SOE,		// 事件
+	MENU_DEBUG,		// 调试
+	MENU_INFO_PARA, // 信息参数
+	MENU_TABLE_INFO, // 点表信息
+	
+	MENU_KR,		// 开入
+	MENU_AC,		// 测量
+	MENU_FLAG,		// 标志
+	MENU_TIME,		// 时间
+	
+	MENU_FIX,		// 定值
+	MENU_PARA,		// 装置参数
+	MENU_TIMESET,	// 时间设置
+	MENU_BAT,		// 电池
+	MENU_RUN_PARA,  // 运行参数(远动参数)
+    MENU_FAULT_RESET, //故障复归
+
+#if SWITCH_NUM_MAX == 16
+	MENU_FIX_PUB,	// 公共定值
+	MENU_FIX_SW1,	// 开关定值
+	MENU_FIX_SW2,
+	MENU_FIX_SW3,
+	MENU_FIX_SW4,
+	MENU_FIX_SW5,
+	MENU_FIX_SW6,
+	MENU_FIX_SW7,
+	MENU_FIX_SW8,
+	MENU_FIX_SW9,
+	MENU_FIX_SW10,
+	MENU_FIX_SW11,
+	MENU_FIX_SW12,
+	MENU_FIX_SW13,
+	MENU_FIX_SW14,
+	MENU_FIX_SW15,
+	MENU_FIX_SW16,
+#elif SWITCH_NUM_MAX == 6
+	MENU_FIX_PUB,	// 公共定值
+	MENU_FIX_SW1,	// 开关定值
+	MENU_FIX_SW2,
+	MENU_FIX_SW3,
+	MENU_FIX_SW4,
+	MENU_FIX_SW5,	
+	MENU_FIX_SW6,
+#elif SWITCH_NUM_MAX == 8
+	MENU_FIX_PUB,	// 公共定值
+	MENU_FIX_SW1,	// 开关定值
+	MENU_FIX_SW2,
+	MENU_FIX_SW3,
+	MENU_FIX_SW4,
+	MENU_FIX_SW5,	
+	MENU_FIX_SW6,
+	MENU_FIX_SW7,
+	MENU_FIX_SW8,
+#elif SWITCH_NUM_MAX == 4
+	MENU_FIX_PUB,	// 公共定值
+	MENU_FIX_SW1,	// 开关定值
+	MENU_FIX_SW2,
+	MENU_FIX_SW3,
+	MENU_FIX_SW4,
+#elif SWITCH_NUM_MAX == 1	
+	MENU_FIX_PUB,	// 公共定值
+	MENU_FIX_SW1,	// 开关定值
+#endif
+
+	MENU_SJSOE,		// 事件
+	MENU_CZSOE,		// 操作
+    MENU_INFO_EQU,  // 装置信息 (固有参数)
+    MENU_COMM_PARA, // 通讯参数
+	MENU_INFO_YX,  	// 遥信信息
+    MENU_INFO_YC, 	// 遥测信息
+
+	MENU_TEST,		// 测试
+	MENU_ADJUST,	// 校准
+	MENU_RMT,		// 遥控器
+	MENU_INFIX,		// 内部定值
+	MENU_CODE,		// 密码
+	MENU_CLR,		// 清除记录
+	MENU_INFO,		// 信息
+
+	MENU_TEST_KC,	// 开出测试 
+	MENU_TEST_HMI,	// 人机测试
+
+	MENU_ADJUST_AC,	// 交流校准
+	MENU_ADJUST_DC,	// 直流校准
+
+	MENU_INFO_VER,	// 版本信息
+	MENU_INFO_CFG,	// 配置信息
+	MENU_INFO_ERR,	// 错误信息
+	MENU_INFO_DEBUG,// 调试信息
+	MENU_INFO_GPRS,	// GPRS信息
+
+	MENU_BH_STATUS, //保护状态
+    MENU_GLBH,      //过流保护
+    MENU_LXBH,      //零序保护
+    MENU_JDBH,      //接地保护
+    MENU_RECLOSE,   //重合闸
+	MENU_HJS,   	//后加速
+	MENU_DLYX,		//电流越限
+
+	MENU_PUB_YX,	//公共遥信
+	MENU_SW_YX,		//开关遥信
+	MENU_PUB_YC,	//公共遥测
+	MENU_SW_YC,		//开关遥测
+
+	MENU_CHZ_FLAG,		//重合闸标志
+	MENU_OTHERS_FLAG,	//其它标志
+
+	MENU_PASSWORD,	// 输入密码
+	MENU_PASSERR,	// 密码错误
+	MENU_SAVE,		// 退出保存
+	MENU_SAVE_RESULT,// 保存的结果
+	MENU_SET_RANGE,	// 定值范围
+	MENU_ADJUST_RESULT,	// xj 2015.5.8校准结果38 	
+
+	MENU_EVENT,		// 突发事件
+
+	MENU_RMT_PAIR,	// 遥控器配对
+	MENU_DEL_PAIR,	// 遥控器配对清除
+
+	MENU_NUM,
+};
+
+// 固定实体定义
+enum
+{
+
+	ITEM_VER=0,			// 版本信息
+	ITEM_CRC,			// CRC
+	ITEM_EQU,			// 装置资源
+	ITEM_BRD,			// 板卡资源
+	ITEM_CFG,			// 通道配置
+	ITEM_IECTABLE,		// 转发点表
+	ITEM_SETDESC,		// 定值描述
+	ITEM_SETDATA,		// 定值数据
+
+	ITEM_TEST_LCD,		// LCD测试
+	ITEM_TEST_LED,		// LED测试
+
+	ITEM_CLR_SJ,		// 清除事件记录
+	ITEM_CLR_CZ,		// 清除操作记录
+
+	ITEM_ADJUST_AC,		// 交流校准
+	ITEM_ADJUST_DC10,	// DC10V校准
+	ITEM_ADJUST_DC50,	// DC50V校准
+
+	ITEM_SAVE,			// 保存
+	ITEM_SAVE_OK,		// 确认保存
+	ITEM_SAVE_NOK,		// 取消保存
+
+	ITEM_RMT_A,
+	ITEM_RMT_B,
+	ITEM_RMT_C,
+	ITEM_RMT_D,
+	// ITEM_CHZ_CD,		// 重合闸充电标志
+
+	ITEM_RMT_PAIR,		// 遥控器配对
+	ITEM_DEL_PAIR,		// 清除配对
+
+	// ITEM_XDL_CHZ_CD,	// 小电流重合闸充电标志
+	
+	ITEM_NUM,
+};
+
+// 定值显示顺序定义
+enum
+{
+	SET_NAME,	// 第一行定值名称
+	SET_DATA,	// 第二行定值数据
+	SET_UNIT,	// 定值后面打印单位
+	SET_STR_NUM,
+};
+
+// 液晶的规格
+enum
+{
+	SMALL=1,
+	MID,
+	MID1,
+	BIG,	
+	SIZE_NUM,
+};
+
+// 特殊类型
+enum
+{
+	DISP_NULL=0,
+	DISP_IP,			// IP类型
+	DISP_YMD,		// 年月日型
+	DISP_HMS,		// 时分秒型
+	DISP_SPCL_NUM
+};
+
+/*------------------------------ 类型结构 -------------------------------------
+*/
+
+// 实体描述结构
+struct item
+{
+	u8	type;		// 类型	
+	u8	no;			// 
+	u8 	x;			// 坐标
+	u8 	y;
+};
+
+// 页面描述结构,以层级为一页面单位
+struct 	page_st
+{									
+	u8	menu_cur;		// 当前菜单表索引
+	u8	menu_m;			// 指向上一个节点(父节点)的指针
+	u8 	pagetype;		// 当前页面类型
+	u16	item_num;		// 页面的实体数量
+	u8	wnd_num;		// 根据实际分配的屏数
+	u8	wnd_item;		// 每屏可容纳的最多实体数
+	u8	cur_wnd_item;	// 当前屏分配的实体数
+	u8 	cur_wnd;		// 当前屏号
+	u8	cur_focus;		// 当前屏中的当前聚焦点	
+	u8	title;			// 当前屏是否有标题
+	u8 	time;			// 当前屏是否有时间
+	struct item *page_item;	// 页面实体
+	void  (*DispFun)(u8, u8, u8, struct item *);
+};
+
+
+
+// 固定菜单,以“行”为单位定义
+struct menu_table
+{
+	char *name;		// 名称的内容
+	u8 	code;		// 0x00 无,0x01 用户密码,0x02 超级密码
+	u8	save;		// 是否保存: 0 无,1 退出时提示保存
+};
+
+// 实体定义
+struct item_table
+{
+	char *name;
+	u8	unit;
+	u8 *fstdata;
+};
+
+// 液晶尺寸
+struct lcdsize
+{
+	u8 x;			// 液晶宽尺寸,以点为单位
+	u8 y;			// 液晶高尺寸,以点为单位,但必须为8的倍数
+};
+
+struct slave
+{
+	u8 menu_m;					// 主菜单
+	u8 menu_s[17];				// 子菜单
+};
+
+// 实体更新标志
+struct item_update
+{
+	u8 title;
+	u8 time;
+	u8 autoback;
+	u8 name[10];
+	u8 data[10];
+	u8 flash[10];
+	u32 flash_dly;
+	u32 time_dly;
+	u32 title_dly;
+	u32 autoback_dly;
+	u32 kr_dly[10];
+	u32 ac_dly[10];
+	u32 zf_dly[10];
+	u32 name_dly[10];
+};
+	
+// 页面查询显示结构
+struct page_dis
+{
+	u16	no_cur;			// 当前序号
+	u16	no_num;			// 序号总数
+	u16	no_index;		// 序号索引,用于SOE读取
+	u8	str_num;		// 需显示总数
+	// u8  str[16][18];	// 显示内容
+	u8  str[16][20];    // 显示内容    //2021-06-15
+};
+
+// 页面设置显示结构
+struct set_dis
+{
+	u8	x;				// 起始显示横坐标
+	u8	list;			// 列表类型
+	u8	type;			// 定值类型,区别于定值定义的类型,针对显示
+	u8  spcl_type;		// 特殊类型
+	int	modify;			// 当前项是否进入编辑模式
+	u8	lenth;			// 需设置的数据字符长度
+	u8	len;			// 单位的长度
+	u8	cursor;			// 光标位置
+	u8	point_mdf;		// 小数点可编辑
+	void *pdata;		// 定值数据
+	void *pdata1;		// 定值数据
+	void *pdata2;		// 定值数据
+	void *pdata3;		// 定值数据
+	void *pdata4;		// 定值数据
+	void *pdesc;
+	u8	desc[16];		// 存放定值描述
+	u8  str[3][21];		// 显示内容
+	u8  list_str[21];         //list定值显示
+};
+
+struct cfg_index
+{
+	u8 pub_di[PUB_DI_NUM];
+	u8 sw_di[SWITCH_NUM_MAX * SW_DI_NUM + SWITCH_NUM_MAX*9];//+SWITCH_NUM_MAX*9 //填充补偿
+	u8 kc[PUB_DO_NUM + SW_DO_NUM * SWITCH_NUM_MAX][2];
+	u8 ac[PUB_AC_NUM_ALL];
+};
+
+struct action
+{
+	u8 action[10];
+};
+
+struct disp_flag
+{
+	u32 chz_cd;
+	u32 xdl_chz_cd;
+};
+
+/*------------------------------ 变量声明 -------------------------------------
+*/
+extern const struct menu_table menu_base_table[MENU_NUM];
+extern struct page_st g_page_cur;		
+extern struct item_update g_item_update;
+extern struct page_st page_table[];
+extern const struct slave slave_table[];
+extern struct page_dis g_page_dis;	// 用于页面类查询显示
+extern struct set_dis g_set_dis[5];
+extern const int slave_menu_num;
+extern struct lcdsize g_lcdsize;
+extern struct cfg_index g_cfg_index;		
+extern struct action g_action;
+extern int lcdtype;						// 液晶尺寸类型
+extern int g_hmi_type;
+extern struct disp_flag g_disp_flag;		// 菜单内的标志
+extern const u8 sw_menu_num;
+
+// zhl add start
+extern u8 bPubSetMenuShow[SET_PUB_NUM];
+extern u8 bSwSetMenuShow[SET_NUM];
+extern u8 bParaSetMenuShow[PARA_NUM];
+extern u8 bCstSetMenuShow[CSTSET_NUM];
+extern bool g_bVipSoe_show;
+// zhl add end
+
+
+//当前页面
+/*------------------------------ 函数声明 -------------------------------------
+*/
+int menudesc_init(u8 lcd_size);
+int menudesc_exit(void);
+int menu_disp(void);
+void reset_update_flag(void);
+
+#endif //_MENUDESC_H
+
+/*------------------------------ 文件结束 -------------------------------------
+*/
+
+

+ 3 - 3
dtu/dtu_main_t536/app/net_debug.c

@@ -638,10 +638,10 @@ void net_debug_app(void)
 		case 'Q':         
 		case 'q':         
 		{
-			void mmd_create_menufile(void);
+			// void mmd_create_menufile(void);
 			g_print_to_net = 1;
-			mmd_create_menufile();
-			rt_printf("\r\n/app/data/lcd_menu.csv 菜单定义文件已生成\r\n");	
+			// mmd_create_menufile();
+			// rt_printf("\r\n/app/data/lcd_menu.csv 菜单定义文件已生成\r\n");	
 		}		
 		break;	
     

+ 10 - 9
dtu/dtu_main_t536/app/pda.c

@@ -612,8 +612,11 @@ static void _pda_comm_app(void)
 			{
 				pt->arrAppBuf[0]=0x01;
 				_pda_record_opelog(1, 8);
-				SignalReset(0,true);	
+				SignalReset(0, false);	
 				pda_data_echo(0xE6,1,pt->arrAppBuf);
+				g_file_led_sign = 1;			// 故障LED状态文件记录标志	
+				g_protect_restore = 1;
+				clear_tfd_fault();
 				rt_printf("PDA复归信号产生\r\n");
 			}
 			else if(pd[3]==0x02)  // 遥控合闸
@@ -854,8 +857,7 @@ static void _pda_auto_app(void)  //
 				sprintf((char*)tmpstr,"%-4.4s",g_pub_ac_desc[no3].name);				
 			}			
 
-			// sunxi 20180730 szName最大只有18 for(i=0;i<24;i++)
-			for(i=0;i<18;i++)
+			for(i=0;i<24;i++)
 			{
 				tItem.szName[i]=tmpstr[i];
 			}	
@@ -863,7 +865,7 @@ static void _pda_auto_app(void)  //
 		else if(mode==SEND_MODE_YX)
 		{
 		
-			BYTE tmpstr[PARA_NAME_LEN];
+			BYTE tmpstr[24];
 	//		static int num1,num2;
 			tItem.wType=8;
 			tItem.wUnit =0;
@@ -888,9 +890,8 @@ static void _pda_auto_app(void)  //
 			{
 				strcpy((char*)tmpstr,g_sw_di_name[pda->bySendNo -PUB_DI_NUM]);
 			}
-
-			// sunxi 20180730 szName最大只有18 for(i=0;i<20;i++)
-			for(i=0;i<18;i++)
+		
+			for(i=0;i<20;i++)
 			{
 				tItem.szName[i]=tmpstr[i];
 			}
@@ -1134,11 +1135,11 @@ static void _pda_get_event_show(EVENT_SHOW *pe,bool bPDA)
 		sprintf((char*)pe->namestr,"板卡%02d开入%02d变位",solt,dino+1);  // 板卡xx开入xx变位
 		if(soe_ev_is_on(er)) // 置1 ,产生,显示参数
 		{
-			strcpy(tmpstr,SOE_YX_H);
+			strcpy(tmpstr,"分->合");
 		}
 		else
 		{
-			strcpy(tmpstr,SOE_YX_F);
+			strcpy(tmpstr,"合->分");
 
 		}
 		sprintf((char *)pe->valuestr,"%-16.16s",tmpstr);

+ 1 - 1
dtu/dtu_main_t536/app/run_status.c

@@ -1608,7 +1608,7 @@ int app_action_result(void)
 	return 0;
 }
 
-u32 rmtpair_dely[2][2]={{0, 0},{0, 0}};	// 用于遥控器配对延时返回
+// u32 rmtpair_dely[2][2]={{0, 0},{0, 0}};	// 用于遥控器配对延时返回
 
 /*------------------------------ 内部函数 -------------------------------------
 内部函数以下划线‘_’开头,不需要检查参数的合法性.

+ 563 - 3
dtu/dtu_main_t536/app/set.c

@@ -44,6 +44,20 @@ bool bRunSetModify;
 uint32_t g_debugnet_ip, g_debugnet_mask,g_debugnet_gate;//调试网口IP,MASK,GATE等网络参数
 WORD m_runsection=0;
 
+struct sw_set_disp g_sw_setdisp;	// 挑选后的保护定值
+struct sw_set_disp g_equip_paradisp;// 挑选后的装置参数
+struct sw_set_disp g_cst_setdisp;	// 挑选后的内部定值
+struct pick_set_disp g_pub_setdisp;      //挑选后的公共定值
+struct pick_set_disp g_faultRst_setdisp; //挑选后的故障复归参数
+
+// struct grp_pick  g_pick_pubset_disp;  //挑选公共定值中的远动参数
+// struct grp_pick  g_pick_swset_disp;   //挑选开关定值中的远动参数
+// struct grp_pick  g_pick_equ_disp;     //挑选装置参数中的远动参数
+// struct grp_pick  g_pick_csset_disp;     //挑选内部定值中的远动参数
+struct pick_rmt_para g_rmt_para_disp; //挑选后的远动参数
+
+static int _swtype_change_setdisp(u8 set_type);
+
 SET_PARAID tParaID[MAX_SET_NUMBER];
 int ParaIDNum;
 #ifdef YPARA_LINK
@@ -1029,6 +1043,16 @@ const  SET_LIST DIRList[]=
 #define DIRListNum	sizeof(DIRList)/sizeof(SET_LIST)
 
 #endif
+
+
+struct classify_bh  class_GLBH;    //过流保护
+struct classify_bh  class_LXBH;    //零序保护
+struct classify_bh  class_JDBH;    //接地保护
+struct classify_bh  class_reclose; //重合闸
+struct classify_bh  class_BH_sts;  //保护状态
+struct classify_bh  class_DLYX;    //电流越限
+struct classify_bh  class_HJS;     //后加速
+
 int g_goose_net_type=0;
 
 /**********************************************************************
@@ -3373,8 +3397,8 @@ const  TFIXEDSETTABLE tfixedsettable[]=         //
 	{FIXED_SET_CRC,			 0,	USHORT_R,"",						"软件校验",},
 #else
 	{FIXED_SET_EQU,		0x8001,	STR_R,	"D30",						"终端类型",},
-	{FIXED_SET_SYS,		0x8002,	STR_R,	"Linux 2.6.29.1",			"操作系统",},
-	{FIXED_SET_MAU,		0x8003,	STR_R,	"",							"  制造商",},
+	{FIXED_SET_SYS,		0x8002,	STR_R,	"Linux 5.10.214",		    "操作系统",},
+	{FIXED_SET_MAU,		0x8003,	STR_R,	"", 						"  制造商",},
 	{FIXED_SET_HVR,		0x8004,	STR_R,	"HV01.02",					"硬件版本",},
 	{FIXED_SET_SVR,		0x8005,	STR_R,	"",							"软件版本",},
 	{FIXED_SET_CRC,		0x8006,	USHORT_R,"",						"软件校验",},
@@ -3433,6 +3457,267 @@ struct THREE_REMOTE g_three_remote_func[]=
 };
 const int REMOTE_NUM = (sizeof(g_three_remote_func)/sizeof(g_three_remote_func[0]));
 
+//特殊处理
+const char  *filter_JDBH[] =
+{
+    "小电流接地告警",
+    "小电流接地出口",
+	"小电流接地事故总",
+    "小电流暂态电流",
+	"小电流跳闸时间",
+	"小电流告警时间",
+    "零序反极性投退",
+};
+#define  FILTER_JDBH_NUMBER   7
+
+const char  *filter_faultRst[] =
+{
+    "信号自动复归投退",
+    "信号自动复归时间",
+    "故障遥信保持时间",
+};
+const char  *disp_name_faultRst[] =
+{
+    "故障灯自动复归",
+    "故障灯复归时间",
+    "故障遥信保持时间",
+};
+#define  FILTER_FLTRST_NUMBER  3
+
+const char  *filter_reclose[] =
+{
+	"重合闸投退",
+	"一次重合时间",
+	"二次重合时间",
+	"三次重合时间",
+	"重合闭锁时间",
+	"重合复归时间",
+	"重合闸次数",
+	"重合闸出口方式",
+	"重合检有压投退",
+	"重合检有压时间",
+};
+const char  *disp_name_reclose[] =
+{
+	"重合闸投退",
+	"一次重合时间",
+	"二次重合时间",
+	"三次重合时间",
+	"重合闭锁时间",
+	"重合复归时间",
+	"重合闸次数",
+	"重合闸出口方式",
+	"重合检有压投退",
+	"重合检有压时间",
+};
+#define  FILTER_RECLOSE_NUMBER   10
+
+const char  *disp_name_GLBH[] =
+{
+    "过流I段告警投退",
+    "过流I段出口投退",
+    "过流I段定值",
+    "过流I段时间",
+    "过流I段方向投退",
+    "过流I段方向指向",
+    "过流Ⅱ段告警投退",
+    "过流Ⅱ段出口投退",
+    "过流Ⅱ段定值",
+    "过流Ⅱ段时间",
+    "过流Ⅱ段方向投退",
+    "过流Ⅱ段方向指向",
+    "过流Ⅲ段告警投退",
+    "过流Ⅲ段出口投退",
+    "过流Ⅲ段定值",
+    "过流Ⅲ段时间",
+    "过流Ⅲ段方向投退",
+    "过流Ⅲ段方向指向",
+	"短路故障告警",
+	"短路故障跳闸",
+	"短路故障电流",
+	"短路故障时间",
+	"遮断闭锁投退",
+	"开关遮断电流",
+
+};
+
+#define  DISP_NAME_GLBH_NUMBER    24
+
+
+const char  *disp_name_LXBH[] =
+{
+    "零序Ⅰ过流告警",
+    "零序Ⅰ过流出口",
+    "零序Ⅰ过流定值",
+    "零序Ⅰ过流时间",
+    "零序Ⅱ过流告警",
+    "零序Ⅱ过流出口",
+    "零序Ⅱ过流定值",
+    "零序Ⅱ过流时间",
+	"零序Ⅲ过流告警",
+    "零序Ⅲ过流出口",
+    "零序Ⅲ过流定值",
+    "零序Ⅲ过流时间",
+	"零流告警",
+    "零流出口",
+    "零流告警定值",
+    "零流告警时间",
+};
+#define  DISP_NAME_LXBH_NUMBER    16
+
+//'保护'分类  初始化
+void set_bh_classify_init(void)
+{
+    int i,j;
+    int cnt=0;
+    struct classify_bh *pt=NULL;
+    bool filter_flag =0;
+
+    //过流保护
+    pt = &class_GLBH;
+    for(i=0, cnt=0; i< SW_SET_NUMBER; i++) {
+        if((tSwSetTable[i].group == GROUP_SET_GL) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+            //特殊处理
+			if(strcmp(tSwSetTable[i].szName, "过流停电跳闸") == 0)
+			{
+                continue;
+           	}
+            pt->idx[cnt++] = i;
+
+        }
+    }
+    pt->num = cnt;
+    //零序保护
+    pt = &class_LXBH;
+    for(i=0, cnt=0; i< SW_SET_NUMBER; i++) {
+
+        if((tSwSetTable[i].group == GROUP_SET_LX) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+            //特殊处理
+            filter_flag =0;
+            for(j=0; j<FILTER_JDBH_NUMBER; j++){
+                if(strcmp(tSwSetTable[i].szName, filter_JDBH[j]) == 0) {
+                    filter_flag = 1;
+                    break;
+                }
+            }
+            if(filter_flag == 0) {
+                pt->idx[cnt++] = i;
+            }
+        }
+    }
+    pt->num = cnt;
+
+    //接地保护
+    pt = &class_JDBH;
+    for(i=0, cnt=0; i< SW_SET_NUMBER; i++) {
+        if((tSwSetTable[i].group == GROUP_SET_LX) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+            //特殊处理
+            filter_flag =0;
+            for(j=0; j<FILTER_JDBH_NUMBER; j++){
+                if(strcmp(tSwSetTable[i].szName, filter_JDBH[j]) == 0) {
+                    filter_flag =1;
+                    break;
+                }
+            }
+            if((filter_flag == 1) &&
+               (strcmp(tSwSetTable[i].szName, "小电流暂态电流") != 0)) {
+                pt->idx[cnt++] = i;
+            }
+        }
+    }
+    pt->num = cnt;
+
+    //重合闸
+    pt = &class_reclose;
+    for(i=0, cnt=0; i< SW_SET_NUMBER; i++) {
+        if((tSwSetTable[i].group == GROUP_SET_CHZ) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+				//特殊处理
+				filter_flag =0;
+				for(j=0; j<FILTER_RECLOSE_NUMBER; j++){
+					if(strcmp(tSwSetTable[i].szName, filter_reclose[j]) == 0) {
+						filter_flag = 1;
+						break;
+					}
+				}
+				if(filter_flag == 1) {
+					pt->idx[cnt++] = i;
+				}
+            }
+        }
+     pt->num = cnt;
+
+    //后加速
+	cnt = 0;
+    pt = &class_HJS;
+    for(i=0; i< SW_SET_NUMBER; i++) {
+        if((tSwSetTable[i].group == GROUP_SET_HJS) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+                pt->idx[cnt++] = i;
+            }
+    }
+    pt->num = cnt;
+
+    //保护状态
+    cnt=0;
+    pt = &class_BH_sts;
+    for(i=0; i< SW_SET_NUMBER; i++) {
+        if(strcmp(tSwSetTable[i].szName, "保护总投退") == 0) {
+        	pt->idx[cnt++] = i;
+            break;
+        }
+    }
+    pt->num = cnt;
+
+	//电流越限
+	pt = &class_DLYX;
+    for(i=0, cnt=0; i< SW_SET_NUMBER; i++) {
+        if((tSwSetTable[i].group == GROUP_SET_OVI) &&
+           (tSwSetTable[i].wType != SETTYPE_LABEL)) {
+            pt->idx[cnt++] = i;
+        }
+    }
+    pt->num = cnt;
+
+}
+
+
+/******************************************************************************
+函数说明:   替换为LCD显示名称
+参数说明:
+返回值:    成功返回 指针, 失败返回NULL.
+*/
+char *get_replace_setdisp(u8 index, u8 menu)
+{
+    if(menu == MENU_GLBH) {
+        if(index >= DISP_NAME_GLBH_NUMBER)
+            return NULL;
+        else
+            return (char*)disp_name_GLBH[index];
+    }else if(menu == MENU_LXBH) {
+        if(index >= DISP_NAME_LXBH_NUMBER)
+            return NULL;
+        else
+            return (char*)disp_name_LXBH[index];
+
+    }else if(menu == MENU_RECLOSE) {
+        if(index >= FILTER_RECLOSE_NUMBER)
+            return NULL;
+        else
+            return (char*)disp_name_reclose[index];
+    }else if(menu == MENU_FAULT_RESET){
+        if(index >= FILTER_FLTRST_NUMBER)
+            return NULL;
+        else
+            return (char*)disp_name_faultRst[index];
+    }
+
+    return NULL;
+}
+
 // 得到一个固定参数的值
 int set_get_fixed_arg(int index,char *buf,int len)
 {
@@ -4139,6 +4424,8 @@ bool  MakeRunSet(bool bFirst)
 
 	ptSet->bTT_ShowOne = ((WORD)psetbuf[CSSET_DISP_ONE_TWO].ff==1 )?true:false; 
 
+	_swtype_change_setdisp(3);
+
 #ifdef DISP_SET_67KEY	
 	ptSet->bTT_HmiKeytype = ((WORD)psetbuf[CSSET_SET_67KEY].ff==1 )?true:false;
 	if(ptSet->bTT_HmiKeytype)
@@ -6356,6 +6643,8 @@ bool  MakeRunSet(bool bFirst)
 	}
 	pRunSet=ptSet;	// 将运行定值切换
 
+	_swtype_change_setdisp(2);
+
 	bRunSetModify=true;	
 
 	if((histrory_file_set && pRunSet->bTT_HistoryFile)||b_hisfile_format)
@@ -7285,6 +7574,9 @@ void MakeRunPara(bool bFirstInit, bool bUboot)
 
 	IEC_CommInit() ;        // 串口参数修改外部通信重新初始化 
 	Net_Init();   
+
+	_swtype_change_setdisp(1);
+
 	tm = (int)(psetbuf[PARA_SNTP_SYNC_TM].ff);
 	serverip= (DWORD)(psetbuf[PARA_IP_SNTP].tt);	 
 	//设置SNTP同步对时参数
@@ -8430,6 +8722,274 @@ void create_set_file(void)
 	}
 }
 
+/***************************************************
+函数名称:_rmt_para_disp_init
+函数版本:1.00 
+作者:   
+创建日期:2020.8.03    
+函数功能说明:
+输入参数:
+输出参数:无
+返回值: 成功时返回0,否则,-1
+函数扇入清单:
+***************************************************/
+static int _rmt_para_disp_init(u8 sw_sum)
+{
+#define  INFO_ADDR_BASE   0x805A
+    int i,j,tNum=0;
+    int cnt1, cnt2, cnt3, cnt4;
+    u8  sw0_idx_num =0;  //仅针对 开关定值
+	TRMTSETTABLE tTable[RMT_SET_TABLE_NUMBER];
+    u16 max_info_addr = INFO_ADDR_BASE+ sw_sum*0x20;
+
+    memset(&g_rmt_para_disp, 0, sizeof(g_rmt_para_disp));
+
+    // g_rmt_para_disp.pgrp[RMT_GRP_PUSET] = &g_pick_pubset_disp;
+    // g_rmt_para_disp.pgrp[RMT_GRP_SWSET] = &g_pick_swset_disp;
+    // g_rmt_para_disp.pgrp[RMT_GRP_EQSET] = &g_pick_equ_disp;
+	// g_rmt_para_disp.pgrp[RMT_GRP_CSSET] = &g_pick_csset_disp;
+
+    cnt1=0; cnt2=0; cnt3=0; cnt4=0;
+
+    //统计开关定值的一个间隔的索引数量
+    for (i=0; i<RMT_SET_TABLE_NUMBER; i++){
+        if(tRmtsettable[i].di >= max_info_addr) {
+            break;
+        }
+
+        if((tRmtsettable[i].group == RMT_GRP_SWSET) &&
+           (tRmtsettable[i].offset != 0)) {
+
+			// 过滤备用偏移点
+			// if (tRmtsettable[i].index == SET_POWER_V2_TT)continue; //zhl TODO 暂时屏蔽,需要对接
+
+            g_rmt_para_disp.sw0_idx[sw0_idx_num] = tRmtsettable[i].index;
+            sw0_idx_num++;
+        }
+    }
+    g_rmt_para_disp.sw0_idx_sum = sw0_idx_num;
+
+	// 过滤显示备用点
+	for ( i = 0; i < RMT_SET_TABLE_NUMBER; i++)
+	{
+		//开关定值
+        if(tRmtsettable[i].group == RMT_GRP_SWSET) {
+			// if (tRmtsettable[i].index == SET_POWER_V2_TT)continue; //zhl TODO 暂时屏蔽,需要对接
+		}
+
+		if(tRmtsettable[i].group == RMT_GRP_CSSET){
+			// if (tRmtsettable[i].index == CSSET_GROUP_YC_SIZE)continue; //zhl 暂时屏蔽,需要对接
+		}
+
+		memcpy(&tTable[tNum++], &tRmtsettable[i], sizeof(TRMTSETTABLE));
+	}
+	
+    for (i=0; i<tNum; i++){
+        if(tTable[i].di >= max_info_addr) {
+            break;
+        }
+
+        //公共定值
+        if(tTable[i].group == RMT_GRP_PUSET){
+			if(cnt1 < MAX_NUM_PICK_PARA) {
+				g_rmt_para_disp.pgrp[RMT_GRP_PUSET].rmt_idx[cnt1] = i;
+                g_rmt_para_disp.pgrp[RMT_GRP_PUSET].grp_idx[cnt1] = tTable[i].index;
+                cnt1++;
+           }else{
+              rt_printf("[%s, %d] WARNING: buf NOT enough!!! %d \r\n", __func__, __LINE__,cnt1);
+           }
+        }
+
+        //开关定值
+        if(tTable[i].group == RMT_GRP_SWSET) {
+            if(cnt2 < MAX_NUM_PICK_PARA) {
+                if(tTable[i].offset != 0) {
+                    for(j=0; j<sw_sum; j++) {
+						g_rmt_para_disp.pgrp[RMT_GRP_SWSET].rmt_idx[cnt2] = j*sw0_idx_num + i;  //
+                        g_rmt_para_disp.pgrp[RMT_GRP_SWSET].grp_idx[cnt2] = tTable[i].index;
+                        cnt2++;
+                    }
+                }else{
+					g_rmt_para_disp.pgrp[RMT_GRP_SWSET].rmt_idx[cnt2] = i;
+                    g_rmt_para_disp.pgrp[RMT_GRP_SWSET].grp_idx[cnt2] = tTable[i].index;
+                    cnt2++;
+                }
+        	}else{
+        		rt_printf("[%s, %d] WARNING: buf NOT enough!!! %d \r\n", __func__, __LINE__,cnt2);
+        	}
+        }
+
+        // 装置参数
+        if(tTable[i].group == RMT_GRP_EQSET){
+			
+			if(cnt3 < MAX_NUM_PICK_PARA) {
+				g_rmt_para_disp.pgrp[RMT_GRP_EQSET].rmt_idx[cnt3] = i;
+	            g_rmt_para_disp.pgrp[RMT_GRP_EQSET].grp_idx[cnt3] = tTable[i].index;
+	            cnt3++;
+			}else{
+				rt_printf("[%s, %d]WARNING: buf NOT enough!!! %d \r\n", __func__, __LINE__,cnt3);
+			}
+        }
+
+		//内部定值
+        if(tTable[i].group == RMT_GRP_CSSET){
+            if(cnt4 < MAX_NUM_PICK_PARA) {
+				g_rmt_para_disp.pgrp[RMT_GRP_CSSET].rmt_idx[cnt4] = i;
+	            g_rmt_para_disp.pgrp[RMT_GRP_CSSET].grp_idx[cnt4] = tTable[i].index;
+                cnt4++;
+            }else{
+                rt_printf("[%s, %d]WARNING: buf NOT enough!!! %d \r\n", __func__, __LINE__,cnt4);
+            }
+        }
+    }
+    // g_pick_pubset_disp.num = cnt1;
+    // g_pick_swset_disp.num = cnt2;
+    // g_pick_equ_disp.num  = cnt3;
+	// g_pick_csset_disp.num  = cnt4;
+	g_rmt_para_disp.pgrp[RMT_GRP_PUSET].num = cnt1;
+    g_rmt_para_disp.pgrp[RMT_GRP_SWSET].num = cnt2;
+    g_rmt_para_disp.pgrp[RMT_GRP_EQSET].num  = cnt3;
+	g_rmt_para_disp.pgrp[RMT_GRP_CSSET].num  = cnt4;
+
+    g_rmt_para_disp.total  = cnt1 + cnt2 + cnt3 + cnt4;	
+    g_rmt_para_disp.sw_num = sw_sum;
+
+	#if 0
+	for ( i = 0; i < cnt3; i++)
+	{
+		rt_printf("[%s , %d] EQSET=%d, %d, %d \r\n", __func__, __LINE__ ,g_rmt_para_disp.pgrp[RMT_GRP_EQSET].num, 
+		g_rmt_para_disp.pgrp[RMT_GRP_EQSET].grp_idx[i],g_rmt_para_disp.pgrp[RMT_GRP_EQSET].rmt_idx[i]);
+		
+	}
+	for ( i = 0; i < cnt1; i++)
+	{
+		rt_printf("[%s , %d] PUBSET=%d, %d, %d \r\n", __func__, __LINE__ ,g_rmt_para_disp.pgrp[RMT_GRP_PUSET].num, 
+		g_rmt_para_disp.pgrp[RMT_GRP_PUSET].grp_idx[i],g_rmt_para_disp.pgrp[RMT_GRP_PUSET].rmt_idx[i]);
+		
+	}
+	for ( i = 0; i < cnt2; i++)
+	{
+		rt_printf("[%s , %d] SWSET=%d, %d, %d \r\n", __func__, __LINE__ ,g_rmt_para_disp.pgrp[RMT_GRP_SWSET].num, 
+		g_rmt_para_disp.pgrp[RMT_GRP_SWSET].grp_idx[i],g_rmt_para_disp.pgrp[RMT_GRP_SWSET].rmt_idx[i]);
+		
+	}
+	for ( i = 0; i < cnt4; i++)
+	{
+		rt_printf("[%s , %d] SWSET=%d, %d, %d \r\n", __func__, __LINE__ ,g_rmt_para_disp.pgrp[RMT_GRP_SWSET].num, \
+		g_rmt_para_disp.pgrp[RMT_GRP_SWSET].grp_idx[i],g_rmt_para_disp.pgrp[RMT_GRP_SWSET].rmt_idx[i]);
+		
+	}
+	#endif
+
+    if((cnt1 >= MAX_NUM_PICK_PARA) ||
+       (cnt2 >= MAX_NUM_PICK_PARA) ||
+	   (cnt4 >= MAX_NUM_PICK_PARA) ||
+       (cnt3 >= MAX_NUM_PICK_PARA)) {
+        rt_printf("[%s, %d]WARNING: buf NOT enough!!! %d, %d, %d, %d\r\n", __func__, __LINE__ ,cnt1, cnt2, cnt3, cnt4);
+        return -1;
+    }
+	
+    return 0;
+}
+
+/******************************************************************************
+函数名称:	_swtype_change_setdisp
+函数版本:	01.01
+创建作者:	钟务贵
+创建日期:	2014-12-16
+函数说明:	开关类型刷新定值显示
+参数说明:	set_type: 1 装置参数,2 保护定值,3 内部定值
+返回值:  	成功返回0.
+修改记录:	
+*/
+static int _swtype_change_setdisp(u8 set_type)
+{
+	int  i, j;
+	int  cnt =0;
+
+	switch(set_type)
+	{
+		case 1:
+		{
+			memset(&g_equip_paradisp, 0, sizeof(g_equip_paradisp));
+
+			for (i=0; i<EQUIP_PARA_NUMBER; i++)
+			{
+				if (tEquipParaTable[i].wType != SETTYPE_LABEL) 
+				{
+					g_equip_paradisp.no[g_equip_paradisp.num] = i;
+					g_equip_paradisp.num++;
+				}		
+			}
+
+		    //挑选故障复归 定值
+		    memset(&g_faultRst_setdisp, 0, sizeof(g_faultRst_setdisp));
+		    for(i=0; i<EQUIP_PARA_NUMBER; i++)
+		    {
+		        if ((tEquipParaTable[i].wType != SETTYPE_LABEL) &&
+		            (tEquipParaTable[i].group == GROUP_PARA_OTHERS))
+		        {
+		            //特殊处理
+		            for(j=0; j<FILTER_JDBH_NUMBER; j++){
+		                if(strcmp(tEquipParaTable[i].szName, filter_faultRst[j]) == 0) {
+		                    g_faultRst_setdisp.no[cnt++] = i;
+		                    break;
+		                }
+		            }
+		        }
+		    }
+            g_faultRst_setdisp.num = cnt;
+		}
+		break;
+
+		case 2:
+		{
+			memset(&g_sw_setdisp, 0, sizeof(g_sw_setdisp));
+
+			for (i=0; i<SW_SET_NUMBER; i++)
+			{
+				if (tSwSetTable[i].wType != SETTYPE_LABEL)
+				{
+					g_sw_setdisp.no[g_sw_setdisp.num] = i;
+					g_sw_setdisp.num++;
+				}		
+			}
+		}
+		break;
+
+		case 3:
+		{
+			memset(&g_cst_setdisp, 0, sizeof(g_cst_setdisp));
+
+			for (i=0; i<CSTSET_NUMBER; i++)
+			{
+				if (tCstSetTable[i].wType != SETTYPE_LABEL) 
+				{
+					g_cst_setdisp.no[g_cst_setdisp.num] = i;
+					g_cst_setdisp.num++;
+				}		
+			}
+		}
+		break;
+	}
+
+	//公共定值
+    memset(&g_pub_setdisp, 0, sizeof(g_pub_setdisp));
+    for (i=0; i<PUB_SET_NUMBER; i++)
+    {
+        if (tPubSetTable[i].wType != SETTYPE_LABEL)
+        {
+            g_pub_setdisp.no[g_pub_setdisp.num] = i;
+            g_pub_setdisp.num++;
+        }
+    }
+
+	_rmt_para_disp_init(g_sw_num);  //远动参数
+	set_bh_classify_init();  //保护分类
+
+	return 0;
+}
+
 /******************************************************************************
 函数名称:	mmd_get_set_dip_index()
 函数版本:	01.01
@@ -8441,7 +9001,7 @@ void create_set_file(void)
 修改记录:	
 */
 
-struct set_disp_index  g_set_disp;// 挑选后的保护定值
+struct sw_set_disp  g_set_disp;// 挑选后的保护定值
 
 void  mmd_get_set_dip_index(const TSETTABLE *pTable,int num)
 {

+ 67 - 7
dtu/dtu_main_t536/app/set.h

@@ -67,6 +67,8 @@
 #define  TBLQDDSMK              5                   //突变量连续起动点数
 #define  QTQDTIME               SAMFREQ             //IA、IB、IC、I0或Ij启动时间,往前推一个周波
 
+#define  MAX_NUM_PICK_PARA      200                  //每张表挑选的最大数量(远动参数等)
+
 //#define DISP_SET_CH_T3	//维护工具&&液晶显示重合闸三次
 //#define	DISP_SET_GL3		//维护工具&&液晶显示过流三段定值&时间
 
@@ -348,6 +350,7 @@ enum ESETTYPE
 	SETTYPE_HMS,			//时分秒
 	SETTYPE_4INT,			//整型值
 	SETTYPE_LABEL,			//标签类,工具分类显示用,没有实际意义
+	SETTYPE_6INT,
 };
 
 // 定值单位显示
@@ -2974,14 +2977,28 @@ typedef struct TKGTABLE
 	const char **pNames;  //本组控制字各种编码(按小到大)的描述
 }TKGTABLE;
 
-struct set_disp_index
+// struct set_disp_index
+// {
+// 	int num;				// 按开关重新分配后的定值总数
+// 	int swnum;
+// 	u16 no[MAX_SET_NUMBER];	// 重新编号的定值顺序
+// 	u16 Y_offset[MAX_SET_NUMBER];	// 重新编号的定值现实位置
+// 	u16 screennum[MAX_SET_NUMBER];  //每屏定值数
+// 	u16 bgn[MAX_SET_NUMBER];  //每屏定值数
+// };
+
+struct sw_set_disp //支持数量大
 {
+	int type;
 	int num;				// 按开关重新分配后的定值总数
-	int swnum;
-	u16 no[MAX_SET_NUMBER];	// 重新编号的定值顺序
-	u16 Y_offset[MAX_SET_NUMBER];	// 重新编号的定值现实位置
-	u16 screennum[MAX_SET_NUMBER];  //每屏定值数
-	u16 bgn[MAX_SET_NUMBER];  //每屏定值数
+	int no[MAX_SET_NUMBER];	// 重新编号的定值顺序
+};
+
+struct pick_set_disp //支持数量小
+{
+    int type;
+    int num;                    // 挑选后的总数
+    int no[MAX_NUM_PICK_PARA]; // 挑选后的序号
 };
 
 typedef struct 
@@ -3060,6 +3077,32 @@ typedef struct TFIXEDSETTABLE  // 
 	char        *name;
 }TFIXEDSETTABLE;
 
+//保护定值分类
+struct classify_bh {
+    u16 num;
+    u8  sw_idx;    //第几个间隔
+    u8  reserve;
+    u8  idx[60];
+};
+
+struct grp_pick
+{
+    u16 num;
+    u8  rmt_idx[MAX_NUM_PICK_PARA];
+    u8  grp_idx[MAX_NUM_PICK_PARA];
+};
+
+//挑选后的远动参数
+struct pick_rmt_para
+{
+    u8  type;
+    u16 total;
+    u8  sw_num;
+    u8  sw0_idx_sum;   	// max: 16
+    u8  sw0_idx[256];	// TODO NOTE: max will abnormal increase and we need to find the reason
+    struct grp_pick pgrp[RMT_GRP_NUMBER];
+};
+
 
 extern const  TRMTSETTABLE tRmtsettable[];       //定值
 extern const int RMT_SET_TABLE_NUMBER	;
@@ -3095,10 +3138,25 @@ extern const int CODE_SET_NUMBER;
 extern const  TSETTABLE tCodeTable[];
 extern u16 g_crc_set_desc;
 extern u16 g_crc_set_data;
-extern struct set_disp_index  g_set_disp;// 挑选后的保护定值
+extern struct sw_set_disp  g_set_disp;// 挑选后的保护定值
 extern BH_SET_GROUP SetGroups[];  //单位符号定义,对应定值
 extern const SET_LIST BaudList[];  // 波特率列表
 
+extern struct sw_set_disp g_sw_setdisp;	// 挑选后的保护定值
+extern struct sw_set_disp g_equip_paradisp;// 挑选后的装置参数
+extern struct sw_set_disp g_cst_setdisp;	// 挑选后的内部定值
+extern struct pick_set_disp g_pub_setdisp;      // 挑选后的公共定值
+extern struct pick_set_disp g_faultRst_setdisp; //挑选后的故障复归参数
+
+extern struct pick_rmt_para g_rmt_para_disp; //挑选后的远动参数
+extern struct classify_bh  class_GLBH;    //过流保护
+extern struct classify_bh  class_LXBH;    //零序保护
+extern struct classify_bh  class_JDBH;    //接地保护
+extern struct classify_bh  class_reclose; //重合闸
+extern struct classify_bh  class_BH_sts;  //保护状态
+extern struct classify_bh  class_DLYX;    //电流越限
+extern struct classify_bh  class_HJS;     //后加速
+
 
 /*------------------------------ 函数声明 -------------------------------------
 */
@@ -3139,6 +3197,8 @@ void get_yx_ac(u8 index, u32 type);
 WORD GetCstValForwardAddr(const BYTE type,const int index);
 extern DWORD GetSetSQR(float ff,float fk);
 
+char *get_replace_setdisp(u8 index, u8 menu);
+
 #endif//__SET_H
 //========================== 本文件结束 =============================
 

+ 3 - 3
dtu/dtu_main_t536/sh/t536/Makefile

@@ -118,14 +118,11 @@ OBJS =  main_mod.o \
 		tmp/app/IECLINK.o\
 		tmp/app/Modbus.o\
 		tmp/app/iectable.o\
-		tmp/app/MmiData.o\
 		tmp/app/LcdComm.o\
 		tmp/app/led.o\
 		tmp/app/main.o\
 		tmp/app/Maintain.o\
 		tmp/app/mea.o\
-		tmp/app/Menu2c.o\
-		tmp/app/MmiDrv.o\
 		tmp/app/myconf.o\
 		tmp/app/net_104.o\
 		tmp/app/net_debug.o\
@@ -170,6 +167,9 @@ OBJS =  main_mod.o \
 		tmp/app/read_id.o\
 		tmp/app/base64.o\
 		tmp/app/can_board.o\
+		tmp/app/menudesc.o \
+		tmp/app/key_menu.o \
+		tmp/app/file_led.o \
 		\
 		tmp/app/printf_e907.o\
 		tmp/app/fuxi_shm_app.o\