📄 winstack.c
字号:
/*
******************************************************************
* XIAMEN YAXON NETWORK CO.LTD.
* XINXI BUILDING,HULI,XIAMEN
* (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
* All Rights Reserved
*
* FileName : WINSTACK.C
* Programmer(s): WuJingYu
* Description :
******************************************************************
*/
/*
*****************************************************************
* REVISION HISTORY
*
* Date: 2002-10-29
*****************************************************************
*/
#define WINSTACK_GLOBALS
#include "includes.h"
#include "ErrTask.H"
#include "TimeTask.H"
#include "LCD.H"
#include "UART_Drv.h"
#include "midtask.h"
#include "message.h"
#include "_keyboard.h"
#define NULLSTACK 0xFF
#define Debug_Win 0x01
static FORMSTACK FormPageStack;
static INT8U CurStack ; //CurStack=0表示有一个窗体在堆栈中
static TMR_TSK *AutoCloseWinTmr;
static INT8U LockPage; //Destroy Form 直到释放到"LockPage-1"
void ClearLockPage(void)
{
LockPage = NULLSTACK;
}
void LockFormPage(INT8U page)
{
INT8U curdepth;
curdepth = GetFormPageDepth();
if (curdepth > page)
{
LockPage = curdepth - page;
}
}
//extern BOOLEAN LockStauts;
static void AutoCloseWinFunc(void)
{
FORMPAGE *formpage;
CurStack = FormPageStack.formcnt;
formpage = &FormPageStack.form[CurStack];
if (formpage->rettype == FORMRET_TOP)
{
ReturnSpecifiedPage(0);//返回到顶层
}
else
{
PopFormStack();
}
// if(LockStauts){
//#if Debug_Win
// PrintFromUART(1,"\nSend Lock!\n");
//#endif
// OSQPost(MidTaskMsgQue, MSG_MIDTASK_LOCK_DISP, 0, 0);
// }
}
void ResetFormStack(void)
{
FormPageStack.formcnt = NULLSTACK;
LockPage = NULLSTACK;
}
void InitFormStack(void)
{
ResetFormStack();
AutoCloseWinTmr = CreateTimer(AutoCloseWinFunc,0);
}
//压入堆栈
void PushFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
TurnOnLcdLight();
CurStack = FormPageStack.formcnt;
if (CurStack != NULLSTACK)
{
formpage = &FormPageStack.form[CurStack];
FormPageSuspendProc(formpage);//先将当前的窗体挂起
}
if (CurStack == NULLSTACK)
{
FormPageStack.formcnt = 0;
CurStack = 0;
}
else
{
CurStack++;
if (CurStack >= MAXFORMPAGE) return;
FormPageStack.formcnt++;
}
formpage = &FormPageStack.form[CurStack];
FormPageInitProc(formpage);//加载新窗体
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE))
{
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
//弹出堆栈
void PopFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
formpage = &FormPageStack.form[CurStack];
FormPageDestroyProc(formpage);//先destroy当前页面
if ((CurStack == 0) || (CurStack == NULLSTACK))
{
return;
}
else
{
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
if (LockPage != NULLSTACK)
{
while (FormPageStack.formcnt >= LockPage ) //一直destroy到LockPage-1
{
FormPageDestroyProc(formpage);
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
}
LockPage = NULLSTACK; //解锁
}
while ((formpage->formattrib == POPFORMPAGE) || (formpage->formattrib == PROMPTPAGE)
|| (formpage->formattrib == NORETPAGE)) {//此类页面无需返回
FormPageDestroyProc(formpage);
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
}
FormPageResumeProc(formpage);
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
void RefreshFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
if ((CurStack != NULLSTACK) && (CurStack < MAXFORMPAGE))
{
formpage = &FormPageStack.form[CurStack];
StopTmr(AutoCloseWinTmr);
FormPageResumeProc(formpage);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE))
{
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
//返回至当前若干个页面(formcnt-depth)
void ReturnSpecifiedPage(INT8U depth)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
if (depth >= CurStack) return;
for (;CurStack>depth;CurStack--)
{
formpage = &FormPageStack.form[CurStack];
FormPageDestroyProc(formpage);
}
if (CurStack == NULLSTACK)
{
ClearArea_Full();
LcdUpdate_Full();
StopTmr(AutoCloseWinTmr);
}
else
{
formpage = &FormPageStack.form[depth];
FormPageStack.formcnt = depth;
FormPageResumeProc(formpage);
StopTmr(AutoCloseWinTmr);
if ((depth != 0) && (formpage->lifetime != PAGELIFE_INFINITE))
{
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
//获取当前页面的深度
INT8U GetFormPageDepth(void)
{
return FormPageStack.formcnt;
}
//获取指定深度的页面
FORMPAGE *GetSpecifiedPage(INT8U depth)
{
if (depth >= MAXFORMPAGE)
{
return NULL;
}
else
{
return &FormPageStack.form[depth];
}
}
//获取一个空闲的页面指针
FORMPAGE *AllocateFormPage(void)
{
CurStack = FormPageStack.formcnt;
if (CurStack == NULLSTACK) //无页面
{
ResetFormPage(&FormPageStack.form[0]);
return &FormPageStack.form[0];
}
else if (CurStack >= MAXFORMPAGE+1)
{
// ErrExit(ERR_WINSTACK_MAXPAGE);
return NULL;
}
else
{
ResetFormPage(&FormPageStack.form[CurStack+1]);//空闲指针是CurStack+1
return &FormPageStack.form[CurStack+1];
}
}
// 获取当前页面的指针;
FORMPAGE *GetCurrentFormpage(void)
{
CurStack = FormPageStack.formcnt;
if (CurStack != NULLSTACK)
{
return &FormPageStack.form[CurStack];
}
else
{
return NULL;
}
}
//重新计lifetime并处理formpage的按键
void WinStackEntry(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;//当前栈顶空间
//PrintFromUART(1,"WinStackEntry:");
//SendFromUART_HEX(1,CurStack);
if (CurStack == NULLSTACK)
{
return;
}
else if (CurStack >= MAXFORMPAGE)
{
// ErrExit(ERR_WINSTACK_MAXPAGE);
return;
}
formpage = &FormPageStack.form[CurStack];//CurStack和数组下标是匹配的
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE))
{
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
FormPageHdlKeyProc(formpage);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -