//�鿴ϵͳ�¼� //���RegIDΪ0�����ص�ǰҳ����¼���־ INSPECT_SYSEVT_RET Q_InspectPeripEvt(PAGE_RID RegID,PERIP_EVT PeripEvt) { u8 PageIdx; if(RegID) { if(FindPage("",RegID,&PageIdx)!=SM_State_OK) return NoHasSysEvt;//�˴�״̬��ʧ�� } else //���RegIDΪ0�����ص�ǰҳ����¼���־ { PageIdx=GetPageIdxByTrack(0); } if(ReadBit(gPagePeripEvtFlag[PageIdx],PeripEvt)) return HasPagePeripEvt; if(ReadBit(gGobalPeripEvtBitFlag,PeripEvt)) return HasGobalSysEvt; return NoHasSysEvt; }
//ͨ��ҳ��������ҳ���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; }
//�ر�ϵͳ�¼���־ void Q_DisablePeripEvt(PAGE_RID RegID,PERIP_EVT PeripEvt) { u8 PageIdx; OS_DeclareCritical(); if(RegID) { if(FindPage("",RegID,&PageIdx)!=SM_State_OK) return;//�˴�״̬��ʧ�� } else //���RegIDΪ0�����ص�ǰҳ����¼���־ { PageIdx=GetPageIdxByTrack(0); } OS_EnterCritical(); ClrBit(gPagePeripEvtFlag[PageIdx],PeripEvt); OS_ExitCritical(); }
//���ϵͳ�¼���Ӧλ void Q_ClrPeripEvt(PAGE_RID RegID,u32 PeripEvtCon) { u8 PageIdx; OS_DeclareCritical(); if(RegID) { if(FindPage("",RegID,&PageIdx)!=SM_State_OK) return;//�˴�״̬��ʧ�� } else //���RegIDΪ0�����ص�ǰҳ����¼���־ { PageIdx=GetPageIdxByTrack(0); } OS_EnterCritical(); gPagePeripEvtFlag[PageIdx]&=PeripEvtCon; OS_ExitCritical(); }
//����ϵͳ�¼���Ӧλ void Q_SetPeripEvt(PAGE_RID RegID,u32 PeripEvtCon) { u8 PageIdx; OS_DeclareCritical(); if(RegID) { if(FindPage("",RegID,&PageIdx)!=SM_State_OK) //�˴�״̬��ʧ� { Q_ErrorStopScreen("Can't find page!\n\r"); } } else //���RegIDΪ0�����ص�ǰҳ����¼���־ { PageIdx=GetPageIdxByTrack(0); } OS_EnterCritical(); gPagePeripEvtFlag[PageIdx]|=PeripEvtCon; OS_ExitCritical(); }
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; }
//ָ����Ե�ǰҳ��ĺۼ�ƫ��ֵ������ҳ��ָ�� //��GetPageByTrack(0)���ص�ǰҳ��ָ�� //Q_GetPageByTrack(1)����ǰһҳ��ָ�� const PAGE_ATTRIBUTE *Q_GetPageByTrack(u8 Local) { return GetPageByIdx(GetPageIdxByTrack(Local)); }
//��ȡ��ǰҳ�������� u16 Q_GetPageEntries(void) { return gEntriesOfPage[GetPageIdxByTrack(0)]; }