//将一个页面从当前页面切换为非当前页面时调用的函数 //SubPage==TRUE表示即将进入的是子页面 static SYS_MSG OldPageClean(INPUT_EVT_TYPE EventType,u8 NewPageIndex) { SYS_MSG SysMsg=SM_State_Faile; u8 LayerNum; Input_Debug("%s : Clean %s\n\r",__FUNCTION__,gpCurrentPage->Name); switch(EventType) { case Input_GotoSubPage://进入子页面 SysMsg=gpCurrentPage->SysEvtHandler(Sys_PreSubPage,GetRegIdByIdx(NewPageIndex), (void *)GetPageByIdx(NewPageIndex)); break; case Input_SubPageReturn: //从子页面返回 case Input_SubPageTranslate://子页面切换 SysMsg=gpCurrentPage->SysEvtHandler(Sys_PageClean,GetRegIdByIdx(NewPageIndex), (void *)GetPageByIdx(NewPageIndex)); break; case Input_GotoNewPage://进入新页面 LayerNum=GetCurLayerNum(); for(;LayerNum;LayerNum--)//对上一级页面逐个处理 { SysMsg|=Q_GetPageByLayer(LayerNum)->SysEvtHandler(Sys_PageClean,GetRegIdByIdx(NewPageIndex), (void *)GetPageByIdx(NewPageIndex)); } break; } Input_Debug("%s end: Clean %s\n\r",__FUNCTION__,gpCurrentPage->Name); return SysMsg; }
//ͨ��ҳ��������ҳ���RegID //�����ڲ���ΪNULL�ص�ǰҳ���RegID PAGE_RID Q_FindRidByPageName(u8 *PageName) { u8 PageIdx; if((PageName==NULL)||(PageName[0]==0)) { return GetRegIdByIdx(GetPageIdxByTrack(0)); } for(PageIdx=0;PageIdx<gPageTotal;PageIdx++) { if(strcmp((void *)PageName,(void *)GetPageByIdx(PageIdx)->Name)) continue; else return GetRegIdByIdx(PageIdx);//�ҵ�ָ����ҳ���� } Debug("No Such Page PageName:%s ,may be this is a RID\n\r",PageName); return PRID_Null; }
//通过pPageIdx返回找到的页面在AllPage中的索引 SYS_MSG FindPage(u8 *Name, PAGE_RID RegID,u8 *pPageIdx) { u8 PageIdx; if(Name&&Name[0]) { //用page name进行查找 for(PageIdx=0;PageIdx<PAGE_TOTAL;PageIdx++) { if(strcmp((void *)Name,(void *)GetPageByIdx(PageIdx)->Name)) continue; else break;//找到指定的页面了 } if(PageIdx==PAGE_TOTAL) //没找到指定的页面 { Debug("No Such Page Name:%s ,may be you don't push it to AllPage.h\n\r",Name); return SM_State_Faile; } } else if(RegID) { //用唯一的RegID进行查找 for(PageIdx=0;PageIdx<PAGE_TOTAL;PageIdx++) { if(RegID!=GetRegIdByIdx(PageIdx)) continue; else break;//找到了 } if(PageIdx==PAGE_TOTAL) //没找到指定的页面 { Debug("No Such Page RegID:%d\n\r",RegID); return SM_State_Faile; } } else return SM_State_Faile; *pPageIdx=PageIdx; return SM_State_OK; }
static SYS_MSG GotoPageHandler(INPUT_EVT_TYPE EventType,u16 PageIdx,int IntParam, void *pSysParam) { u32 TimeMsRecord; u8 i; OS_DeclareCritical(); //关闭触摸和外部按键输入,保证在换页面或者程序的过程中忽略所有输入 Q_DisableInput(); //在无输入状态下Clean页面 if(gpCurrentPage) { if((!(gCurrSysMsg&SM_NoPageClean)) //Q_GotoPage返回值告诉系统不要执行Sys_PageClean或Sys_PreSubPage事件 && (GetPageByIdx(PageIdx)->Type != POP_PAGE)) //如果是pop页面,也不需要clean gCurrSysMsg|=OldPageClean(EventType,PageIdx); Debug("∧∧∧∧∧∧ Leave %s ∧∧∧∧∧∧\n\r",gpCurrentPage->Name); } else //没有上一个页面 { } //4--------------------------数据处理----------------------------- OS_EnterCritical();//目前,只有一个线程操作这些全局变量,所以临界区并不是必须的。 //记录页面Tarck InsertPageTrack(PageIdx); //记录页面层级 if(EventType==Input_GotoSubPage) //如果是进入子页面 { PushPageCtrlObjData();//保存前层的数据内容 CleanPageCtrlObjData();//清除页面数据 InsertPageLayer(PageIdx);//增加一层 } else if(EventType==Input_SubPageReturn) { DeletePageLayer(1);//删除一层 PopPageCtrlObjData(FALSE);//还原前层的数据内容 } else if(EventType==Input_GotoNewPage) { DeletePageLayer(0xff);//删除所有层 PopPageCtrlObjData(TRUE);//删除所有存储的数据内容 CleanPageCtrlObjData();//清除页面数据 InsertPageLayer(PageIdx);//增加一层 //页面堆检查 if(gPageHeapRecord) { Debug("gPageHeapRecord:%d\n\r",gPageHeapRecord); Q_ErrorStopScreen("!!!Warnning!!! Page momery don't be freed!"); } } else if(EventType==Input_SubPageTranslate) { DeletePageLayer(1);//删除一层 CleanPageCtrlObjData();//清除页面数据 InsertPageLayer(PageIdx);//增加一层 } //更换主指针 gpCurrentPage=Q_GetPageByTrack(0); gEntriesOfPage[PageIdx]++;//进页面一次自加一次 PageSwithcCtrlObjDataHandler(gpCurrentPage);//控件数据处理 OS_ExitCritical(); //4-------------------------数据处理完成-------------------------- TimeMsRecord=OS_GetCurrentSysMs(); Debug("\n\r∨∨∨∨∨∨ Goto %s ∨∨∨∨∨∨\n\r",gpCurrentPage->Name); Debug("##Author:%s\n\r",gpCurrentPage->Author); Debug("##Description:%s\n\r",gpCurrentPage->Description); Debug("##Page Layers:"); for(i=1;i<GetCurLayerNum();i++) Debug("%s->",GetPageByIdx(PageLayers[i])->Name); Debug("%s\n\r",GetPageByIdx(PageLayers[i])->Name); if((!(gCurrSysMsg&SM_NoPageInit)) //Q_GotoPage返回值告诉系统不要执行page init &&(Q_GetPageByTrack(1)->Type!=POP_PAGE)) //从pop页面返回,也不需要page init gCurrSysMsg|=CurrentPageInit(EventType,IntParam,pSysParam); if((!(gCurrSysMsg&SM_NoTouchInit))//Q_GotoPage或页面SystemEventHandler函数返回值告诉系统不需要touch init &&(Q_GetPageByTrack(1)->Type!=POP_PAGE)) //从pop页面返回,也不需要touch init gCurrSysMsg|=CurrPageCtrlObjInit(EventType,IntParam,pSysParam); if(!(gCurrSysMsg&SM_NoPopReturn)//从前面的函数返回掩码 &&(Q_GetPageByTrack(1)->Type==POP_PAGE))//前一个页面是pop页面 gCurrSysMsg|=gpCurrentPage->SysEvtHandler(Sys_PopPageReturn,IntParam,pSysParam); switch(GetRegIdByIdx(GetPageIdxByTrack(1)))//判断从哪个页面返回 { case PRID_NumCtrlObjPage: //从num控件页返回 { NUM_CTRL_OBJ *pNumCtrlObj=pSysParam; if(gpCurrentPage->NumCtrlObjHander) gpCurrentPage->NumCtrlObjHander(pNumCtrlObj->ObjID,pNumCtrlObj->Value,pSysParam); else Debug("!!!Not Define Handler Function In Page Struct!!!\n\r"); }break; case PRID_StrCtrlObjPage: //从Str控件页返回 { STR_CTRL_OBJ *pStrCtrlObj=pSysParam; STR_BOX_OBJ *pStrBoxObj=pSysParam; STR_ENUM_OBJ *pStrEnumObj=pSysParam; if(gpCurrentPage->StrCtrlObjHandler) { if(pStrCtrlObj->Type == SCOT_StrBox) gpCurrentPage->StrCtrlObjHandler(pStrBoxObj->ObjID,0,pStrBoxObj->pStrBuf,pSysParam); else if(pStrCtrlObj->Type == SCOT_StrEnum) gpCurrentPage->StrCtrlObjHandler(pStrEnumObj->ObjID,pStrEnumObj->pStrEnumBuf[pStrEnumObj->Idx],&pStrEnumObj->pStrEnumBuf[pStrEnumObj->Idx+1],pSysParam); } else Debug("!!!Not Define Handler Function In Page Struct!!!\n\r"); }break; defalut: while((OS_GetCurrentSysMs()-TimeMsRecord)<300) OS_TaskDelayMs(50);//循环延时300ms,以避免触摸响应混乱 } Q_EnableInput(); Input_Debug("%s end: %s\n\r",__FUNCTION__,gpCurrentPage->Name); return gCurrSysMsg; }
//�õ�ָ�����ҳ��ָ�� //LayerNum=1,�õ����� //LayerNum=2,�õ��ڶ��� const PAGE_ATTRIBUTE *Q_GetPageByLayer(u8 LayerNum) { return GetPageByIdx(GetPageIdxByLayer(LayerNum)); }
//LayerOffset=0,���ص�ǰҳ��ָ�� //LayerOffset=1,������һ��ҳ��ָ�� const PAGE_ATTRIBUTE *Q_GetPageByLayerOffset(u8 LayerOffset) { return GetPageByIdx(GetPageIdxByLayerOffset(LayerOffset)); }
//ָ����Ե�ǰҳ��ĺۼ�ƫ��ֵ������ҳ��ָ�� //��GetPageByTrack(0)���ص�ǰҳ��ָ�� //Q_GetPageByTrack(1)����ǰһҳ��ָ�� const PAGE_ATTRIBUTE *Q_GetPageByTrack(u8 Local) { return GetPageByIdx(GetPageIdxByTrack(Local)); }
//ת��ijҳ��,���ô˺�����InputHandler���߳�����ɵ�ǰ����Ὺʼת������ //return TRUE :����ת�� //return FALSE : ������ת�� //ҳ����ҳ��֮��IJ������ݿ���pInfoParamָ�� SYS_MSG Q_GotoPage(PAGE_ACTION PageAction, u8 *Name, int IntParam, void *pSysParam) { INPUT_EVENT InEventParam; u8 PageIdx; u8 Result; if(GetCurrPage()) UA_Debug("%s : %s->%s\n\r",__FUNCTION__,GetCurrPage()->Name,Name); else UA_Debug("%s : NULL->%s\n\r",__FUNCTION__,Name); //���Ҷ�Ӧҳ�� if(PageAction==SubPageReturn) //�������ҳ�淵�أ����ҵ���һ��ҳ�� { gCurrSysMsg=SM_State_OK; PageIdx=GetPageIdxByLayerOffset(1); } else { gCurrSysMsg=FindPage(Name,0,&PageIdx);//��ʼ��ҳ��ش���Ϣ if(gCurrSysMsg!=SM_State_OK)//û�ҵ���Ӧҳ�� { return gCurrSysMsg; } } if(GetPageByIdx(PageIdx)->Type==POP_PAGE)//Ҫ�����ҳ����popҳ�� if((PageAction!=GotoSubPage)&&(PageAction!=SubPageReturn)) { Q_ErrorStopScreen("Pop Page not allow entry by \"GotoNewPage\" & \"SubPageTranslate\" param!"); return SM_State_Faile; } //POPҳ��ֻ��������ҳ�淵�ص���ʽ�˳� if((Q_GetPageByTrack(0)->Type==POP_PAGE)&&(PageAction!=SubPageReturn)) { Q_ErrorStopScreen("Pop Page only allow quit by \"SubPageReturn\" param!"); return SM_State_Faile; } if(Q_GetPageByTrack(0)->Type!=POP_PAGE) //�����popҳ�淵�أ���ô����Ҫִ�����goto case gCurrSysMsg=GetPageByIdx(PageIdx)->SysEvtHandler(Sys_PreGotoPage, IntParam,pSysParam); //Debug("GotoPage Return 0x%x\n\r",SysMsg); if(gCurrSysMsg&SM_NoGoto)//ҳ���Sys_Goto_Page���ݻص���Ϣ {//��ҳ���Sys_PreGotoPage���ݻ�SM_NoGoto��Ϣ��ʾ����Ҫ�����ҳ���ˡ� return gCurrSysMsg; } else { InEventParam.uType=Sync_Type; switch(PageAction) { case GotoNewPage: InEventParam.EventType=Input_GotoNewPage;break; case GotoSubPage: InEventParam.EventType=Input_GotoSubPage;break; case SubPageReturn: InEventParam.EventType=Input_SubPageReturn;break; } InEventParam.Num=PageIdx; InEventParam.Info.SyncInfo.IntParam=IntParam; InEventParam.Info.SyncInfo.pParam=pSysParam; //Debug("New Page Index:%d\n\r",PageIdx); if((Result=OS_MsgBoxSend(gInputHandler_Queue,&InEventParam,100,FALSE))==OS_ERR_NONE) { return gCurrSysMsg; } else { Debug("GotoPage Send Msg Error!%d\n\r",Result); return SM_State_Faile; } } }