/******************************************************************** 版权所有: 文件版本: 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)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;cntsMenuFieldSum;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;cntsMenuFieldSum;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;isX,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;ksX,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;cntsMenuFieldSum;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;ipCurrentDataMenu=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->sFocusIndexsScreenNum) { 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) { if(g_soe_info.bDpType) { g_soe_info.bDpType=false; mmi_FormsInit(82,1); } else { #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) //熄灭背光 { 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; } 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: ResetHzLed(0); SignalReset(0,true); 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********************************/