⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winstack.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -