Exemplo n.º 1
0
//将一个页面从当前页面切换为非当前页面时调用的函数
//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;
}
Exemplo n.º 2
0
//ͨ��ҳ��������ҳ���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;
}
Exemplo n.º 3
0
//通过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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
//�õ�ָ�����ҳ��ָ��
//LayerNum=1,�õ�����
//LayerNum=2,�õ��ڶ���
const PAGE_ATTRIBUTE *Q_GetPageByLayer(u8 LayerNum)
{
	return GetPageByIdx(GetPageIdxByLayer(LayerNum));
}
Exemplo n.º 6
0
//LayerOffset=0,���ص�ǰҳ��ָ��
//LayerOffset=1,������һ��ҳ��ָ��
const PAGE_ATTRIBUTE *Q_GetPageByLayerOffset(u8 LayerOffset)
{
	return GetPageByIdx(GetPageIdxByLayerOffset(LayerOffset));
}
Exemplo n.º 7
0
//ָ����Ե�ǰҳ��ĺۼ�ƫ��ֵ������ҳ��ָ��
//��GetPageByTrack(0)���ص�ǰҳ��ָ��
//Q_GetPageByTrack(1)����ǰһҳ��ָ��
const PAGE_ATTRIBUTE *Q_GetPageByTrack(u8 Local)
{
	return GetPageByIdx(GetPageIdxByTrack(Local));
}
Exemplo n.º 8
0
//ת��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;
		}
	}	
}