/********************************************************************
版权所有：	
文件版本： V1.00
文件名称： MmiDrv.c
生成日期： 2007年08月26日
作    者：
使用范围：

功    能：菜单驱动处理
更新信息：
更新日志1：
修改者:
修改日期:
修改内容:
修改原因:
*********************************************************************/
#include "head.h"
#define FLASH_DATA_ADDRESS	(0)	/*菜单数据在Falash中的地址*/

extern const  MENU_TABLE_DEF MenuStartTable[]; //菜单结构定义
extern const  MENU_HEAD_DEF MenuHeadTable[];
extern const  MENU_FIELD_DEF MenuFieldTable[];

#define MENU_DATA_ADDR	(MenuFieldTable)		/*菜单数据在Falash中的地址*/
#define MENU_TABLE_ADDR	(MenuStartTable)		/*菜单索引在Falash中地址*/
#define MENU_HEAD_ADDR	(MenuHeadTable)		/*菜单*/

SCREEN_DEF g_tScreen;
bool g_bModify;
bool g_bReModify;
bool g_bImageForms;
bool g_bEnterImageForms;
unsigned short g_sFunTimeCounter;
unsigned short g_sNoKeyCounter;

/**************************************************************************
函数名称：mmi_ScreenInit
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：菜单初始化，清菜单处理标志，默认菜单为第一屏
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/
void mmi_get_lcd_type(void)
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+0; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	g_tScreen.lcd_type=pField->sX;  //第 0屏的第一行sX定义屏类型


}

void mmi_zero_passwordstr(void)
{
#ifdef PASSWORD_4_STR
			strcpy(m_strPassword,INIT_PASSWORD_STR_4);//PASSWORD_STR_ZERO
			strcpy(m_strPassword2,INIT_PASSWORD_STR_4);//PASSWORD_STR_ZERO
#else 
			strcpy(m_strPassword,INIT_PASSWORD_STR);//PASSWORD_STR_ZERO
			strcpy(m_strPassword2,INIT_PASSWORD_STR);//PASSWORD_STR_ZERO
#endif

}
void mmi_ScreenInit(void)
{	
	g_bModify=false;/*修改状态标志*/
	g_tScreen.tForm.sAttrib=0;
	g_tScreen.cActiveMenuNo=0;
	g_tScreen.cOldFieldNo=-1;
	g_tScreen.cOldMenuNo=-1;
	g_tScreen.lnLightTime=dTCounter;
	g_tScreen.lnMainTime=dTCounter;		
	g_tScreen.cPrevMenuNo=-1;
	g_tScreen.cPrevFiedlNo=-1;
	#ifdef SEC_SETVALUE_7
		m_sectionnum=6;
	#elif defined SEC_SETVALUE_4
		m_sectionnum=3;
    #else
		m_sectionnum=4;
    #endif	
	strcpy(m_selsec_char,"00");
	mmi_FormsInit(0,1);
	mmi_zero_passwordstr();
}
/**************************************************************************
函数名称：mmi_InitForms
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：初始化屏体菜单，
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_InitForms(FORMS_DEF *pf)
{
	pf->MenuNo=0xff;
	pf->sFormsX=0;   /*窗体起始坐标*/
	pf->sFormsY=0;
	
	pf->pCurrentDataMenu=(void *)0; /*动态菜单地址备份*/
}
/**************************************************************************
函数名称：mmi_GetActiveFormsAttrib
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得当前菜单的属性
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/
#if 0
static unsigned short mmi_GetActiveFormsAttrib(void)
{
	return(g_tScreen.tForm.sAttrib); /*当前菜单的属性*/
}
#endif
/**************************************************************************
函数名称：mmi_GetShowNum
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取的选择菜单所在的屏的显示数量
输入参数：pt 选择的菜单项
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static short mmi_GetShowNum(DATA_MENU_DEF *pt,bool bext)
{
	short ret;
	
	if(!bext)
	{
		if(pt->sTotalNum<=pt->sScreenNum) /*1屏可以显示全部内容*/
		{  
			ret=pt->sTotalNum;
		} 
		else if((pt->sFocusIndex+pt->sTotalNum%pt->sScreenNum)<pt->sTotalNum) /*中间屏，显示允许显示的的值*/
		{
			ret=pt->sScreenNum;/*每屏允许显示的个数*/
		}
		else /*最后的屏，剩余部分*/
		{
			ret=pt->sTotalNum%pt->sScreenNum;
		}
	}
	else
	{
		ret=pt->sScreenNum;
	}
	return ret;
}


 /**************************************************************************
函数名称：mmi_FormsInit
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：窗体初始化,提取相应的信息。
输入参数：menuNo  窗体号 fieldNo 域号
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

void  mmi_FormsInit(unsigned char menu,unsigned char field) /**p为参数指针*/
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	MENU_HEAD_DEF   *pHead;
	FORMS_DEF       tForms;	
	
	unsigned char cnt;	
	unsigned char cMenuItemAttrib;
	unsigned char cMenuShowAttrib;
	unsigned char cMenuInitAttrib;
	unsigned char cMenuKeyAttrib;

	unsigned char MenuNo=menu;
	unsigned char FieldNo=field;
	
	pHead =(MENU_HEAD_DEF  *)MENU_HEAD_ADDR;  /*0x0000  MenuFieldStart[]起使地址*/
	g_bReModify=false;
	g_bModify=false;
	
	/*(254.254是特殊菜单号)*/
	if(MenuNo==254&&FieldNo==254) /*退出当前动态窗体*/
	{		
		MenuNo=g_tScreen.cPrevMenuNo;
		FieldNo=g_tScreen.cPrevFiedlNo;
	}
	if((MenuNo>pHead->sMaxMenuNo&&MenuNo!=254)||FieldNo>254) /*纠错处理，大于最大的菜单号，出错*/
	{
		MenuNo=0;   //若出错了，跳转到第一屏,防止陷入死循环
		FieldNo=1;
	}
	mmi_InitForms(&tForms);	
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+MenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	
	tForms.sAttrib=pField->sAttrib;            /*保存窗体属性*/
	cMenuItemAttrib=pField->sAttrib>>12&0x0f;  /*取得窗体属性定义*/
	cMenuKeyAttrib=pField->sAttrib>>8&0x0f;  /*取得窗体显示属性定义*/
	cMenuShowAttrib=pField->sAttrib>>4&0x0f;  /*取得窗体显示属性定义*/
	cMenuInitAttrib=pField->sAttrib>>0&0x0f;  /*取得窗体初始化属性定义*/
	
	tForms.MenuNo=MenuNo;


	if(cMenuItemAttrib&0x08) /*弹出式窗体*/
	{
		BYTE type=(g_tScreen.tForm.sAttrib>>12&0x0f);
		if((type&0x08)==0)
		{
			g_tScreen.cPrevMenuNo=g_tScreen.cActiveMenuNo;
			g_tScreen.cPrevFiedlNo=g_tScreen.cActiveFieldNo;	
		}
	}
	else
	{
		g_tScreen.cPrevMenuNo=-1;
		g_tScreen.cPrevFiedlNo=-1;
	}	
	
	{ /*在641基础上新加的内容，都用addnew标示*/
	 /*窗体坐标*/
	 tForms.sFormsX=0;  /*addnew 2007.4.6*/
	 tForms.sFormsY=0;  /*addnew*/
	 /*转换焦点*/
	 g_tScreen.tForm=tForms;	
	 
	 if(FieldNo!=255)
	 {
		 g_tScreen.cActiveMenuNo=MenuNo;         /*当前窗体菜单号*/
		 g_tScreen.cActiveFieldNo=FieldNo;         /*当前窗体菜单号*/
	 }		 
	 Add_Clear_Screen();			 
	}/*addnew 2007.4.6	 */
	
 	/*分析菜单内容，确定窗体大小*/
	{	
		/*遍寻窗体，确定大小*/
		for(cnt=1;cnt<pTable->sMenuFieldSum;cnt++)
		{
			pField++;
			switch(pField->sAttrib>>12&0x0f)
			{
			case 1:   /*内容变化菜单*/
				{
					DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
					tForms.pCurrentDataMenu=pt;  /*保存数据菜单结构的地址*/					
					pt->tAttribField=*pField;  /*保存属性菜单项*/
					if((pField->sAttrib>>0&0x04)==0)pt->sScreenNum=pField->lnMmUser;  /*每屏菜单数*/
					if(pt->sScreenNum==0)pt->sScreenNum=1;
				}
				break;
			case 5:   /*内容变化菜单*/
				{
					
					DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
				//	if(tForms.bAddMenu==false) /*是否有相随的动态菜单*/
				//	{
				//		tForms.bAddMenu=true;
				//		g_tScreen.sAddMenuNum=0;
				//	}					
				//	g_tScreen.arrAddMenu[g_tScreen.sAddMenuNum]=pt;
				//	if(++g_tScreen.sAddMenuNum>=3)g_tScreen.sAddMenuNum=0;					
					pt->tAttribField=*pField;  /*保存属性菜单项*/
					if((pField->sAttrib>>0&0x04)==0)pt->sScreenNum=pField->lnMmUser;  /*每屏菜单数*/
					if(pt->sScreenNum==0)pt->sScreenNum=1;
				}
				break;
			case 0x0a:
				{
					DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
					pt->sScreenNum=pField->lnMmUser;  /*每屏菜单数*/
					if(pt->sScreenNum==0)pt->sScreenNum=1;
				}
				break;
			case 0x0f:    /*多窗口恢复*/
				
				if(pField->cUpNextMenuNumber<0xff&&pField->cUpNextFieldNumber<0x0FF)/*不同屏内跳转*/
				{
					mmi_FormsInit(pField->cUpNextMenuNumber,pField->cUpNextFieldNumber);
				}
				if(pField->cDownNextMenuNumber<0xff&&pField->cDownNextFieldNumber<0x0FF)/*不同屏内跳转*/
				{
					mmi_FormsInit(pField->cDownNextMenuNumber,pField->cDownNextFieldNumber);
				}
				if(pField->cLeftNextMenuNumber<0xff&&pField->cLeftNextFieldNumber<0x0FF)/*不同屏内跳转*/
				{
					mmi_FormsInit(pField->cLeftNextMenuNumber,pField->cLeftNextFieldNumber);
				}
				return ;
			default:
				break;
			}
		}
	}	
	 	 /*保存当前窗体参数*/
		 g_tScreen.tForm=tForms;	

	
	/*显示全部数据数据*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR;  /*0x0414 开始显示的菜单地址	*/
	pField+=((uint32_t)(pTable->sMenuFieldStart));/*当前窗体菜单的属性项（第1屏）*/

	for(cnt=1;cnt<pTable->sMenuFieldSum;cnt++)
	{
		unsigned char cFieldItemAttrib;
		unsigned char cFieldShowAttrib;
		unsigned char cFieldDataAttrib;
		unsigned char cFieldPositonAttrib;
		
		unsigned char model=MMI_FOCUS_NO; /*不反显	*/
		pField++;
		cFieldShowAttrib=pField->sAttrib>>0&0x0f;	
		cFieldDataAttrib=pField->sAttrib>>4&0x0f;
		cFieldPositonAttrib =pField->sAttrib>>8&0x0f;
		cFieldItemAttrib=pField->sAttrib>>12&0x0f;
		if(cFieldItemAttrib==1||cFieldItemAttrib==5)/*动态菜单*/
		{
			int i;
			DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
			if(pt->sTotalNum==0)continue;
			model=MMI_FOCUS_NO; 
			if(cFieldShowAttrib&0x01) /*当前菜单可聚焦*/
			{
				if(cFieldDataAttrib&0x09) /*有变量不要编辑,*/
				{
					model=MMI_FOCUS_NO;
				}
				else
				{
					model=MMI_FOCUS_NORMAL;
				}
			}		
			if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/
			/*显示第一项*/

			if(cFieldShowAttrib&0x04)
			{
				fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY+pt->tDataFields[0].offset*16,model,
					(char *)(pt->tDataFields[0].FmtStr),pt->tDataFields[0].pData);
			}
			else
			{			
				fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY,model,
					(char *)(pt->tDataFields[0].FmtStr),pt->tDataFields[0].pData);
			}
			
			/*显示其他项*/
			model=MMI_FOCUS_NO; 
			if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/
			for(i=1;i<mmi_GetShowNum(pt,(cFieldShowAttrib&0x04));i++)
			{		
				if(cFieldShowAttrib&0x04)
				{
					fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY+pt->tDataFields[i].offset*16,model,
						(char *)(pt->tDataFields[i].FmtStr),pt->tDataFields[i].pData);
				}
				else
				{
					fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY+i*16,model,
						(char *)(pt->tDataFields[i].FmtStr),pt->tDataFields[i].pData);
				}
			}
		}
		else if(cFieldItemAttrib==6)//主接线图结构
		{
			MAIN_IMAGE_DEF *pm=&g_tLcdComm.tImage;
			lcd_DrawImage(pm->sImageX,pm->sImageY,&pm->pBuf[pm->lnImageAddr],0);	//主接线
			mmd_freshmainunit(true);

		}
		else if(cFieldItemAttrib==2)
		{
			BYTE para[8];
			para[0]=pField->sX;
			para[1]=pField->sY;
			para[2]=(u8)pField->lnMmUser;
			para[3]=(u8)(pField->lnMmUser>>8);
			HMI_add_inst_frame(HMI_CMD_LINE,para,4);          //  划线
		}
		else
		{
			if(cnt==FieldNo) /*当前要聚焦的菜单项*/
			{
				if(cFieldShowAttrib&0x01) /*当前菜单可聚焦*/
				{
					if(cFieldDataAttrib&0x01||cFieldDataAttrib&0x08) /*有变量要编辑,不反显，*/
					{
						model=MMI_FOCUS_NO;
					}
					else
					{
						model=MMI_FOCUS_NORMAL;
					}
				}
				else
				{
					model=MMI_FOCUS_NO; 
				}
			}
			if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/
			switch(cFieldItemAttrib)
			{
			case 0:   /*内容固定菜单*/
				fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY,model,
					(char *)(pField->lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)pField->lnVariableAddr);
				break;
			case 0x0a:   /*内容变化数据，只显示*/
				{
					DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr;
					int k;
					int num;
					if(pt->sTotalNum>(short)pField->lnMmUser)
						num=(int)pField->lnMmUser;
					else
						num=pt->sTotalNum;
					for(k=0;k<num;k++)
					{
						fmt_Printf(tForms.sFormsX/8+pField->sX,tForms.sFormsY+pField->sY+k*16,model,
							(char *)(pt->tDataFields[k].FmtStr),pt->tDataFields[k].pData);
					}
				}
				break;


				
				
			default:
				break;
			}
		}
	}
	g_sFunTimeCounter=0;  /*定时执行函数，定时统计，清屏*/
	g_sNoKeyCounter=0;  /*定时执行函数，定时统计，清屏*/
	mmi_FreshScreen(MenuNo,FieldNo);
}
/**************************************************************************
函数名称：mmi_RefreshDataMenu
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：清当前菜单覆盖的区域
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_RefreshDataMenu(void)
{

	Add_Clear_Screen();
}
/**************************************************************************
函数名称：mmi_FreshScreen
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：屏菜单刷新，根据菜单属性，刷新当前屏内容
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


void mmi_FreshScreen(unsigned char MenuNo,unsigned char FieldNo)  /*刷新当前聚焦的窗体*/
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	FORMS_DEF       *pForms;	
	static         short sFocusSaveIndex=-1; /*保存上次聚焦的数据索引*/
	unsigned char cnt;		
	pForms=&g_tScreen.tForm;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+MenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	/*有定时操作的函数，在此执行*/
	
	if(g_sFunTimeCounter++>=pField->lnMmUser)  /*没有按键时每200MS执行一次*/
	{
		g_sFunTimeCounter=0;
		if(pField->lnOnTimeFuncAddr!=0) /*主要是刷新遥信、遥测等值*/
		{
			(*pField->lnOnTimeFuncAddr)();
		}
	}
	for(cnt=1;cnt<pTable->sMenuFieldSum;cnt++)
	{
		unsigned char cFieldShowAttrib;
		unsigned char cFieldDataAttrib;
		unsigned char cFieldPositonAttrib;
		unsigned char cMenuAttrib;
		unsigned char model=MMI_FOCUS_NO; /*不反显		*/	
		pField++;
		cFieldShowAttrib=pField->sAttrib>>0&0x0f;	
		cFieldDataAttrib=pField->sAttrib>>4&0x0f;
		cFieldPositonAttrib=pField->sAttrib>>8&0x0f;		
		cMenuAttrib=pField->sAttrib>>12&0x0f;
		if(!((cFieldDataAttrib&0x02)||(cFieldShowAttrib&0x01))) continue;/*变量不需要循环刷新*/
		if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
		{
			int i,index;
			DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
			if(pt->sTotalNum==0)continue;
			if(cFieldShowAttrib&0x04)
			{
				index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
			}
			else
			{
				index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
			}
			for(i=0;i<mmi_GetShowNum(pt,(cFieldShowAttrib&0x04));i++)
			{	
				model=MMI_FOCUS_NO;
				if(i==index)  /*聚焦菜单*/
				{
					if(cnt==FieldNo) /*当前聚焦	*/
					{		
						/*pForms->pCurrentDataMenu=pt; *//*保存数据菜单结构的地址*/
						if(g_tScreen.cOldFieldNo!=FieldNo||g_tScreen.cOldMenuNo!=MenuNo||sFocusSaveIndex!=pt->sFocusIndex)  /*焦点改变*/
						{
							g_bReModify=false; /*可重新初始化，*/
							if(g_bModify) /*转换焦点前处于修改状态*/
							{
								if(fmt_GetModifyType())	
								{
									if(g_tModify.pValue!=(void*)pt->tDataFields[(int)g_tModify.index].pData)
									{
										fmt_GetModifyValue_Single();
									}
									else
									{
										fmt_GetModifyValue();
									}
								}
								/*取得修改后的值到变量中*/
								/*fmt_CursorOff();*/
								g_bModify=false;					
							}
							if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/
						
							if(cFieldShowAttrib&0x04)
							{
								fmt_Printf(pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+pt->tDataFields[i].offset*16,model,
										(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);							
							}
							else
							{
								fmt_Printf(pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+i*16,model,
										(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);							
							}
							#if 0
							if(cFieldDataAttrib&0x01) /*进入编辑状态*/
							{
								bool bedit=false;
								g_bModify=true;  /**/
								if(cFieldDataAttrib>>2&0x01)
								{
									bedit=!pt->tDataFields[i].bEdit;
								}
								fmt_InitModify(i,pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+index*16,
									(void *)pt->tDataFields[i].pData,bedit,
									(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);
								fmt_CursorOff();
								fmt_CursorOn();
							}
							#endif
							g_tScreen.cOldMenuNo=MenuNo;
							g_tScreen.cOldFieldNo=FieldNo;
							sFocusSaveIndex=pt->sFocusIndex;
						}
						#if 0
						else if(g_bReModify)  /*重新初始化一下修改数据*/
						{
							g_bReModify=false;
							if(cFieldDataAttrib&0x01) /*进入编辑状态*/
							{
								bool bedit=false;
								g_bModify=true;  /**/
								if(cFieldDataAttrib>>2&0x01)
								{
									bedit=!pt->tDataFields[i].bEdit;
								}								
								fmt_InitModify(i,pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+index*16,
									(void *)pt->tDataFields[i].pData,bedit,
									(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);
								fmt_CursorOff();
								fmt_CursorOn();
							}
						}
						#endif
						if(g_bModify)
						{	
							fmt_CursorFlush();
							continue;  /*正处于修改状态，不刷新*/
						}
						if(cFieldShowAttrib&0x01) /*当前菜单可聚焦*/
						{
							if(cFieldDataAttrib&0x09) /*有变量且只反显到变量上面*/
							{
								model=MMI_FOCUS_DATA;
							}
							else
							{
								model=MMI_FOCUS_NORMAL;
							}
						}						
					}					
					
				}
				if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/				
				if(cFieldShowAttrib&0x04)
				{
					fmt_Printf(pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+pt->tDataFields[i].offset*16,model,
						(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);
				}
				else
				{
					fmt_Printf(pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY+i*16,model,
						(char *)(pt->tDataFields[i].FmtStr),(void *)pt->tDataFields[i].pData);
				}
			}
		}
		else /*其他菜单*/
		{
			if(cnt==FieldNo)  /*当前聚焦的菜单项*/
			{
				if(g_tScreen.cOldFieldNo!=FieldNo||g_tScreen.cOldMenuNo!=MenuNo)
				{
					g_bReModify=false; /*可重新初始化，*/
					if(g_bModify) /*转换焦点前处于修改状态*/
					{
						if(fmt_GetModifyType())	fmt_GetModifyValue();
						/*取得修改后的值到变量中*/
						/*fmt_CursorOff();*/
						g_bModify=false;					
					}
					//if(cFieldDataAttrib&0x01) /*进入编辑状态*/
					if(0) /*进入编辑状态*/
					{
						g_bModify=true;  /**/
						fmt_InitModify(0xff,pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY,
							(void *)pField->lnVariableAddr,(cFieldDataAttrib>>2&0x01),
							(char *)(pField->lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)pField->lnVariableAddr);
						fmt_CursorOff();
						fmt_CursorOn();
					}
					g_tScreen.cOldMenuNo=MenuNo;
					g_tScreen.cOldFieldNo=FieldNo;
				}
				#if 0
				else if(g_bReModify)  /*重新初始化一下修改数据*/
				{
					g_bReModify=false;	
					if(cFieldDataAttrib&0x01) /*进入编辑状态*/
					{
						g_bModify=true;  /*		*/				
						fmt_InitModify(0xff,pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY,
							(void *)pField->lnVariableAddr,(cFieldDataAttrib>>2&0x01),
							(char *)(pField->lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)pField->lnVariableAddr);
						fmt_CursorOff();
						fmt_CursorOn();
					}
				}
				#endif
				if(g_bModify)
				{	
					fmt_CursorFlush();
					continue;  /*正处于修改状态，不刷新*/
				}
				if(cFieldShowAttrib&0x01) /*当前菜单可聚焦*/
				{
					if(cFieldDataAttrib&0x09) /*有变量且只反显到变量上面*/
					{
						model=MMI_FOCUS_DATA;
					}
					else
					{
						model=MMI_FOCUS_NORMAL;
					}
				}
			}
			if(cFieldShowAttrib&0x02) model=MMI_FOCUS_NORMAL; /*需要反显*/
			switch(pField->sAttrib>>12&0x0f)
			{
			case 0:   /*内容固定菜单*/
				fmt_Printf(pForms->sFormsX/8+pField->sX,pForms->sFormsY+pField->sY,model,
					(char *)(pField->lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)pField->lnVariableAddr);
				break;
			default:
				break;
			}
		}
	}
}


/**************************************************************************
函数名称：mmi_GetField
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得要求菜单对应的结构体的内容
输入参数：MenuNo,FieldNo当前菜单号及域号
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_GetField(unsigned char MenuNo,unsigned char FieldNo,MENU_FIELD_DEF *pt)
{
	
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+MenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	pField+=FieldNo;
	*pt=*pField;
}
/**************************************************************************
函数名称：mmi_GetFieldPointer
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得要求菜单对应的结构体的地址
输入参数：MenuNo,FieldNo当前菜单号及域号
输出参数：
返回值：      MenuNo,FieldNo所在菜单的结构地址

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


MENU_FIELD_DEF * mmi_GetFieldPointer(unsigned char MenuNo,unsigned char FieldNo)
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+MenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	pField+=FieldNo;
	return pField;
}
/**************************************************************************
函数名称：mmi_GetActiveFieldPara
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得当前聚焦菜单对应的结构的lnMmuser参数
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


int   mmi_GetActiveFieldPara(void)
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+g_tScreen.cActiveMenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	pField+=g_tScreen.cActiveFieldNo;
	return pField->lnMmUser;	
}

/**************************************************************************
函数名称：mmi_GetFunctionPara
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得要求菜单对应的结构的lnMmuser参数或动态菜单的索引
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


static int mmi_GetFunctionPara(MENU_FIELD_DEF *pField)
{
	int ret=0;
	DATA_MENU_DEF *pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
	if(((pField->sAttrib>>12)&0x0f)==1||((pField->sAttrib>>12)&0x0f)==5)  /*动态数据，返回焦点*/
	{
		ret=pt->sFocusIndex;
	}
	else  /*其他数据，返回*/
	{
		ret=pField->lnMmUser;
	}
	return ret;
}
/**************************************************************************
函数名称：mmi_DataMenuKeyPageUp
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：向上翻页处理
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_DataMenuKeyPageUp(DATA_MENU_DEF *pt)
{
	
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	
	if(pt->sTotalNum<=pt->sScreenNum)return;
	if((pt->sFocusIndex/pt->sScreenNum)==0)
	{
		pt->sFocusIndex=pt->sTotalNum-1;
	}
	else
	{
		pt->sFocusIndex=(pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum-1;
	}
	pm->sFocusIndex=pt->sFocusIndex;
	if(pt->GetPrevFuncAddr!=NULL)
	{
		(*pt->GetPrevFuncAddr)();   /*刷新每屏显示的数据*/
	}
	/*清除数据*/
	mmi_RefreshDataMenu();
}
/**************************************************************************
函数名称：mmi_DataMenuKeyPageDown
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：向下翻页处理
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_DataMenuKeyPageDown_ext(DATA_MENU_DEF *pt)
{
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	if(pt->sTotalNum<=pt->sScreenNum)return;
	if((pt->sFocusIndex+pt->sScreenNum)>=pt->sTotalNum)
	{
		pt->sFocusIndex=0;
	}
	else
	{
		pt->sFocusIndex+=pt->sScreenNum;
	}	
	pm->sFocusIndex=pt->sFocusIndex;
	if(pt->GetNextFuncAddr!=NULL)
	{
		(*pt->GetNextFuncAddr)();   /*刷新每屏显示的数据*/
	}
	mmi_RefreshDataMenu();
}
static void mmi_DataMenuKeyPageUp_ext(DATA_MENU_DEF *pt)
{
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	if(pt->sTotalNum<=pt->sScreenNum)return;
	if(pt->sFocusIndex<pt->sScreenNum)
	{
		pt->sFocusIndex=pt->sTotalNum-1;
	}
	else
	{
		pt->sFocusIndex-=pt->sScreenNum;
	}
	pm->sFocusIndex=pt->sFocusIndex;
	if(pt->GetPrevFuncAddr!=NULL)
	{
		(*pt->GetPrevFuncAddr)();   /*刷新每屏显示的数据*/
	}
	/*清除数据*/
	mmi_RefreshDataMenu();
}
static void mmi_DataMenuKeyPageDown(DATA_MENU_DEF *pt)
{
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	
	if(pt->sTotalNum<=pt->sScreenNum)return;
	if((pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum+pt->sScreenNum>=pt->sTotalNum)
	{
		pt->sFocusIndex=0;
	}
	else
	{
		pt->sFocusIndex=(pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum+pt->sScreenNum;
	}	
	pm->sFocusIndex=pt->sFocusIndex;
	if(pt->GetNextFuncAddr!=NULL)
	{
		(*pt->GetNextFuncAddr)();   /*刷新每屏显示的数据*/
	}
	mmi_RefreshDataMenu();
}
/**************************************************************************
函数名称：mmi_DataMenuKeyUp
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：聚焦上一行
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_DataMenuKeyUp(DATA_MENU_DEF *pt,bool bext)
{
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	if(pt->sFocusIndex<=0)
	{
		pt->sFocusIndex=pt->sTotalNum-1;
	}
	else
	{
		pt->sFocusIndex--;
	}
	pm->sFocusIndex=pt->sFocusIndex;

	if(!bext)
	{
		if((pt->sFocusIndex%pt->sScreenNum==pt->sScreenNum-1)||(pt->sFocusIndex==pt->sTotalNum-1))/*每屏的最后一个*/
		{
			if(pt->GetPrevFuncAddr!=NULL)
			{
				(*pt->GetPrevFuncAddr)();   /*刷新每屏显示的数据*/
			}
			/*清除数据*/
			if(pt->sTotalNum>pt->sScreenNum) mmi_RefreshDataMenu();
		}
	}
	else
	{
		if((pt->sFocusIndex==(g_set_disp.bgn[pt->sFocusIndex]+g_set_disp.screennum[pt->sFocusIndex]-1))||(pt->sFocusIndex==pt->sTotalNum-1))/*每屏的最后一个*/
		{
			if(pt->GetPrevFuncAddr!=NULL)
			{
				(*pt->GetPrevFuncAddr)();   /*刷新每屏显示的数据*/
			}
			/*清除数据*/
			if(pt->sTotalNum>pt->sScreenNum) mmi_RefreshDataMenu();
		}

	}
}
/**************************************************************************
函数名称：mmi_DataMenuKeyDown
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：聚焦下一行
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

static void mmi_DataMenuKeyDown(DATA_MENU_DEF *pt,bool bext)
{
	DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu; /*取得数据菜单的结构*/
	if(pt->sFocusIndex>=pt->sTotalNum-1)
	{
		pt->sFocusIndex=0;
	}
	else
	{
		pt->sFocusIndex++;
	}
	pm->sFocusIndex=pt->sFocusIndex;
	if(!bext)
	{
		if(pt->sFocusIndex%pt->sScreenNum==0)/*每屏的第一个*/
		{
			if(pt->GetNextFuncAddr!=NULL)
			{
				(*pt->GetNextFuncAddr)();   /*刷新每屏显示的数据*/
			}
			if(pt->sTotalNum>pt->sScreenNum) mmi_RefreshDataMenu();
		}
	}
	else
	{
		if(pt->sFocusIndex==g_set_disp.bgn[pt->sFocusIndex])/*每屏的第一个*/
		{
			if(pt->GetNextFuncAddr!=NULL)
			{
				(*pt->GetNextFuncAddr)();   /*刷新每屏显示的数据*/
			}
			if(pt->sTotalNum>pt->sScreenNum) mmi_RefreshDataMenu();
		}

	}
}

/**************************************************************************
函数名称：mmi_JumpStrance
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：根据函数返回值跳转处理
输入参数：strance 函数返回分支的值
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

bool mmi_JumpStrance(int strance,MENU_FIELD_DEF  *pField)
{
	
	if(strance==M_JUMP0)
	{
		if((pField->cJmp0NextMenuNumber<0xff)&&(pField->cJmp0NextFieldNumber<0x0FF))
		{
			mmi_FormsInit(pField->cJmp0NextMenuNumber,pField->cJmp0NextFieldNumber);
			return true;
		}   
	} 
	else if(strance==M_JUMP1)  /*函数返回跳转到cJmp1*/
	{
		if((pField->cJmp1NextMenuNumber<0xff)&&(pField->cJmp1NextFieldNumber<0x0FF))
		{
			mmi_FormsInit(pField->cJmp1NextMenuNumber,pField->cJmp1NextFieldNumber);
			return true;
		}
	}
	else if(strance==M_JUMP2)  /*函数返回跳转到cJmp2*/
	{
		if((pField->cJmp2NextMenuNumber<0xff)&&(pField->cJmp2NextFieldNumber<0x0FF))
		{
			mmi_FormsInit(pField->cJmp2NextMenuNumber,pField->cJmp2NextFieldNumber);
			return true;
		}
	}
	else if(strance==M_JUMP3)  /*函数返回跳转到cJmp3*/
	{
		if((pField->cJmp3NextMenuNumber<0xff)&&(pField->cJmp3NextFieldNumber<0x0FF))
		{
			mmi_FormsInit(pField->cJmp3NextMenuNumber,pField->cJmp3NextFieldNumber);
			return true;
		}
	}
	return false;
}


/**************************************************************************
函数名称：mmi_Menu_Task
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：菜单驱动处理，响应按键，刷新菜单
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


void  mmi_Menu_Task(void)
{
	int ret;
	BYTE key,lnkey;
	MENU_FIELD_DEF  tField;
	lnkey=Get_Key();
	if(g_tLcdComm.bRefresh)
	{
		g_tScreen.cOldMenuNo=-1;
		mmi_FormsInit(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo);
		g_tLcdComm.bRefresh=false;
	}
	if(CheckAutoSOE())
	{
		g_tLcdComm.tLight.light=LIGHT_ON;
		g_tLcdComm.tLight.flag=true;
		 g_tScreen.lnLightTime=dTCounter;
		g_tScreen.lnMainTime=dTCounter;		
		if(g_bVipSoe_show)
		{
			#ifdef GD_AREA_FOS_2020
				if(g_soe_info.bDpType)
				{
					g_soe_info.bDpType=false;
					mmi_FormsInit(82,1); 
				}
				else
			#endif
				{
				#ifdef ADD_DEBUG_RECORD_FUN
                    mmi_FormsInit(84,1);
				#else
					mmi_FormsInit(83,1);
			    #endif
				}
		}
		else
		{
			mmi_FormsInit(81,1);
		}
		return;
	}
	if(lnkey==NO_KEY)	 /*已有KEY_CHECK_PERIOD*10=100ms的延时*/
	{

		/*无按键操作，刷新屏幕显示*/
		if(tRunPara.dLightTime>0)
		{
			if((dTCounter-g_tScreen.lnLightTime)>tRunPara.dLightTime)  //熄灭背光
			{
				g_tLcdComm.tLight.light=LIGHT_OFF;
				g_tLcdComm.tLight.flag=true;
				g_tScreen.lnLightTime=dTCounter;
			}
		}
		if(tRunPara.dMainTime>0)
		{
			if((dTCounter-g_tScreen.lnMainTime)>tRunPara.dMainTime)  //熄灭背光
			{
				#ifdef GD_AREA_ZHUHAI_V2	
					mmd_EnterAutoMenu();
				#else
					if(g_tScreen.cActiveMenuNo!=0) // 不在主循环界面下
					{
						mmd_EnterMainMenu((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC);					
						mmi_FormsInit(0,1);
						g_tLcdComm.bLock=false; //退出主界面lock状态
						m_LockIcon[0]=' ';
						m_LockIcon[1]=0;	
					}
				#endif
				g_tScreen.lnMainTime=dTCounter;
			}
		}			
		mmi_FreshScreen(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo);
		return;			
	}	
	g_tScreen.lnLightTime=dTCounter;
	g_tScreen.lnMainTime=dTCounter;		
	key=lnkey&KE_KEY_MASK;	
	mmi_GetField(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo,&tField);		
	
	if(tField.lnOnKeyFuncAddr!=NULL&&!g_bModify) /*特殊按键处理函数，根据执行情况，确定跳转*/
	{
		ret=(*tField.lnOnKeyFuncAddr)(lnkey);
		if(mmi_JumpStrance(ret,&tField))  /*分支跳转*/
			return;  /*跳转成功，不执行下面的按键指令	*/		
	}
	switch(key)  /*对当前聚焦菜单的按键操作处理*/
	{
	case HA_KEY_RIGHT:
		if(g_bModify)  /*正处于修改状态*/
		{
			if(fmt_CursorRight())  /*处于修改状态->键移动焦点*/
			{
				#if 0
				if(g_tScreen.cActiveMenuNo==tField.cRightNextMenuNumber&&tField.cRightNextFieldNumber<0x0FF)
				{ /*同屏内跳转*/
					MENU_FIELD_DEF  *pNextField;
					DATA_MENU_DEF *pd,*ps;
					pNextField=mmi_GetFieldPointer(g_tScreen.cActiveMenuNo,tField.cRightNextFieldNumber);
					if((pNextField->sAttrib>>12&0x0f)==1||(pNextField->sAttrib>>12&0x0f)==5) /*是跳转到动态菜单*/
					{
						pd=(DATA_MENU_DEF *)pNextField->lnVariableAddr;
						if(pd->sTotalNum)  /*有要显示的内容*/
						{
							if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*跳转前也是动态菜单*/
							{
								DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu;
								ps=(DATA_MENU_DEF *)tField.lnVariableAddr;
								pd->sFocusIndex=ps->sFocusIndex;
								pm->sFocusIndex=ps->sFocusIndex;
							}
							else
							{
								pd->sFocusIndex=0;
							}
							g_tScreen.cActiveFieldNo=tField.cRightNextFieldNumber;
						}
					}
					else
					{
						g_tScreen.cActiveFieldNo=tField.cRightNextFieldNumber;
					}
				}
				#endif
			}
		}
		else
		{
			if(g_tScreen.cActiveMenuNo==tField.cRightNextMenuNumber&&tField.cRightNextFieldNumber<0x0FF)
			{ /*同屏内跳转*/
				MENU_FIELD_DEF  *pNextField;
				DATA_MENU_DEF *pd,*ps;
				pNextField=mmi_GetFieldPointer(g_tScreen.cActiveMenuNo,tField.cRightNextFieldNumber);
				if((pNextField->sAttrib>>12&0x0f)==1||(pNextField->sAttrib>>12&0x0f)==5) /*是跳转到动态菜单*/
				{
					pd=(DATA_MENU_DEF *)pNextField->lnVariableAddr;
					if(pd->sTotalNum)  /*有要显示的内容*/
					{
						if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*跳转前也是动态菜单*/
						{
							DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu;
							ps=(DATA_MENU_DEF *)tField.lnVariableAddr;
							pd->sFocusIndex=ps->sFocusIndex;
							pm->sFocusIndex=ps->sFocusIndex;
						}
						else
						{
							pd->sFocusIndex=0;
						}
						g_tScreen.cActiveFieldNo=tField.cRightNextFieldNumber;
					}
					
				}
				else
				{
					g_tScreen.cActiveFieldNo=tField.cRightNextFieldNumber;
				}
			}
			else if(tField.cRightNextMenuNumber<0xff&&tField.cRightNextFieldNumber<0x0FF)/*不同屏内跳转*/
			{
				mmi_FormsInit(tField.cRightNextMenuNumber,tField.cRightNextFieldNumber);
			}
			else if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*动态菜单处理*/
			{
				if((tField.sAttrib>>8&0x0f)&0x08) /*左右键是否需要滚屏 针对定值查阅，屏条目数不固定，特殊处理*/ 		
				{
					mmi_DataMenuKeyPageDown_ext((DATA_MENU_DEF *)tField.lnVariableAddr);
				}
				else if((tField.sAttrib>>8&0x02)==0) /*Right键是否需要滚屏*/
				{
					mmi_DataMenuKeyPageDown((DATA_MENU_DEF *)tField.lnVariableAddr);
				}
				else  //滚行
				{
					mmi_DataMenuKeyDown((DATA_MENU_DEF *)tField.lnVariableAddr,(tField.sAttrib>>0&0x04));
				}
			}	
		}
		break;
	case HA_KEY_LEFT:
		//if(g_bModify)  /*正处于修改状态*/
		if(g_bModify)  /*正处于修改状态*/
		{
			if(fmt_CursorLeft())  /*处于修改状态->键移动焦点*/
			{
					#if 0
				if(g_tScreen.cActiveMenuNo==tField.cLeftNextMenuNumber&&tField.cLeftNextFieldNumber<0x0FF)
				{ /*同屏内跳转*/
					MENU_FIELD_DEF  *pNextField;
					DATA_MENU_DEF *pd,*ps;
					pNextField=mmi_GetFieldPointer(g_tScreen.cActiveMenuNo,tField.cLeftNextFieldNumber);
					if((pNextField->sAttrib>>12&0x0f)==1||(pNextField->sAttrib>>12&0x0f)==5) /*是跳转到动态菜单*/
					{
						pd=(DATA_MENU_DEF *)pNextField->lnVariableAddr;
						if(pd->sTotalNum)  /*有要显示的内容*/
						{
							if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*跳转前也是动态菜单*/
							{
								DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu;
								ps=(DATA_MENU_DEF *)tField.lnVariableAddr;
								pd->sFocusIndex=ps->sFocusIndex;
								pm->sFocusIndex=ps->sFocusIndex;
							}
							else
							{
								pd->sFocusIndex=0;
							}
							g_tScreen.cActiveFieldNo=tField.cLeftNextFieldNumber;
						}
					}
					else
					{
						g_tScreen.cActiveFieldNo=tField.cLeftNextFieldNumber;
					}
				}
					#endif
				}
			}
		else if(((tField.sAttrib>>8&0x01)==1)&&g_tScreen.lcd_type==LCD_TYPE_6KEY)// left键当ESC键使用
		{
			if(tField.cEscNextMenuNumber<0xff&&tField.cEscNextFieldNumber<0x0FF)/*不同屏内跳转*/
			{
				mmi_FormsInit(tField.cEscNextMenuNumber,tField.cEscNextFieldNumber);
			}			
		}
		else
		{
			if(g_tScreen.cActiveMenuNo==tField.cLeftNextMenuNumber&&tField.cLeftNextFieldNumber<0x0FF)
			{ /*同屏内跳转*/
				MENU_FIELD_DEF  *pNextField;
				DATA_MENU_DEF *pd,*ps;
				pNextField=mmi_GetFieldPointer(g_tScreen.cActiveMenuNo,tField.cLeftNextFieldNumber);
				if((pNextField->sAttrib>>12&0x0f)==1||(pNextField->sAttrib>>12&0x0f)==5) /*是跳转到动态菜单*/
				{
					pd=(DATA_MENU_DEF *)pNextField->lnVariableAddr;
					if(pd->sTotalNum)  /*有要显示的内容*/
					{
						if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*跳转前也是动态菜单*/
						{
							DATA_MENU_DEF *pm=g_tScreen.tForm.pCurrentDataMenu;
							ps=(DATA_MENU_DEF *)tField.lnVariableAddr;
							pd->sFocusIndex=ps->sFocusIndex;
							pm->sFocusIndex=ps->sFocusIndex;
						}
						else
						{
							pd->sFocusIndex=0;
						}
						g_tScreen.cActiveFieldNo=tField.cLeftNextFieldNumber;
					}
				}
				else
				{
					g_tScreen.cActiveFieldNo=tField.cLeftNextFieldNumber;
				}
			}
			else if(tField.cLeftNextMenuNumber<0xff&&tField.cLeftNextFieldNumber<0x0FF)/*不同屏内跳转*/
			{
				mmi_FormsInit(tField.cLeftNextMenuNumber,tField.cLeftNextFieldNumber);
			}
			else if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*动态菜单处理*/
			{
				if((tField.sAttrib>>8&0x0f)&0x08) /*左右键是否需要滚屏 针对定值查阅，屏条目数不固定，特殊处理*/ 		
				{
					mmi_DataMenuKeyPageUp_ext((DATA_MENU_DEF *)tField.lnVariableAddr);
				}
				else if((tField.sAttrib>>8&0x02)==0) /*Left键是否需要滚屏*/
				{
					mmi_DataMenuKeyPageUp((DATA_MENU_DEF *)tField.lnVariableAddr);
				}
				else  //滚行
				{
					mmi_DataMenuKeyUp((DATA_MENU_DEF *)tField.lnVariableAddr,(tField.sAttrib>>0&0x04));
				}
			}
		}
		break;
	case HA_KEY_UP:
		if(g_bModify&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)  /*正处于修改状态，且不是9键*/
		{
			fmt_CursorAdd();
			if(tField.lnOnKeyFuncAddr!=NULL) /*检查是否有需要执行函数，主要是下拉菜单使用*/
			{
				ret=(*tField.lnOnKeyFuncAddr)(key);					
				if(ret==M_OK) // 需要刷新屏幕
				{
					unsigned char cFieldDataAttrib;
					unsigned char cMenuAttrib;
					unsigned char  cFieldShowAttrib;
					cFieldShowAttrib=tField.sAttrib>>0&0x0f;
					cFieldDataAttrib=tField.sAttrib>>4&0x0f;
					cMenuAttrib=tField.sAttrib>>12&0x0f;
					//mmi_FormsInit(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo);						
					if(cFieldDataAttrib&0x01) /*可进入编辑状态*/
					{
						if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
						{
							DATA_MENU_DEF *pt=(DATA_MENU_DEF *)tField.lnVariableAddr; /*取得数据菜单的结构*/							
							int index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
							
							if(cFieldShowAttrib&0x04)
							{
								index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
								fmt_InitModify(index,tField.sX,tField.sY+pt->tDataFields[index].offset*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}
							else
							{
								fmt_InitModify(index,tField.sX,tField.sY+index*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}

						}
						else
						{
							fmt_InitModify(0xff,tField.sX,tField.sY,
								(void *)tField.lnVariableAddr,(cFieldDataAttrib>>2&0x01),
								(char *)(tField.lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)tField.lnVariableAddr);
						}
						fmt_CursorOff();
						fmt_CursorOn();
						g_bModify=g_tModify.bModify;  /**/
					}
				}
			}
		}
		else if(g_tScreen.cActiveMenuNo==tField.cUpNextMenuNumber&&tField.cUpNextFieldNumber<0x0FF)
		{ /*同屏内跳转*/
			g_tScreen.cActiveFieldNo=tField.cUpNextFieldNumber;
		}
		else if(tField.cUpNextMenuNumber<0xff&&tField.cUpNextFieldNumber<0x0FF)/*不同屏内跳转*/
		{
			mmi_FormsInit(tField.cUpNextMenuNumber,tField.cUpNextFieldNumber);
		}
		else if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*动态菜单处理*/
		{
			if((tField.sAttrib>>8&0x0f)&0x08) /*上下键是否需要滚屏 针对定值查阅，屏条目数不固定，特殊处理*/			
			{
				mmi_DataMenuKeyPageUp_ext((DATA_MENU_DEF *)tField.lnVariableAddr);
			}
			else if((tField.sAttrib>>8&0x0f)&0x04)  /*上下键为翻屏键*/
			{
				mmi_DataMenuKeyPageUp((DATA_MENU_DEF *)tField.lnVariableAddr);
			}
			else
			{
				mmi_DataMenuKeyUp((DATA_MENU_DEF *)tField.lnVariableAddr,(tField.sAttrib>>0&0x04));
			}
		}
		break;
	case HA_KEY_DOWN:
		if(g_bModify&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)  /*正处于修改状态，且不是9键*/
		{
			fmt_CursorSubb();
			if(tField.lnOnKeyFuncAddr!=NULL) /*检查是否有需要执行函数，主要是下拉菜单使用*/
			{
				ret=(*tField.lnOnKeyFuncAddr)(key);					
				if(ret==M_OK) // 需要刷新屏幕
				{
					unsigned char cFieldDataAttrib;
					unsigned char cMenuAttrib;					
					unsigned char  cFieldShowAttrib;
					cFieldDataAttrib=tField.sAttrib>>4&0x0f;
					cMenuAttrib=tField.sAttrib>>12&0x0f;
					cFieldShowAttrib=tField.sAttrib>>0&0x0f;
					if(cFieldDataAttrib&0x01) /*可进入编辑状态*/
					{
						if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
						{
							DATA_MENU_DEF *pt=(DATA_MENU_DEF *)tField.lnVariableAddr; /*取得数据菜单的结构*/	
							int index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
							if(cFieldShowAttrib&0x04)
							{
								index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
								fmt_InitModify(index,tField.sX,tField.sY+pt->tDataFields[index].offset*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}
							else
							{							
								fmt_InitModify(index,tField.sX,tField.sY+index*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}

						}
						else
						{
							fmt_InitModify(0xff,tField.sX,tField.sY,
								(void *)tField.lnVariableAddr,(cFieldDataAttrib>>2&0x01),
								(char *)(tField.lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)tField.lnVariableAddr);
						}
						fmt_CursorOff();
						fmt_CursorOn();
						g_bModify=g_tModify.bModify;  /**/
					}
				}
			}				
		}
		else if(g_tScreen.cActiveMenuNo==tField.cDownNextMenuNumber&&tField.cDownNextFieldNumber<0x0FF)
		{ /*同屏内跳转*/
			g_tScreen.cActiveFieldNo=tField.cDownNextFieldNumber;
		}
		else if(tField.cDownNextMenuNumber<0xff&&tField.cDownNextFieldNumber<0x0FF)/*不同屏内跳转*/
		{
			mmi_FormsInit(tField.cDownNextMenuNumber,tField.cDownNextFieldNumber);
		}
		else if((tField.sAttrib>>12&0x0f)==1||(tField.sAttrib>>12&0x0f)==5) /*动态菜单处理*/
		{
			if((tField.sAttrib>>8&0x0f)&0x08) /*上下键是否需要滚屏 针对定值查阅，屏条目数不固定，特殊处理*/			
			{
				mmi_DataMenuKeyPageDown_ext((DATA_MENU_DEF *)tField.lnVariableAddr);
			}
			else if((tField.sAttrib>>8&0x0f)&0x04)  /*上下键为翻屏键*/
			{
				mmi_DataMenuKeyPageDown((DATA_MENU_DEF *)tField.lnVariableAddr);
			}
			else
			{
				mmi_DataMenuKeyDown((DATA_MENU_DEF *)tField.lnVariableAddr,(tField.sAttrib>>0&0x04));
			}
		}					
		break;
	case HA_KEY_ADD:			
		if(g_bModify)  /*正处于修改状态*/
		{
			fmt_CursorAdd();
			if(tField.lnOnKeyFuncAddr!=NULL) /*检查是否有需要执行函数，主要是下拉菜单使用*/
			{
				ret=(*tField.lnOnKeyFuncAddr)(key);					
				if(ret==M_OK) // 需要刷新屏幕
				{
					unsigned char cFieldDataAttrib;
					unsigned char cMenuAttrib;
					unsigned char  cFieldShowAttrib;
					cFieldShowAttrib=tField.sAttrib>>0&0x0f;
					cFieldDataAttrib=tField.sAttrib>>4&0x0f;
					cMenuAttrib=tField.sAttrib>>12&0x0f;
					//mmi_FormsInit(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo);						
					if(cFieldDataAttrib&0x01) /*可进入编辑状态*/
					{
						if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
						{
							DATA_MENU_DEF *pt=(DATA_MENU_DEF *)tField.lnVariableAddr; /*取得数据菜单的结构*/							
							int index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
							
							if(cFieldShowAttrib&0x04)
							{
								index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
								fmt_InitModify(index,tField.sX,tField.sY+pt->tDataFields[index].offset*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}
							else
							{
								fmt_InitModify(index,tField.sX,tField.sY+index*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}

						}
						else
						{
							fmt_InitModify(0xff,tField.sX,tField.sY,
								(void *)tField.lnVariableAddr,(cFieldDataAttrib>>2&0x01),
								(char *)(tField.lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)tField.lnVariableAddr);
						}
						fmt_CursorOff();
						fmt_CursorOn();
						g_bModify=g_tModify.bModify;  /**/
					}
				}
			}
		}
		break;
	case HA_KEY_SUB:
		if(g_bModify)  /*正处于修改状态*/
		{
			fmt_CursorSubb();
			if(tField.lnOnKeyFuncAddr!=NULL) /*检查是否有需要执行函数，主要是下拉菜单使用*/
			{
				ret=(*tField.lnOnKeyFuncAddr)(key);					
				if(ret==M_OK) // 需要刷新屏幕
				{
					unsigned char cFieldDataAttrib;
					unsigned char cMenuAttrib;					
					unsigned char  cFieldShowAttrib;
					cFieldDataAttrib=tField.sAttrib>>4&0x0f;
					cMenuAttrib=tField.sAttrib>>12&0x0f;
					cFieldShowAttrib=tField.sAttrib>>0&0x0f;
					if(cFieldDataAttrib&0x01) /*可进入编辑状态*/
					{
						if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
						{
							DATA_MENU_DEF *pt=(DATA_MENU_DEF *)tField.lnVariableAddr; /*取得数据菜单的结构*/	
							int index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
							if(cFieldShowAttrib&0x04)
							{
								index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
								fmt_InitModify(index,tField.sX,tField.sY+pt->tDataFields[index].offset*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}
							else
							{							
								fmt_InitModify(index,tField.sX,tField.sY+index*16,
									(void *)pt->tDataFields[index].pData,false,
									(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
							}

						}
						else
						{
							fmt_InitModify(0xff,tField.sX,tField.sY,
								(void *)tField.lnVariableAddr,(cFieldDataAttrib>>2&0x01),
								(char *)(tField.lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)tField.lnVariableAddr);
						}
						fmt_CursorOff();
						fmt_CursorOn();
						g_bModify=g_tModify.bModify;  /**/
					}
				}
			}				
		}
		break;
	case HA_KEY_ESC:
#if 0
		if(g_bModify)  /*处于修改状态则退出修改状态*/
		{
			g_bModify=false;
		}
		#endif
		if(g_tScreen.cActiveMenuNo==tField.cEscNextMenuNumber&&tField.cEscNextFieldNumber<0x0FF)
		{ /*同屏内跳转*/
			g_tScreen.cActiveFieldNo=tField.cEscNextFieldNumber;
		}
		else if(tField.cEscNextMenuNumber<0xff&&tField.cEscNextFieldNumber<0x0FF)/*不同屏内跳转*/
		{
			mmi_FormsInit(tField.cEscNextMenuNumber,tField.cEscNextFieldNumber);
		}
#if 0
		else 
		{
			/*取得窗体属性定义*/
			unsigned short attrib=mmi_GetActiveFormsAttrib(); /*当前菜单的属性*/
			if(attrib>>12&0x08) /*是弹出式窗体*/
			{
				mmi_ExitPopMenu(ALL_FORMS);/*退出所有动态窗体*/
			}
		}
#endif
		break;
	case HA_KEY_ENTER:
		{
			bool bFunction=true;
			unsigned char cFieldShowAttrib;
			unsigned char cFieldDataAttrib;
			unsigned char cFieldPositonAttrib;
			unsigned char cMenuAttrib;
			cFieldShowAttrib=tField.sAttrib>>0&0x0f;	
			cFieldDataAttrib=tField.sAttrib>>4&0x0f;
			cFieldPositonAttrib=tField.sAttrib>>8&0x0f;		
			cMenuAttrib=tField.sAttrib>>12&0x0f;
			if(cFieldDataAttrib&0x01) /*可进入编辑状态*/
			{
				if(g_bModify)
				{			
					fmt_GetModifyValue();
					g_bModify=false;					
				}
				else
				{
					if(cMenuAttrib==1||cMenuAttrib==5) /*内容变化菜单*/
					{
						DATA_MENU_DEF *pt=(DATA_MENU_DEF *)tField.lnVariableAddr; /*取得数据菜单的结构*/							
						int index=pt->sFocusIndex%pt->sScreenNum; /*聚焦菜单的偏移*/
						bool bedit=false;
						if(cFieldDataAttrib>>2&0x01)
						{
							bedit=!pt->tDataFields[index].bEdit;
						}
						if(cFieldShowAttrib&0x04)
						{
							if(cFieldShowAttrib&0x04)
							{
								index=pt->sFocusIndex-g_set_disp.bgn[pt->sFocusIndex];
							}
							fmt_InitModify(index,tField.sX,tField.sY+pt->tDataFields[index].offset*16,
								(void *)pt->tDataFields[index].pData,false,
								(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
						}
						else
						{
							fmt_InitModify(index,tField.sX,tField.sY+index*16,
								(void *)pt->tDataFields[index].pData,false,
								(char *)(pt->tDataFields[index].FmtStr),(void *)pt->tDataFields[index].pData);
						}

					}
					else
					{
						fmt_InitModify(0xff,tField.sX,tField.sY,
							(void *)tField.lnVariableAddr,(cFieldDataAttrib>>2&0x01),
							(char *)(tField.lnFormatStringAddr+FLASH_DATA_ADDRESS),(void *)tField.lnVariableAddr);
					}
					fmt_CursorOff();
					fmt_CursorOn();
					g_bModify=g_tModify.bModify;  /**/
					bFunction=false;
				}
			}
			{
				bool bErase=true;
				bool bStrance=true;
				if(tField.lnSetFuncAddr!=NULL&&bFunction) /*执行函数*/
				{
					int para=mmi_GetFunctionPara(&tField);
				ret=(*tField.lnSetFuncAddr)(para);
				if(mmi_JumpStrance(ret,&tField))  /*分支跳转*/
				{
					bStrance=false;
					bErase=false;  /**/
				}
				else
				{
					g_tScreen.cOldFieldNo=255;
					g_tScreen.cOldMenuNo=255;
				}
			}
			if(bStrance)
			{
				if(g_tScreen.cActiveMenuNo==tField.cEnterNextMenuNumber&&tField.cEnterNextFieldNumber<0x0FF)
				{ /*同屏内跳转*/
					g_tScreen.cActiveFieldNo=tField.cEnterNextFieldNumber;
					bErase=false;
				}
				else if(tField.cEnterNextMenuNumber<0xff&&tField.cEnterNextFieldNumber<0x0FF)/*不同屏内跳转*/
				{
					mmi_FormsInit(tField.cEnterNextMenuNumber,tField.cEnterNextFieldNumber);
					bErase=false;
				}	
			}
		}
		break;
		}
	case HA_KEY_RST:
	#ifdef GD_TEST_2021
		ResetHzLed(0);
		SignalReset(0,true);
	#else
		ResetHzLed(0);
		SignalReset(0,true);
		g_run_stu.button_on=true;
		if(pRunSet->bTT_RstUnlock)  //复归按钮解锁闭锁
		{
			g_run_stu.rmtjs=true;
		}	
	#endif		
		break;	
	case HA_KEY_YUK:
		//if(g_run_stu.mb_yuk!=INDEX_INVALLID)
		if(!g_run_stu.yf)
		{
			g_run_stu.mb_yuk=true;
		}
		
		break;
	case HA_KEY_HZ:
		
		if(g_run_stu.mb_yuk==true)//g_run_stu.mb_hz!=INDEX_INVALLID&&
		{
			g_run_stu.mb_hz=true;
			//pR->run_stu.sw_sh = true;
			g_run_stu.mb_yuk=false;
		}
		break;	
	case HA_KEY_FZ:
		
		if(g_run_stu.mb_yuk==true)//g_run_stu.mb_fz!=INDEX_INVALLID&&
		{
			g_run_stu.mb_fz=true;
			//pR->run_stu.sw_sf = true;
			g_run_stu.mb_yuk=false;
		}
		break;
	default:
		break;
	}
	mmi_FreshScreen(g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo); /*有	*/		
	
}


/**************************************************************************
函数名称：mmi_GetMenuData
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得当前聚焦的菜单结构
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

DATA_MENU_DEF *mmi_GetMenuData(void)
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	DATA_MENU_DEF *pt;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+g_tScreen.cActiveMenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址	*/
	pField+=g_tScreen.cActiveFieldNo; /*当前菜单*/
	
	if((pField->sAttrib>>12&0x0f)==1||(pField->sAttrib>>12&0x0f)==5) /*是动态菜单*/
	{
		pt=(DATA_MENU_DEF *)pField->lnVariableAddr; /*取得数据菜单的结构*/
	}
	else
	{
		pt=NULL;
	}
	return pt;
}
/**************************************************************************
函数名称：mmi_GetScreenNum
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取得定义菜单的屏能显示的数目
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/


int mmi_GetScreenNum(unsigned char MenuNo,unsigned char FieldNo)
{
	
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+MenuNo; /*0x0000  MenuFieldStart[]起使地址*/
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  /*0x0414 开始显示的菜单地址*/	
	pField+=FieldNo;
	return (pField->lnMmUser);
}
/**************************************************************************
函数名称：mmi_GetFloatFactor
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取浮点数的的显示类型
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

BYTE mmi_GetFloatFactor(void *pdat)
{

	BYTE 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;
}

/**************************************************************************
函数名称：mmi_GetActiveFieldIndex
函数版本：1.00 
作者：   
创建日期：2008.9.1     
函数功能说明：取当前聚焦的菜单 偏移值
输入参数：
输出参数：
返回值：

更新信息：
更新日志1：
日期：	  
修改者：	  
修改内容：  
修改原因：
***************************************************************************/

int mmi_GetActiveFieldIndex(void)
{
	MENU_FIELD_DEF  *pField;
	MENU_TABLE_DEF  *pTable;
	DATA_MENU_DEF *pt;
	pTable=(MENU_TABLE_DEF *)MENU_TABLE_ADDR+g_tScreen.cActiveMenuNo; //0x0000  MenuFieldStart[]起使地址
	pField=(MENU_FIELD_DEF  *)MENU_DATA_ADDR+((uint32_t)(pTable->sMenuFieldStart));  //0x0414 开始显示的菜单地址	
	pField+=g_tScreen.cActiveFieldNo; //当前菜单

	if((pField->sAttrib>>12&0x0f)==1||(pField->sAttrib>>12&0x0f)==5) //是动态菜单
	{
		pt=(DATA_MENU_DEF *)pField->lnVariableAddr; //取得数据菜单的结构
		return pt->sFocusIndex;
	}
	return 0;
}


/******************endfile********************************/



